3

我已经更改了运行 java 应用程序的 vm 上的内核数(从 16 减半到 8)。

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

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

任何人都可以对此有所了解吗?

4

3 回答 3

2

有可能的。默认情况下,GC 的调整方式因 JVM 和版本而异,这就是为什么您可能无法获得太多关于其工作原理的详细文档的原因。

您可以为您正在使用的同一 JVM 构建下载 OpenJDK,并阅读源代码以了解它的作用。

于 2013-04-11T11:35:35.533 回答
0

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

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

有两个 JVM 选项可以使这个选择更具确定性。

  • -XX:+AlwaysActAsServerClassMachine
  • -XX:+NeverActAsServerClassMachine
于 2013-04-11T15:06:40.333 回答
0

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

根据您使用的 GC 和您设置的 JVM 选项,Hotspot 可能会动态调整生成的大小,以便 GC 周期花费更少的时间 ( -XX:+UseAdaptiveSizePolicy)。这是 JVM 用于使您的应用程序更快的优化之一。

想知道为什么 JVM 会像这样调整内存池的大小是一件好事,但是如果没有任何问题要解决,就很难走得更远;-)

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

于 2013-04-14T17:54:21.017 回答