PretenureSizeThreshold

-XX:PretenureSizeThreshold= 对象直接晋升老年代的大小阈值

 

1. 它是干嘛的? 

一句话:
大于这个大小的对象,直接在老年代分配,不进新生代!
不用经过 Eden、不用经过 Survivor、不用经历 GC 复制。

 

2. 默认值

默认 = 0
意思是:不开启,所有对象都先去新生代。
 

 

3. 它的工作逻辑(超级简单)

  • 对象 < PretenureSizeThreshold → 新生代
  • 对象 > PretenureSizeThreshold → 直接老年代

 

4. 为什么要设计这个参数? 

大对象在新生代非常危险!
大对象特点:
  • 占空间大
  • 复制成本极高
  • 容易把 Eden 撑爆
  • 触发频繁 Young GC
所以:
直接让大对象去老年代,保护新生代,减少 GC。

 

5. 典型配置例子

 -XX:PretenureSizeThreshold=3m 表示: 超过 3MB 的对象,直接分配到老年代。
 

 

6. 什么时候需要设置? 

你的项目里有:
  • 大数组
  • 大缓冲区
  • 大字节数组(byte [])
  • 大字符串
  • 流读取的大对象
就可以设置,比如:
-XX:PretenureSizeThreshold=2m

 

7. 超级重要的坑(面试必问)

这个参数只对 Parallel GC 有效!
对 G1、ZGC、Shenandoah 都无效!
现在生产环境基本都用 G1,
所以 这个参数现在很少用了。
 

 

8. 一句话记住 

PretenureSizeThreshold = 多大的对象直接去老年代。
 

 

总结

  • 作用:大于指定大小 → 直接进老年代
  • 目的:避免大对象破坏新生代 GC
  • 现状:G1 时代基本不用

如果你愿意,我可以把 新生代所有 4 个核心参数(NewRatio、SurvivorRatio、MaxTenuringThreshold、PretenureSizeThreshold)
posted @ 2026-03-05 14:56  小兵要进步  阅读(2)  评论(0)    收藏  举报