我在我的应用程序中看到大量年轻代垃圾收集。这是一个在 openJDK 8u212 上运行的 scala 应用程序。我对正在运行的 docker 容器执行了 jstat,它显示 S0C 区域的大小为零。这可以解释为什么我会得到这么多年轻的 GC,但我不知道为什么会发生这种情况。
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
0.0 2048.0 0.0 2048.0 36864.0 31744.0 706560.0 644022.6 93360.0 82013.4 11184.0 9627.5 15299 126.920 0 0.000 126.920
关于如何进一步调查这个问题有什么想法吗?这些是我的 JVM_OPTS。
"-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/mnt/mesos/sandbox/ -Xmx3g -XX:+UseG1GC -XX:+UseStringDeduplication
我找不到任何可用于控制 S0C 大小的 JVM 选项。
最佳答案
当eden空间满时,触发次要垃圾回收(由eden空间和survivor空间组成)。当触发次要垃圾收集时,未引用的对象(Eden 和 Survivor 中的)将被删除,引用的对象年龄会增加,引用的对象将移动到其他 Survivor 空间。伊甸园和幸存者空间被清除。这个循环一直持续到老化的对象达到一定的年龄阈值。当对象达到一定的年龄阈值时,它们就会从年轻代提升到老年代。 正如霍尔格所说,两个幸存者空间之一永远不能包含对象。
引用文献:
关于java - JVM:为什么我的 S0C 区域的大小为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60657557/