jvm 오류 - 동적 대상 나이 판정
jvm를 공부하는 사람들은 기본적으로 위의 말을 읽었는데 여기서 말하는 것은 동적 연령의 판정이다.동적 판정의 조건은 같은 연령의 모든 대상 크기의 총계가 서바이버 공간의 절반보다 크다는 것이다. 그리고 산출된 연령은 맥스틴uringThreshold의 값과 비교해야 한다. 이로써 맥스틴uringThreshold의 설정이 너무 커서 대상이 승진할 수 없다는 것을 보장한다.
문제의 제기
장면 가정
굳이 같은 연령이 아니라면 모든 대상의 크기가 서바이버 공간의 절반 이상이어야 승진할 수 있다.다음 장면을 보도록 하겠습니다.
추론을 시작하다
가설적 결론을 얻다
Survivor가 100%를 차지했지만 대상은 승진하지 않습니다.구시대에는 분명히 공간이 있었지만 대상은 젊은 세대에 머물렀다.그러나 이 결론은 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;
...
}
나는 승진 연령을 계산한 코드를 떼어냈다.동적 연령의 계산을 살펴보자.코드에는 TargetSurvivorRatio 값이 있습니다.
- XX: TargetSurvivorRatio 대상 생존율, 기본 50%
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;
...
}
재연
아니면 위 장면?연령 1은 33%, 연령 2는 33%로 기본 Target Survivor Ratio(50%)를 누적하고 초과했으며 연령 2와 연령 3의 대상이 모두 승진했다.
소결
동적 대상 나이 판단은 주로 Target SurvivorRatio라는 매개 변수에 의해 제어된다.그리고 나이의 어릴 때부터 어른까지의 누적화라고 할 수 있으며, 어떤 연령대의 대상의 크기가 아니다.보고 나서 이 매개 변수를 기억해라. Target Survivor Ratio. 비록 너는 앞으로 기본적으로 그를 조정하지 않겠지만.
동적 대상 나이 판단은 주로 Target SurvivorRatio라는 매개 변수에 의해 제어된다.그리고 나이의 어릴 때부터 어른까지의 누적화라고 할 수 있으며, 어떤 연령대의 대상의 크기가 아니다.보고 나서 이 매개 변수를 기억해라. Target Survivor Ratio. 비록 너는 앞으로 기본적으로 그를 조정하지 않겠지만.