繁体   English   中英

Java Process占用越来越多的内存

[英]Java Process taking more and more memory

所有,

我有一个Java内存进程,随着时间的流逝,它开始占用越来越多的内存。 为了限制堆空间的使用,我将-Xmx选项设置为512M。 在一段时间内,进程内存使用量逐渐达到2GB。

我已经使用MAT和YOURKIT等各种工具分析了代码可能的内存泄漏,并且在Java代码中没有发现此类可能的内存泄漏。 该代码还利用了看起来没有泄漏的One Native函数。

我有以下问题:

  1. 是否可能导致Java进程可以使用的总内存上限?
  2. 除了Heap,JVM的其他内存使用还有哪些?
  3. Linux是否可以在Windows的“工作集”内存模型上工作,当进程进入后台时会释放它的内存。
  4. 即使在将-Xmx选项与512M结合使用之后,如果堆使用率增加,JVM也不应抛出“内存不足”。 这使我怀疑内存是由堆空间以外的其他东西泄漏的。 从内存转储中,似乎堆内存没有增加。

感谢您的回答。

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

通常有3种内存使用情况:

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

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

除了堆之外,还有一类不受-Xmx(permgen)影响的内存使用情况。 但这通常上限为几MB。 您可能需要阅读《 HotSpot GC优化指南》

让我用完整的“响应”来增强我的“评论”。

如果您要进行大量的字符串操作,则绝对不应使用“ String”类。 无论发生什么情况,Java都有许多出色的工具(包括但不限于JConsole)可让您智能地分析问题。 您的两个新BFF应该是:

  • StringBuilder (有效地处理字符串)和

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

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

这是另一个很好的链接:

如果您怀疑Java应用程序中发生内存泄漏,则绝对应该尝试Plumbr 很不错,可以发现它们并给出非常有用的报告。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM