visualvm监视内存使用情况

时间:2010-10-26 04:45:20

标签: java memory-leaks visualvm

在我的tomcat启动中,我将-xms,-xmx设置为1GB。当我监视内存时,在visualvm内部

  1. 当我对内存进行采样时,它并没有显示准​​确的内存使用情况,直到我按下“快照”,然后使用内存显示正确模式和实例的java类计数。为什么这样?

  2. 同样,因为我将tomcat内存设置为1gb,内存继续增加zip-zat并上升aroudn 960mb。直到我按下“执行gc”并将记忆恢复到200mb ..

  3. 您是否认为需要创建调度程序以强制在jvm上执行perform.gc(),这是在午夜时分?

  4. 我的描述中的任何评论

    VisualVM screenshot

1 个答案:

答案 0 :(得分:1)

我相信你在这里看到的是并发垃圾收集器正在进行年轻一代的清理工作,但堆不断搅拌,因此它无法获得旧代集合的所有引用。当你点击执行GC按钮时,你正在做一个“停止世界”的集合,它阻止所有线程,冻结堆,并允许更大的集合发生。我的主要关注点是 - 是否会发生大量收集(x小时后)?您是否在较小的堆中看到OutOfMemory错误?

1)您是否打开了自动刷新按钮?也可能是在拍摄快照之前,探查器会执行小型GC(Eden空间)。

2)这是完全正常的。垃圾收集需要时间和资源(处理器周期)。如果您将堆设置为较大的大小,它将等到它达到一定百分比,直到触发垃圾收集本身。我认为默认的可用空间与活动对象的比例在40%到70%之间我知道tomcat专门改变了它在第5版周围进行垃圾收集的方式,tomcat v4有性能问题,因为它花了很多时间运行垃圾收集器。你可能想在这里做一些研究,看看tomcat是否有自定义垃圾收集选项。

3)没有。几乎完整的堆正是你正在努力的目标。使堆更小可能是有意义的,这样完整的垃圾收集不会花费这么长时间。它是在大量垃圾收集(暂停)和冗长的垃圾收集(长时间暂停)之间进行权衡。每个应用程序都不同,所以我通常从默认值开始,并根据需要进行调整。如果您有兴趣,垃圾收集(和备用收集器)有很多选项。

Java 5

Java 6 FAQWhitepaper