0

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

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

  2. 此外,当我将 tomcat 内存设置为 1gb 时,内存不断增加 zip-zat 并上升 960mb 左右。直到我按“执行gc”并将内存恢复到200mb ..

  3. 你认为需要创建调度程序来强制在 jvm 上命中 perform.gc(),每天午夜?

我的描述中的任何评论

VisualVM 屏幕截图

4

1 回答 1

1

我相信你在这里看到的是并发垃圾收集器正在清理年轻代,但堆不断搅动,因此它无法获取老年代收集的所有引用。当您点击执行 GC 按钮时,您正在执行“stop-the-world”收集,它会阻塞所有线程、冻结堆并允许发生更大的收集。我主要担心的是 - 是否会发生大量收集(x 小时后)?您是否看到堆较小的 OutOfMemory 错误?

1)您是否打开了自动刷新按钮?也可能是分析器在拍摄快照之前进行了一次小型 GC(伊甸园空间)。

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

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

爪哇 5

Java 6常见问题解答白皮书

于 2010-10-26T12:09:26.613 回答