Java堆 - 更改核心数后的Young空间发生了变化

3

我已经改变了运行Java应用程序的虚拟机的核心数量(从16个减少到8个)。

堆大小的参数没有变化,但由于某种原因,年轻代空间正在减少,这是我无法确定的。

我们在不设置NewRatio的情况下运行,因此默认值应该与以前相同,除非在确定年轻代空间大小时考虑了核心数。我看到很少有关年轻代空间/新比率的默认大小的文档表明核心数是一个决定性因素,但由于没有进行其他更改,这似乎是正确的。

谁能给出一些解释?

3个回答

2

这是可能的。GC的默认调整方式因JVM和版本而异,这就是为什么你可能无法获得有关其工作细节的详细文档。

你可以下载与你使用的同一JVM版本构建的OpenJDK,并阅读源代码以了解它的工作原理。


0

HotSpot JVM具有内置的启发式规则来分类硬件为服务器或客户端类。 这两个类具有不同的默认值(有时非常不同)。

可用的内核数量和可用内存是JVM用于猜测硬件类别的参数之一。

有两个JVM选项可以使此选择更具决定性。

  • -XX:+ AlwaysActAsServerClassMachine
  • -XX:+ NeverActAsServerClassMachine

我们正在使用HotSpot JVM。我在文档中没有找到硬件类别是如何确定以及如何影响年轻代空间大小的信息。 - goodFeather
这并没有明确的文档说明。Oracle的JVM发行版与OpenJDK非常接近,因此唯一可靠的方法是参考OpenJDK代码库。 - Alexey Ragozin
源代码:http://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/hotspot/share/runtime/os.cpp#l1665 - Franck
甲骨文的JVM发行版与OpenJDK非常接近...更正:至少对于最近的版本来说,它们是完全相同的。 - Stephen C

0

我认为你不需要担心代的大小,除非它导致严重的性能问题。

根据你使用的GC和设置的JVM选项,Hotspot可能会动态地适应代的大小,以使GC循环时间更短(-XX:+UseAdaptiveSizePolicy)。这是JVM应用于加速你的应用程序的优化之一。

好奇JVM为什么要调整内存池的大小是一个好事情,但如果没有问题需要解决,那就很难进一步深入了解。

你应该启用GC日志(-X:loggc:gc.log -XX:+PrintGCDetails),比较16个核/8个核的内存消耗模式,看看是否存在问题。如果你的应用程序不慢,也没有内存消耗问题,那么可以说这些新的内存池只是JVM的一种优化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接