Java JVM:为什么我的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

我在应用程序中看到了大量年轻一代的垃圾收集。这是一个在openJDK 8u212上运行的scala应用程序。我在运行的docker容器上做了一个jstat,它显示S0C区域的大小为零。这可以解释为什么我会变得如此年轻,但我不知道为什么会发生这种情况

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空间。伊甸园和幸存者空间被清除。此循环将继续,直到老化对象达到某个老化阈值。当对象达到某个年龄阈值时,会从年轻一代升级到老一代正如霍尔格所说,两个幸存者空间中的一个永远不能包含对象。

参考资料:


当伊甸园空间满时,您会得到一个年轻的GC。幸存者空间可能会因为GC而被填满,而不是相反。由于每次GC之间,两个幸存空间中的一个永远不能包含对象,所以报告它的容量为零是正确的。对于G1GC,这些空间在内存中不是固定的。G1GC将堆划分为多个区域,根据需要将这些区域分配给一个逻辑空间。因此,始终为空的存活者空间实际上与实际内存区域无关。您使用的java版本是什么(
UseCGroupMemoryLimitForHeap
已被弃用)以及确切的
GC
?这在一个恰当和完整的回答中很重要,所以在任何时候,只有一个幸存者空间被填充?这是有道理的。在我的jstat结果中你没有看到的是,因为它只有一行,两个幸存者空间正在切换。我希望当伊甸园满了,其他幸存者的空间应该在小GC之后被填充。相反,我看到的是一个完全填充的伊甸园和S1C,没有切换——尽管我每秒记录了大量的次要GC。@suleydaman旧GC算法确实有固定的内存区域与任一幸存者空间关联,切换对他们有意义。由于G1GC动态分配内存区域,因此切换不再有意义。只有一个幸存者空间和以前分配给幸存者空间的未使用区域。