分析内存时使用哪个GC?

时间:2011-03-14 17:45:49

标签: java memory-leaks garbage-collection profiling visualvm

我使用NetBeans探查器(实际上是嵌入式VisualVM)来监视Java应用程序的内存消耗。我使用视图,幸存的生成视图和内存转储来跟踪内存泄漏。

堆视图显示已用内存的总量,但由于垃圾收集器管理内存的方式,它有点混乱。该图基本上是锯齿形的,因此不是特别可读的。有时,我会强制GC发生,这样我就可以获得更精确的实际内存消耗值。

我想知道:是否有一个更适合内存分析的垃圾收集器,它会产生更接近实际内存使用情况的堆图?或者更一般地说,我可以使用哪些JVM设置(-XX选项或其他)来有效跟踪内存泄漏?

example heap graph

2 个答案:

答案 0 :(得分:4)

您在图表中看到的内容应用程序内存利用率的真实行为。重复的锯齿模式可能是由于正在清除的短寿命物体的分配。如果您认为存在内存泄漏,请使用堆转储快照并查看堆中保留的对象。您可以使用JConsole拍摄快照,然后使用HPjmeter打开生成的转储文件。

答案 1 :(得分:1)

我建议您在没有探查器的情况下使用您打算使用的GC。使用这种方法,您将获得一个更像应用程序行为方式的图表,但并不总是可读。

如果您想要一个更易读但不那么逼真的图形,您可以将最小内存大小增加到1 GB。这将导致更少的GC和更少的spikey图形,但除了使图形更漂亮外,可能无法帮助您。