0

全部,

我有一个 Java 内存进程,它随着时间的推移开始占用越来越多的内存。为了设置堆空间使用上限,我将 -Xmx 选项设置为 512M。慢慢地过了一段时间Process内存使用量达到了2GB。

我已经使用 MAT 和 YOURKIT 等各种工具分析了代码中可能存在的内存泄漏,并发现 Java 代码中没有这种可能的泄漏。该代码还使用了一个看起来无泄漏的本机函数。

我有以下问题:

  1. 是否有可能对 Java 进程可以使用的总内存设置上限?
  2. 除了 Heap 之外,JVM 的其他内存使用是什么?
  3. Linux 是否在 Windows 的“工作集”内存模型上工作,其中一个进程在进入后台时会释放它的内存。
  4. 即使在使用带有 512M 的 -Xmx 选项后,如果堆使用量增加,JVM 也不应该抛出“内存不足”。这让我怀疑除了堆空间之外的其他东西正在泄漏内存。从内存转储看来,堆内存没有增加。

感谢你的回答。

4

3 回答 3

5

您如何测量内存使用情况?

通常有3种内存使用:

  • VIRT -- 虚拟内存大小 (KiB) 任务使用的虚拟内存总量。它包括所有代码、数据和共享库以及已换出的页面和已映射但未使用的页面。
  • RES -- 驻留内存大小 (KiB) 任务已使用的非交换物理内存。
  • SHR——共享内存大小 (KiB) 它只是反映可能与其他进程共享的内存。

虚拟内存大小可以变得比您使用 -Xmx 指定的更大(几 GB),但这不会造成任何损害。RES 加 SHR 是您应该关注的。

除了堆之外,还有另一类内存使用不受 -Xmx (permgen) 的影响。但这通常以几 MB 为上限。您可能想阅读HotSpot GC Tuning Guide

于 2012-09-24T07:38:11.333 回答
1

如果您怀疑您的 java 应用程序中存在内存泄漏,您绝对应该尝试Plumbr。它非常好,可以发现它们并提供非常有用的报告。

于 2012-10-01T13:02:39.833 回答
1

让我用一个成熟的“回应”来补充我的“评论”。

如果你正在做很多字符串操作,你绝对应该使用“String”类。无论发生什么,Java 都有许多很棒的工具(包括但不限于 JConsole),可以让您智能地分析问题。你的两个新BFF应该是:

  • StringBuilder (有效地操作字符串)和

  • JConsole(研究程序的行为;包括堆分配和垃圾回收)。

而且,正如 user643011 正确指出的那样,还有许多其他可能会“泄漏”的事情:包括文件未关闭、大量线程使用大量堆栈空间等。

这是另一个很好的链接:

于 2012-09-24T19:59:52.853 回答