PretenureSizeThreshold
-XX:PretenureSizeThreshold= 对象直接晋升老年代的大小阈值
1. 它是干嘛的?
一句话:
大于这个大小的对象,直接在老年代分配,不进新生代!
大于这个大小的对象,直接在老年代分配,不进新生代!
不用经过 Eden、不用经过 Survivor、不用经历 GC 复制。
2. 默认值
默认 = 0
意思是:不开启,所有对象都先去新生代。
意思是:不开启,所有对象都先去新生代。
3. 它的工作逻辑(超级简单)
- 对象 < PretenureSizeThreshold → 新生代
- 对象 > PretenureSizeThreshold → 直接老年代
4. 为什么要设计这个参数?
大对象在新生代非常危险!
大对象特点:
- 占空间大
- 复制成本极高
- 容易把 Eden 撑爆
- 触发频繁 Young GC
所以:
直接让大对象去老年代,保护新生代,减少 GC。
直接让大对象去老年代,保护新生代,减少 GC。
5. 典型配置例子
-XX:PretenureSizeThreshold=3m 表示: 超过 3MB 的对象,直接分配到老年代。6. 什么时候需要设置?
你的项目里有:
- 大数组
- 大缓冲区
- 大字节数组(byte [])
- 大字符串
- 流读取的大对象
就可以设置,比如:
-XX:PretenureSizeThreshold=2m
7. 超级重要的坑(面试必问)
这个参数只对 Parallel GC 有效!
对 G1、ZGC、Shenandoah 都无效!
对 G1、ZGC、Shenandoah 都无效!
现在生产环境基本都用 G1,
所以 这个参数现在很少用了。
所以 这个参数现在很少用了。
8. 一句话记住
PretenureSizeThreshold = 多大的对象直接去老年代。
总结
- 作用:大于指定大小 → 直接进老年代
- 目的:避免大对象破坏新生代 GC
- 现状:G1 时代基本不用
如果你愿意,我可以把 新生代所有 4 个核心参数(NewRatio、SurvivorRatio、MaxTenuringThreshold、PretenureSizeThreshold)

浙公网安备 33010602011771号