Repository navigation
JVM垃圾回收一节中动态年龄计算表述有误 #552
Description
Activity
l
正确的表述应该是:“Hotspot遍历所有对象时,按照年龄从小到大对其所占用的大小进行累积,当累积的某个年龄大小超过了survivor区的一半时,取这个年龄和MaxTenuringThreshold中更小的一个值,作为新的晋升年龄阈值”。
动态年龄计算的代码如下
uint ageTable::compute_tenuring_threshold(size_t survivor_capacity) { //survivor_capacity是survivor空间的大小 size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100); size_t total = 0; uint age = 1; while (age < table_size) { total += sizes[age];//sizes数组是每个年龄段对象大小 if (total > desired_survivor_size) break; age++; } uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold; ... }老哥你太帅了!牛皮!👍
Reacted by Amon, LMH and do vis- addedenhancementNew feature or request or suggestionNew feature or request or suggestionperfectImprove knowledge points or descriptionsImprove knowledge points or descriptions
on Nov 22, 2019 666
666
spirit-unpredictable commented
on May 20, 2021 ContributorMore actions正确的表述应该是:“Hotspot遍历所有对象时,按照年龄从小到大对其所占用的大小进行累积,当累积的某个年龄大小超过了survivor区的一半时,取这个年龄和MaxTenuringThreshold中更小的一个值,作为新的晋升年龄阈值”。
动态年龄计算的代码如下
uint ageTable::compute_tenuring_threshold(size_t survivor_capacity) { //survivor_capacity是survivor空间的大小 size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100); size_t total = 0; uint age = 1; while (age < table_size) { total += sizes[age];//sizes数组是每个年龄段对象大小 if (total > desired_survivor_size) break; age++; } uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold; ... }大佬,计算出来的动态年龄是在本次gc就使用吗,还是在下次使用
Reacted by Bookerohhh正确的表述应该是:“Hotspot遍历所有对象时,按照年龄从小到大对其所占用的大小进行累积,当累积的某个年龄大小超过了survivor区的一半时,取这个年龄和MaxTenuringThreshold中更小的一个值,作为新的晋升年龄阈值”。
动态年龄计算的代码如下uint ageTable::compute_tenuring_threshold(size_t survivor_capacity) { //survivor_capacity是survivor空间的大小 size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100); size_t total = 0; uint age = 1; while (age < table_size) { total += sizes[age];//sizes数组是每个年龄段对象大小 if (total > desired_survivor_size) break; age++; } uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold; ... }大佬,计算出来的动态年龄是在本次gc就使用吗,还是在下次使用
下次使用,如果当次的survivor就已经满了,把其中一部分放不下的直接放到老年代中。
Reacted by Bookerohhh感觉把“累积的某个年龄”改为“累加到某个年龄”的表述可能会更好:“Hotspot遍历所有对象时,按照年龄从小到大对其所占用的大小进行累加,当累加到某个年龄时,所累加的大小超过了survivor区的一半,则取这个年龄和MaxTenuringThreshold中更小的一个值,作为新的晋升年龄阈值。”
Reacted by SimpleMedicine, EricLee, Amon, mrcode, Li Qiming, AInoob, 506890493, YuleyoungZoe, Donner, zhangshuai0396 and 2 more正确的表述应该是:“Hotspot遍历所有对象时,按照年龄从小到大对其所占用的大小进行累积,当累积的某个年龄大小超过了survivor区的一半时,取这个年龄和MaxTenuringThreshold中更小的一个值,作为新的晋升年龄阈值”。
动态年龄计算的代码如下uint ageTable::compute_tenuring_threshold(size_t survivor_capacity) { //survivor_capacity是survivor空间的大小 size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100); size_t total = 0; uint age = 1; while (age < table_size) { total += sizes[age];//sizes数组是每个年龄段对象大小 if (total > desired_survivor_size) break; age++; } uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold; ... }大佬,计算出来的动态年龄是在本次gc就使用吗,还是在下次使用
下次使用,如果当次的survivor就已经满了,把其中一部分放不下的直接放到老年代中。
是只把放不下的部分放到老年代吗,而不是把整个实例转移到老年代吗
牛的.
超过了 survivor 区的一半时,它通常指的是 Survivor 空间中所有存活对象累计占用的内存量达到 Survivor 空间总容量的一半。
正确的表述应该是:“Hotspot遍历所有对象时,按照年龄从小到大对其所占用的大小进行累积,当累积的某个年龄大小超过了survivor区的一半时,取这个年龄和MaxTenuringThreshold中更小的一个值,作为新的晋升年龄阈值”。
动态年龄计算的代码如下
uint ageTable::compute_tenuring_threshold(size_t survivor_capacity) { //survivor_capacity是survivor空间的大小 size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100); size_t total = 0; uint age = 1; while (age < table_size) { total += sizes[age];//sizes数组是每个年龄段对象大小 if (total > desired_survivor_size) break; age++; } uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold; ... }Reacted by kkkReacted by kkkReacted by kkkReacted by kkk取这个年龄和MaxTenuringThreshold中更小的一
正确的表述应该是:“Hotspot遍历所有对象时,按照年龄从小到大对其所占用的大小进行累积,当累积的某个年龄大小超过了survivor区的一半时,取这个年龄和MaxTenuringThreshold中更小的一个值,作为新的晋升年龄阈值”。
动态年龄计算的代码如下
uint ageTable::compute_tenuring_threshold(size_t survivor_capacity) { //survivor_capacity是survivor空间的大小 size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100); size_t total = 0; uint age = 1; while (age < table_size) { total += sizes[age];//sizes数组是每个年龄段对象大小 if (total > desired_survivor_size) break; age++; } uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold; ... }这样子表述没有问题,有一点容易理解为可以修改阈值到15以上,应该是,超过当累积的某个年龄大小超过了survivor区的一半时,这个年龄及其以后的都直接进入老年代。最大值始终是15 ,把15当作阈值考虑更恰当。(因为对象头中关于年龄的字段是4个字节,所以不能超过15)
如果表述改成这样有没有问题,大佬们帮我看下:在Hotspot虚拟机中,当遍历所有年轻代对象以确定其晋升年龄时,会根据对象的年龄从小到大累积它们所占用的内存大小。一旦累积的某个年龄段的对象总大小超过了Survivor区容量的一半,就会取该年龄与MaxTenuringThreshold中的较小值作为新的晋升年龄阈值。
感谢反馈!这个问题已经在当前文档中修复:文档已附修正说明(引用本 issue):动态年龄计算按年龄从小到大累积,超过 Survivor 目标比例时取该年龄与 MaxTenuringThreshold 较小值。 如果觉得仍有问题,欢迎重新打开或新开 issue 说明。
正确的表述应该是:“Hotspot遍历所有对象时,按照年龄从小到大对其所占用的大小进行累积,当累积的某个年龄大小超过了survivor区的一半时,取这个年龄和MaxTenuringThreshold中更小的一个值,作为新的晋升年龄阈值”。
动态年龄计算的代码如下