Skip to content

P134-3.8.4动态对象年龄判定的解释有误 #13

Open
@MaaaxYang

Description

@MaaaxYang

原文:如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到-XX:MaxTenuringThreshold中要求的年龄

这段话不知道是基于哪个版本的JVM得出的结论,
实际代码:

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

得出的结论是:
从最小的年龄对象大小开始累加,当达到n大小时如果总和大于TargetSurvivorRatio设定的阀值那么大于等于n年龄的对象就会晋升到老年代。
而不是:
相同的某一个年龄的累加大小

Activity

fenixsoft

fenixsoft commented on Mar 22, 2020

@fenixsoft
Owner

感谢。已更新至勘误。

查了jdk 7u6的源码,当时逻辑就是如此了。应该就是写下这段内容时理解有误,而不是源码发生过什么改动。TargetSurvivorRatio的默认值为50,所以订正为:

如果在Survivor空间中【相同年龄】所有对象大小的总和大于Survivor空间的一半
更正:如果在Survivor空间中【低或等于某个年龄的】所有对象大小的总和大于Survivor空间的一半
后面涉及到的描述也类似地修改。

zhangshuge

zhangshuge commented on Jan 16, 2021

@zhangshuge

为什么我本地验证的时候需要将TargetSurvivorRatio调至60以上才能符合预期?默认的50时,一个256K的变量就能晋级老年代。

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

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @fenixsoft@MaaaxYang@zhangshuge

        Issue actions

          P134-3.8.4动态对象年龄判定的解释有误 · Issue #13 · fenixsoft/jvm_book