当前位置:网站首页>survivor区对象何时进入老年代(深入理解jvm中表述不准确的地方)
survivor区对象何时进入老年代(深入理解jvm中表述不准确的地方)
2022-07-30 05:45:00 【zpv2jdfc】
我们都知道,survivor区中的对象年龄超过MaxTenuringThreshold后会晋升到老年代,但实际上,只要survivor区中某个年龄段的对象超过一定比例后,大于这个年龄段的对象就会晋升到老年区。
对此,《深入理解java虚拟机》中原话是这样说的:如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。
我在第一次看到这个相同年龄时,就感觉不太对劲。假设下面这种情况:
| 年龄 | 比例 |
|---|---|
| 1 | 30% |
| 2 | 30% |
| 3 | 30% |
如果计算的是相同年龄所有对象的大小,那么任何一个年龄段的对象都没有超过50的占比,也就不会晋升到老年代,但实际上survivor已经使用了90%,这显然是不合理的。
翻看hotspot源码,hotspot并不是用的相同年龄:
uint ageTable::compute_tenuring_threshold(size_t survivor_capacity) {
size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100);
size_t total = 0;
uint age = 1;
assert(sizes[0] == 0, "no objects with age zero should be recorded");
while (age < table_size) {
total += sizes[age];
// check if including objects of age 'age' made us pass the desired
// size, if so 'age' is the new threshold
if (total > desired_survivor_size) break;
age++;
}
uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold;
......
}
首先,在这段代码中,我们可以清晰地看到TargetSurvivorRatio这个变量,他是用来确定survivor区存活比例的。TargetSurvivorRatio默认为50,也就是书中所说的一半,具体大小可以用
-XX:TargetSurvivorRatio=percent命令来设置。
其次,可以看出,总大小total是从年龄为1的对象一直加过来的,直到加上某个年龄对象后total超过设定的比例。最后的result则是返回的真实threshold。
一句话来说,在hotspot中,当survivor中年龄小于等于age的对象占比超过TargetSurvivorRatio时,则年龄大于age的对象会直接晋升到老年代。
边栏推荐
- ipconfig命令指南
- Generalized Focal Loss 论文阅读笔记
- Biome-BGC 生态系统模型与应用
- The types of data structures and MySQL index
- QT每周技巧(3)~~~~~~~~~串口添加
- The application of Meta analysis in the field of ecological environment
- 昆仑通态屏幕制作(连载5)---基础篇(串口接收,文本与灯显示)
- Based on R language geographic weighted regression, principal component analysis, discriminant analysis and other spatial heterogeneity data analysis
- 边境的悍匪—机器学习实战:第十五章 使用CNN和RNN处理序列
- 原型模式(Prototype):Swift 实现
猜你喜欢

Simulation of Future Air Pollution Changes Based on Global Model Comparison Program CMIP6 and Regional Climate-Chemistry Coupling Model WRF-Chem

MATLAB怎么在图像中显示nii文件切片信息?

QT连载2:基于QT和STM32H750的LORA试验平台(1)

QT串口动态实时显示大量数据波形曲线(四)========“界面的美化与处理”

什么是过拟合、欠拟合现象以及如何缓解?

边境的悍匪—机器学习实战:第十一章 训练深度神经网络

Function functional interface and application

AAcell五号文档室——跨平台文件传输的小室一间一间的

Rsync realizes folder or data synchronization between Win systems

十六、Kotlin进阶学习:协程详细学习。
随机推荐
昆仑通态屏幕制作(连载3)---基础篇(按钮串口发送)
jvm之逃逸分析
openssl1.1.1ARM双编译
clinit方法
【江科大自化协stm32F103c8t6】笔记之【入门32单片机及利用TIM输出比较配置PWM】
Atmospheric particulate matter PMF source analysis
FPGA解析B码----连载2
新导则下 防洪评价报告编制方法及洪水建模(HEC-RAS)
边境的悍匪—机器学习实战:第十二章 使用TensorFlow自定义模型和训练
写在公众号之前——QT,ARM,DSP,单片机,电力电子与传动!
Target detection, object classification and semantic segmentation of UAV remote sensing images based on PyTorch deep learning
昆仑通态屏幕制作(连载1)---接触篇
Receive emails from gmail with pop3
昆仑通态屏幕制作(连载5)---基础篇(串口接收,文本与灯显示)
联影医疗二面
与所有 ARM 工具、软件兼容?韦斯佰瑞这款MCU内核值得关注!
逻辑右移和算术右移区别
Conda 安装 tensorflow gpu 1.13.1(验证可行)
【正点原子】sys.c、sys.h位带操作的简单应用
探究make_shared效率