我已经改变了运行Java应用程序的虚拟机的核心数量(从16个减少到8个)。
堆大小的参数没有变化,但由于某种原因,年轻代空间正在减少,这是我无法确定的。
我们在不设置NewRatio的情况下运行,因此默认值应该与以前相同,除非在确定年轻代空间大小时考虑了核心数。我看到很少有关年轻代空间/新比率的默认大小的文档表明核心数是一个决定性因素,但由于没有进行其他更改,这似乎是正确的。
谁能给出一些解释?
我已经改变了运行Java应用程序的虚拟机的核心数量(从16个减少到8个)。
堆大小的参数没有变化,但由于某种原因,年轻代空间正在减少,这是我无法确定的。
我们在不设置NewRatio的情况下运行,因此默认值应该与以前相同,除非在确定年轻代空间大小时考虑了核心数。我看到很少有关年轻代空间/新比率的默认大小的文档表明核心数是一个决定性因素,但由于没有进行其他更改,这似乎是正确的。
谁能给出一些解释?
这是可能的。GC的默认调整方式因JVM和版本而异,这就是为什么你可能无法获得有关其工作细节的详细文档。
你可以下载与你使用的同一JVM版本构建的OpenJDK,并阅读源代码以了解它的工作原理。
HotSpot JVM具有内置的启发式规则来分类硬件为服务器或客户端类。 这两个类具有不同的默认值(有时非常不同)。
可用的内核数量和可用内存是JVM用于猜测硬件类别的参数之一。
有两个JVM选项可以使此选择更具决定性。
-XX:+ AlwaysActAsServerClassMachine
-XX:+ NeverActAsServerClassMachine
我认为你不需要担心代的大小,除非它导致严重的性能问题。
根据你使用的GC和设置的JVM选项,Hotspot可能会动态地适应代的大小,以使GC循环时间更短(-XX:+UseAdaptiveSizePolicy
)。这是JVM应用于加速你的应用程序的优化之一。
好奇JVM为什么要调整内存池的大小是一个好事情,但如果没有问题需要解决,那就很难进一步深入了解。
你应该启用GC日志(-X:loggc:gc.log -XX:+PrintGCDetails
),比较16个核/8个核的内存消耗模式,看看是否存在问题。如果你的应用程序不慢,也没有内存消耗问题,那么可以说这些新的内存池只是JVM的一种优化。