Skip to content

JVM垃圾回收一节中动态年龄计算表述有误 #552

Description

@onelogistics

正确的表述应该是:“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;
	...
}

Activity

  1. Snailclimb commented on Nov 22, 2019

    @Snailclimb
    Owner

    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;
    	...
    }
    

    老哥你太帅了!牛皮!👍

  2. added
    enhancementNew feature or request or suggestion
    perfectImprove knowledge points or descriptions
    on Nov 22, 2019
  3. Morris-zz commented on Aug 3, 2020

    @Morris-zz

    666

  4. charlienss commented on Mar 8, 2021

    @charlienss

    666

  5. spirit-unpredictable commented on May 20, 2021

    @spirit-unpredictable
    Contributor

    正确的表述应该是:“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就使用吗,还是在下次使用

  6. VinterHe commented on Jul 1, 2021

    @VinterHe
    Contributor

    正确的表述应该是:“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就已经满了,把其中一部分放不下的直接放到老年代中。

  7. airconditionerr commented on Mar 1, 2022

    @airconditionerr

    感觉把“累积的某个年龄”改为“累加到某个年龄”的表述可能会更好:“Hotspot遍历所有对象时,按照年龄从小到大对其所占用的大小进行累加,当累加到某个年龄时,所累加的大小超过了survivor区的一半,则取这个年龄和MaxTenuringThreshold中更小的一个值,作为新的晋升年龄阈值。”

  8. HiAmon commented on Mar 16, 2022

    @HiAmon

    正确的表述应该是:“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就已经满了,把其中一部分放不下的直接放到老年代中。

    是只把放不下的部分放到老年代吗,而不是把整个实例转移到老年代吗

  9. hf185 commented on Oct 14, 2022

    @hf185

    牛的.

  10. wq133 commented on Jan 22, 2024

    @wq133

    超过了 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;
    	...
    }
    
  11. yuyang123-yy commented on Apr 19, 2024

    @yuyang123-yy
    Contributor

    取这个年龄和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)

  12. yaobo520xiaoqi commented on Feb 26, 2025

    @yaobo520xiaoqi

    如果表述改成这样有没有问题,大佬们帮我看下:在Hotspot虚拟机中,当遍历所有年轻代对象以确定其晋升年龄时,会根据对象的年龄从小到大累积它们所占用的内存大小。一旦累积的某个年龄段的对象总大小超过了Survivor区容量的一半,就会取该年龄与MaxTenuringThreshold中的较小值作为新的晋升年龄阈值。

  13. Snailclimb commented on Aug 24, 2026

    @Snailclimb
    Owner

    感谢反馈!这个问题已经在当前文档中修复:文档已附修正说明(引用本 issue):动态年龄计算按年龄从小到大累积,超过 Survivor 目标比例时取该年龄与 MaxTenuringThreshold 较小值。 如果觉得仍有问题,欢迎重新打开或新开 issue 说明。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request or suggestionperfectImprove knowledge points or descriptions

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions