当我使用以下配置在Hotspot VM上运行Java应用程序时:
-Xms2048m,-Xmx2048m,jmap输出:
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 2147483648 (2048.0MB)
NewSize = 1310720 (1.25MB)
MaxNewSize = 17592186044415 MB
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 85983232 (82.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 706740224 (674.0MB)
used = 364788568 (347.88948822021484MB)
free = 341951656 (326.11051177978516MB)
51.61565107124849% used
From Space:
capacity = 4587520 (4.375MB)
used = 1900560 (1.8125152587890625MB)
free = 2686960 (2.5624847412109375MB)
41.428920200892854% used
To Space:
capacity = 4456448 (4.25MB)
used = 0 (0.0MB)
free = 4456448 (4.25MB)
0.0% used
...
让我感到困惑的是为什么伊甸园空间和两个幸存者空间的容量不遵循公式
eden/(s0+s1) = SurvivorRatio
但是当我添加另一个jvm选项-Xmn500m时,jmap输出似乎合理,即容量严格遵守公式
最佳答案
我希望这会引起更多关注……的确,您是对的(这不是答案,但是评论太久了)
当我做:
java -XX:+PrintFlagsFinal | grep SurvivorRatio
uintx InitialSurvivorRatio = 8
显然这是8。但是在测试时,它的行为更像是6(我无法重现您在jdk-8中看到的巨大差异)。
这是与-Xmx2048m -Xms2048m一起运行时的相关部分
PS Young Generation
Eden Space:
capacity = 537395200 (512.5MB)
....
From Space:
capacity = 89128960 (85.0MB)
....
To Space:
capacity = 89128960 (85.0MB)
那是:
512/85 = 6
一旦我使用相同的-Xmx2048m -Xms2048m运行了相同的代码,但要添加默认值:-XX:SurvivorRatio = 8;输出为:
PS Young Generation
Eden Space:
capacity = 573046784 (546.5MB)
....
From Space:
capacity = 71303168 (68.0MB)
....
To Space:
capacity = 71303168 (68.0MB)
546.5 / 68 = 8。
对-Xmn的设置也是如此。这很奇怪!我尚未更改
SurvivorRatio
的值-仍与默认值相同8。似乎在内部,有一些检查是否设置了与
SurvivorRatio
的计算有关的标志,并应用了不同的策略(我希望我知道这些的内在特性,但没有运气)。和男孩!我试图找到这些吗?我确实发现了一些暗示这一点的东西,但并没有直接给出答案,例如this或this(尤其是评论)。我做了:
grep -R "SurvivorRatio" .
在本地的
hotspot
源中,仍然没有提示正在发生的所有结果。我目前唯一的逻辑解释是,除非指定了与
SurvivorRatio
相关的任何参数;否则,请参见参考。将选择默认值(不一定是java -XX:+PrintFlagsFinal
报告的默认值),而是中间的某个值,接近该值。如果是这种情况,则应在文档中明确指定;否则,在我的世界中,这是一个很小的文档错误。