Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Java虚拟机部分动态对象年龄判断有误 #905

Open
loisjee opened this issue Mar 30, 2020 · 1 comment
Open

Java虚拟机部分动态对象年龄判断有误 #905

loisjee opened this issue Mar 30, 2020 · 1 comment

Comments

@loisjee
Copy link

loisjee commented Mar 30, 2020

Java并发——三、内存分配与回收策略——4. 动态对象年龄判定 部分,“如果在 Survivor 中相同年龄所有对象大小的总和大于 Survivor 空间的一半,则年龄大于或等于该年龄的对象可以直接进入老年代,无需等到 MaxTenuringThreshold 中要求的年龄。”应该有误,动态对象的年龄判定不是依据某个年龄的相同年龄对象大小的总和来判定的,而是从小到大累计来判定的,即“Hotspot遍历所有对象时,按照年龄从小到大对其所占用的大小进行累积,当累积的某个年龄大小超过了survivor区的一半时,取这个年龄和MaxTenuringThreshold中更小的一个值,作为新的晋升年龄阈值”

@tengqingya
Copy link

tengqingya commented Jan 12, 2023

同意上面的说法
代码如下

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants