SurvivorRatio参数控制两个幸存者空间的大小。例如,-XX:SurvivorRatio = 6将每个幸存者空间和伊甸园之间的比率设置为1:6,每个幸存者空间将是年轻一代的八分之一。
为什么幸存者和伊甸园的空间容量与SurvivorRatio不符,如下所示?由jmap -heap 15760
生成。
Attaching to process ID 15760, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.80-b11
using thread-local object allocation.
Parallel GC with 8 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 4294967296 (4096.0MB)
NewSize = 1310720 (1.25MB)
MaxNewSize = 17592186044415 MB
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 1073741824 (1024.0MB)
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 1074266112 (1024.5MB)
used = 276841328 (264.01646423339844MB)
free = 797424784 (760.4835357666016MB)
25.770274693352704% used
From Space:
capacity = 178782208 (170.5MB)
used = 56996280 (54.35588836669922MB)
free = 121785928 (116.14411163330078MB)
31.880286432081654% used
To Space:
capacity = 178782208 (170.5MB)
used = 0 (0.0MB)
free = 178782208 (170.5MB)
0.0% used
PS Old Generation
capacity = 2863661056 (2731.0MB)
used = 98320 (0.0937652587890625MB)
free = 2863562736 (2730.906234741211MB)
0.003433367220397748% used
PS Perm Generation
capacity = 47710208 (45.5MB)
used = 47664440 (45.45635223388672MB)
free = 45768 (0.04364776611328125MB)
99.90407084370707% used
26132 interned Strings occupying 2933384 bytes.
答案 0 :(得分:2)
SurvivorRatio = 8
意味着每个幸存者空间占年龄一代的1/8,其大小为Eden + To + From。在你的情况下,年轻一代的大小是1365.5 MB,其中1/8将是170,69 - 假设有一些舍入(或其他一些小空间),这些值是合理的。
更新:我在这里有一些误解。你的情况下的值是有效的,空间可能还没有使用它们的最大容量。
尝试使用Xms=<value of Xmx>
运行测试。
在我的情况下(使用jdk 1.6,1.7和1.8)我使用了SurvivorRatio=10
并获得了以下结果(Java 8有一些细微差别):
Heap Configuration:
...
SurvivorRatio = 10
...
Heap Usage:
PS Young Generation
Eden Space:
capacity = 596508672 (568.875MB) //Java 8 reported 569.5 here
used = 536159440 (511.3214874267578MB)
free = 60349232 (57.55351257324219MB)
89.8829246190741% used
From Space:
capacity = 59637760 (56.875MB) //Java 8 reported 56.5 here
used = 59626360 (56.86412811279297MB)
free = 11400 (0.01087188720703125MB)
99.9808845939217% used
To Space:
capacity = 59637760 (56.875MB) //Java 8 reported 56.5 here
used = 0 (0.0MB)
free = 59637760 (56.875MB)
0.0% used
如您所见,两个幸存者空间都是伊甸园空间大小的10%。如果没有Xms=<Xmx>
,我的百分比就会降低,因为空间还没有增加。
更新2:
OP的空间显然已经获得了最大容量,年轻一代的最大容量为1365 MB(占4096 MB最大堆大小的33%)。在这种情况下,值看起来像幸存者比率为6(即每个幸存者空间占用伊甸园空间的1/8)但jmap报告比率为8表示某种错误/错误(我使用JVM版本21.0进行了测试) b17和25.40-b25,即OP的版本24.80-b11介于两者之间。)
更新3:
我用jdk 7重新进行了两次测试:
否1:没有设置SurvivorRatio
,即应使用默认值8:
Heap Configuration:
...
SurvivorRatio = 8
...
Heap Usage:
PS Young Generation
Eden Space:
capacity = 536870912 (512.0MB)
...
From Space:
capacity = 89456640 (85.3125MB)
...
To Space:
capacity = 89456640 (85.3125MB)
...
否2:明确SurvivorRatio=8
设置:
Heap Configuration:
...
SurvivorRatio = 8
...
Heap Usage:
PS Young Generation
Eden Space:
capacity = 572653568 (546.125MB)
...
From Space:
capacity = 71565312 (68.25MB)
...
To Space:
capacity = 71565312 (68.25MB)
...
正如您所看到的那样,即使两种情况都报告值为8,也存在差异。仅将比率明确设置为8的第二种情况符合文档中提供的等式,该等式在默认情况下指示使用了一些其他比率并且jmap报告错误比率或实际大小计算使用不同值/式。
根据值,公式如下所示:
size(survior space) = size(eden space)/survivorRatio
(例如:546.125 / 8 = 68.25
- 见测试2)size(survior space) = size(young generation)/survivorRatio
(例如:682 / 8 = 85.25
- 请参阅测试1,值稍微舍入一点)注意:对于jdk 1.8也是如此。
答案 1 :(得分:2)
似乎在某个时候计算伊甸园/幸存者空间大小的公式发生了变化。
见https://searchcode.com/codesearch/view/17980811/,第52至54行:
幸存者比率是以“原始”计算的,与默认的gc不同,后者在比率值上加2。在使用它们之前,我们需要确保这些值是有效的。
答案 2 :(得分:1)
你的伊甸园幸存者比例是6:1,因为有两名幸存者,幸存者与年轻人的比例是1/8
Eden的容量为1024.5 MB,1024.5 / 6 = 107.75,非常接近每个幸存者空间的107.5 MB。