Java进程占用越来越多的内存

时间:2012-09-24 07:31:24

标签: java linux memory-management memory-leaks process

所有

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

我使用MAT和YOURKIT等各种工具分析了可能的内存泄漏代码,发现Java代码中没有这样的泄漏。该代码还使用了一个看起来无泄漏的One Native功能。

我有以下问题:

  1. 是否有可能导致Java Process可以使用的总内存上限?
  2. 除了堆之外,JVM的其他内存使用是什么?
  3. Linux是否适用于Windows的“工作集”内存模型,其中进入后台的进程会释放内存。
  4. 即使在512M上使用-Xmx选项后,如果堆使用量增加,JVM也不会抛出“Out of memory”。这让我怀疑除了Heap空间以外的其他东西泄漏了内存。从内存转储看来,堆内存似乎没有增加。
  5. 感谢您的回答。

3 个答案:

答案 0 :(得分:5)

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

通常有3种内存使用方式:

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

虚拟内存大小可能比您使用-Xmx指定的大(几GB),但这不会造成任何伤害。 RES加SHR是你应该看的。

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

答案 1 :(得分:1)

让我用完整的“回应”来增加我的“评论”。

如果你正在进行大量的字符串操作,那么你肯定使用“String”类。无论发生什么,Java都有许多优秀的工具(包括但不限于JConsole),可让您智能地分析问题。你的两个新BFFs应该是:

  • StringBuilder(有效操纵字符串)和

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

并且,正如user643011正确指出的那样,还有很多其他的东西可能会被“泄漏”:包括没有关闭的文件,使用大量堆栈空间的大量线程等等。

这是另一个好的链接:

答案 2 :(得分:1)

如果您怀疑Java应用程序中存在内存泄漏,那么一定要尝试Plumbr。它非常好,可以发现它们并提供非常有用的报告。