【发布时间】:2025-12-17 01:50:01
【问题描述】:
全部,
我有一个 Java 内存进程,随着时间的推移它开始占用越来越多的内存。为了设置堆空间使用上限,我将 -Xmx 选项设置为 512M。慢慢地过了一段时间Process内存占用达到了2GB。
我已经使用 MAT 和 YOURKIT 等各种工具分析了代码中可能存在的内存泄漏,并发现 Java 代码中没有这种可能的泄漏。该代码还使用了一个看起来无泄漏的 Native 函数。
我有以下问题:
- 是否可以对 Java 进程可以使用的总内存设置上限?
- 除了 Heap 之外,JVM 的其他内存使用情况是什么?
- Linux 是否在 Windows 的“工作集”内存模型上工作,其中进程在进入后台时会释放其内存。
- 即使在使用带有 512M 的 -Xmx 选项后,如果堆使用量增加,JVM 也不应该抛出“内存不足”。这让我怀疑内存正在被堆空间之外的其他东西泄漏。从内存转储来看,堆内存似乎没有增加。
感谢您的回答。
【问题讨论】:
-
强烈建议:熟悉 JConsole 工具(或您的 JVM 的等效工具),看看它是否可以阐明正在发生的事情:docs.oracle.com/javase/1.5.0/docs/guide/management/…
-
您是否对字符串使用了很多操作?当您修改 String 时,会创建一个新对象(StringBuffer 不是这样)。旧的不会立即销毁。 jvm 让他呆一段时间,因为你可能会再次需要它。
-
当前的 Java 版本会在后台为您自动生成 StringBuilders 用于字符串连接。尽可能选择 StringBuilders(非同步)而不是 StringBuffers!
-
Perello :是的,我使用了很多字符串,堆中有一堆未收集的字符串。问题是如果我对堆大小有上限,为什么进程占用越来越多的内存。为什么它不执行 OutOfMemory 并停止。我强烈感觉到堆以外的东西正在占用内存。
标签: java linux memory-management memory-leaks process