Jvm 新一代和老一代的比例是错误的?

Jvm 新一代和老一代的比例是错误的?,jvm,Jvm,当我使用jmap命令时,我发现年轻一代与老一代的比例不是默认的1:2。 为什么? JVM选项: -Xms2048m-Xmx2048m-XX:MaxPermSize=256m jmap-heap命令的结果: using parallel threads in the new generation. using thread-local object allocation. Concurrent Mark-Sweep GC Heap Configuration: MinHeapFreeRati

当我使用jmap命令时,我发现年轻一代与老一代的比例不是默认的1:2。 为什么?
JVM选项:
-Xms2048m-Xmx2048m-XX:MaxPermSize=256m

jmap-heap命令的结果:

using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC
Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 2147483648 (2048.0MB)
   NewSize                  = 174456832 (166.375MB)
   MaxNewSize               = 174456832 (166.375MB)
   OldSize                  = 1973026816 (1881.625MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 157024256 (149.75MB)
   used     = 127334032 (121.43519592285156MB)
   free     = 29690224 (28.314804077148438MB)
   81.09195053278903% used
Eden Space:
   capacity = 139591680 (133.125MB)
   used     = 122114984 (116.45792388916016MB)
   free     = 17476696 (16.667076110839844MB)
   87.48013062096537% used
From Space:
   capacity = 17432576 (16.625MB)
   used     = 5219048 (4.977272033691406MB)
   free     = 12213528 (11.647727966308594MB)
   29.938478398143797% used
To Space:
   capacity = 17432576 (16.625MB)
   used     = 0 (0.0MB)
   free     = 17432576 (16.625MB)
   0.0% used
concurrent mark-sweep generation:
   capacity = 1973026816 (1881.625MB)
   used     = 914168160 (871.8186950683594MB)
   free     = 1058858656 (1009.8063049316406MB)
   46.33328612600063% used```
年轻一代与老一代的比例不是默认的1:2

没有这样的违约。默认设置是允许JVM以符合人体工程学的方式调整堆大小,除非某些参数被命令行选项覆盖

如果显式设置
-XX:NewRatio=2
,则新一代的大小实际上是旧一代的1/2

旁注:

  • -XX:MaxPermSize=256m
    没有意义。自JDK 8以来没有PermGen
  • 您没有提到
    -XX:+UseConMarkSweepGC
    选项,但jmap输出表明已选择CMS GC

老一代与新一代的比率为1881.625MB/166.375MB≈11我错误地认为它与并发标记扫描无关,所以我没有提到
-XX:+UseConcMarkSweepGC
。您说过默认设置是允许JVM以符合人体工程学的方式调整堆大小。这与ConcMarkSweepGC有关吗?@learninJava GC算法的人体工程学不同。JVM版本之间也存在差异,包括次要更新。经验法则是——如果不显式地设置某个值,JVM将自行选择该值,而选择可能取决于许多不明显的因素。