所有
我有一个Java内存进程,随着时间的推移开始占用越来越多的内存。为了在堆空间使用上设置一个Cap,我将-Xmx选项设置为512M。在一段时间内,进程内存使用率慢慢达到2GB。
我使用MAT和YOURKIT等各种工具分析了可能的内存泄漏代码,发现Java代码中没有这样的泄漏。该代码还使用了一个看起来无泄漏的One Native功能。
我有以下问题:
感谢您的回答。
答案 0 :(得分:5)
您如何衡量内存使用情况?
通常有3种内存使用方式:
虚拟内存大小可能比您使用-Xmx指定的大(几GB),但这不会造成任何伤害。 RES加SHR是你应该看的。
除了堆之外,还有另一类不受-Xmx(permgen)影响的内存使用。但通常上限为几MB。您可能需要阅读HotSpot GC Tuning Guide。
答案 1 :(得分:1)
让我用完整的“回应”来增加我的“评论”。
如果你正在进行大量的字符串操作,那么你肯定不使用“String”类。无论发生什么,Java都有许多优秀的工具(包括但不限于JConsole),可让您智能地分析问题。你的两个新BFFs应该是:
StringBuilder(有效操纵字符串)和
JConsole(研究程序的行为;包括堆分配和垃圾回收)。
并且,正如user643011正确指出的那样,还有很多其他的东西可能会被“泄漏”:包括没有关闭的文件,使用大量堆栈空间的大量线程等等。
这是另一个好的链接:
答案 2 :(得分:1)
如果您怀疑Java应用程序中存在内存泄漏,那么一定要尝试Plumbr。它非常好,可以发现它们并提供非常有用的报告。