我有一个应用程序会导致大量垃圾产生。首要条件是低 GC 暂停时间。我使用 visualgc 工具(和 gc 日志)尝试使用不同的 GC 参数。最佳参数如下。
-XX:+UseConcMarkSweepGC -Xmx1172M -Xms600M -XX:+UseParNewGC -XX:NewSize=150M
我的应用运行在 Java 1.6.0_21 的 SunOS 10 上。硬件为 2 x CPU 四核 (uname -X 结果为 numCPU = 8)。
问题如下:
观察 GC 行为,新对象创建在 eden 空间中,直到 eden 空间满了。当 eden 空间满了之后,GC 运行并清除垃圾,如果对象没有死亡,则将其复制到旧代。清除旧代空间时,一些 CMS 阶段是停止全局的 (暂停时间)。这是一个循环。
1.以上场景是否正确? 2.GC 清理老年代空间后,可能没有足够的空间扩展老年代空间吗?(XMS 和 XMS 值不同) 3.完整的 GC 操作是什么时候开始的?如何确定? 4.CMS-concurrent 阶段持续时间取决于 Eden 空间大小,实际上我的期望是,Eden 空间对 CMS-concurrent 阶段持续时间没有影响。在 CMS-concurrent 阶段中与 eden 空间有关的 GC 是什么? 5.还有什么建议可以帮助我最小化暂停时间?确实,对我来说最有价值的答案:)
谢谢
-XX:+UseConcMarkSweepGC -Xmx1172M -Xms600M -XX:+UseParNewGC -XX:NewSize=150M
我的应用运行在 Java 1.6.0_21 的 SunOS 10 上。硬件为 2 x CPU 四核 (uname -X 结果为 numCPU = 8)。
问题如下:
观察 GC 行为,新对象创建在 eden 空间中,直到 eden 空间满了。当 eden 空间满了之后,GC 运行并清除垃圾,如果对象没有死亡,则将其复制到旧代。清除旧代空间时,一些 CMS 阶段是停止全局的 (暂停时间)。这是一个循环。
1.以上场景是否正确? 2.GC 清理老年代空间后,可能没有足够的空间扩展老年代空间吗?(XMS 和 XMS 值不同) 3.完整的 GC 操作是什么时候开始的?如何确定? 4.CMS-concurrent 阶段持续时间取决于 Eden 空间大小,实际上我的期望是,Eden 空间对 CMS-concurrent 阶段持续时间没有影响。在 CMS-concurrent 阶段中与 eden 空间有关的 GC 是什么? 5.还有什么建议可以帮助我最小化暂停时间?确实,对我来说最有价值的答案:)
谢谢
ParallelCMSThreads
来设置线程数,解释在这里。 - Matt