我相信你在这里看到的是并发垃圾收集器正在清理年轻代,但堆不断搅动,因此它无法获取老年代收集的所有引用。当您点击执行 GC 按钮时,您正在执行“stop-the-world”收集,它会阻塞所有线程、冻结堆并允许发生更大的收集。我主要担心的是 - 是否会发生大量收集(x 小时后)?您是否看到堆较小的 OutOfMemory 错误?
1)您是否打开了自动刷新按钮?也可能是分析器在拍摄快照之前进行了一次小型 GC(伊甸园空间)。
2)这是完全正常的。垃圾收集需要时间和资源(处理器周期)。如果您将堆设置为较大的大小,它会一直等到达到某个百分比,直到触发垃圾收集本身。我认为默认的可用空间与活动对象的比率在 40% 到 70% 之间。我知道 tomcat 专门改变了它在版本 5 左右进行垃圾收集的方式,tomcat v4 存在性能问题,因为它花费了大量时间运行垃圾收集器。你可能想在这里做一些研究,看看tomcat是否有自定义垃圾收集选项。
3) 不。几乎完整的堆正是您所追求的。使堆更小可能是有意义的,这样完整的垃圾收集就不会花费这么长时间。这是大量垃圾收集(暂停)和长时间垃圾收集(长时间暂停)之间的权衡。每个应用程序都是不同的,所以我通常从默认值开始,并根据需要进行调整。如果您有兴趣,有很多垃圾收集(和备用收集器)选项。
爪哇 5
Java 6常见问题解答,白皮书