我们服务器的 JVM 标志(内存)如下所示
-Xms2048m
-Xmx2048m
-Xss512k
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:NewSize=128m
-XX:MaxNewSize=128m
-XX:PermSize=128m
-XX:MaxPermSize=128m
-XX:+HeapDumpOnOutOfMemoryError
我需要找出 Old GC 的确切触发时间,即它是否与已使用的总堆内存百分比有关?
我做了一些负载很大的测试,并使用 visualVM 和 jstat 监控应用程序。但是当实际触发旧 gc 时,我找不到任何模式。有时当 oldgen 仅使用 27.13 % 然后是 76.02 %、92.61 % 等时触发 gc。
有人可以给出一些关于实际触发旧 gc 的提示吗?
我需要找出触发旧 gc 的内存阈值。有了这个,我可以在服务器中设置一些高内存警报警告(正确的设置排除了任何要触发的错误警报)?
这篇文章说 gc 将在旧 gc 使用率默认为 70% 时触发。但在这种情况下似乎不起作用。 How full does the old generation have to be to trigger a major GC cycle?
最佳答案
您链接的另一个问题已经提供了答案:如果您通过 UseCMSInitiatingOccupancyOnly
显式配置它,则并发循环由堆占用触发。和 CMSInitiatingOccupancyFraction
选项。
否则,JVM 会使用启发式方法,根据先前收集的执行情况不断调整运行时的阈值。
关于java - CMS Old GC触发的阈值是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33557644/