Java JVM:为什么我的S0C区域的大小为零?
我在应用程序中看到了大量年轻一代的垃圾收集。这是一个在openJDK 8u212上运行的scala应用程序。我在运行的docker容器上做了一个jstat,它显示S0C区域的大小为零。这可以解释为什么我会变得如此年轻,但我不知道为什么会发生这种情况Java JVM:为什么我的S0C区域的大小为零?,java,scala,garbage-collection,jvm,Java,Scala,Garbage Collection,Jvm,我在应用程序中看到了大量年轻一代的垃圾收集。这是一个在openJDK 8u212上运行的scala应用程序。我在运行的docker容器上做了一个jstat,它显示S0C区域的大小为零。这可以解释为什么我会变得如此年轻,但我不知道为什么会发生这种情况 S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT
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选项
"-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/mnt/mesos/sandbox/ -Xmx3g -XX:+UseG1GC -XX:+UseStringDeduplication
我找不到任何可以用来控制S0C大小的JVM选项。当eden空间已满时,会触发较小的垃圾收集(由eden和幸存者空间组成)。当触发次要垃圾回收时,未引用的对象(在Eden和survivor中)将被删除,被引用对象的年龄将增加,被引用对象将移动到其他survivor空间。伊甸园和幸存者空间被清除。此循环将继续,直到老化对象达到某个老化阈值。当对象达到某个年龄阈值时,会从年轻一代升级到老一代正如霍尔格所说,两个幸存者空间中的一个永远不能包含对象。 参考资料:
UseCGroupMemoryLimitForHeap
已被弃用)以及确切的GC
?这在一个恰当和完整的回答中很重要,所以在任何时候,只有一个幸存者空间被填充?这是有道理的。在我的jstat结果中你没有看到的是,因为它只有一行,两个幸存者空间正在切换。我希望当伊甸园满了,其他幸存者的空间应该在小GC之后被填充。相反,我看到的是一个完全填充的伊甸园和S1C,没有切换——尽管我每秒记录了大量的次要GC。@suleydaman旧GC算法确实有固定的内存区域与任一幸存者空间关联,切换对他们有意义。由于G1GC动态分配内存区域,因此切换不再有意义。只有一个幸存者空间和以前分配给幸存者空间的未使用区域。