JVM 堆内存分代

今天我们一起来聊一聊 JVM 堆内存。

​

Java Heap (堆内存)由 Young Generation (新生代,约占 1/3 )和 Old Generation (老年代,约占 2/3 )组成。

Young Generation 又由 Eden Space (伊甸园区,占新生代 80% )、Survivor Space 0 (幸存者区0,占新生代 10% )和 Survivor Space 1 (幸存者区1,占新生代 10% )组成。

对象的生命周期:

​

Young Generation(新生代):

  • 存储 新创建 、存活周期极短 的对象,比如方法内的局部变量、临时对象。默认占堆总容量 1/3 。
  • 触发 Minor GC(新生代 GC),频率极高(毫秒 / 秒级),但耗时极短(几十毫秒)。
  • Eden 区是 Minor GC 的 "触发源头",调大 Eden 区可减少 Minor GC 次数。

Eden Space (伊甸园区):新对象的 "默认出生地",99% 的新对象 都会优先分配到 Eden 区(除非是超大对象直接进入老年代)。占新生代 80% 。

Survivor Space 0/1(幸存者区 0/1,简称 S0/S1,也叫 From 区 / To 区):

  • 新生代 GC 后存活对象的 "临时中转站" ,避免存活对象直接进入老年代。两个区会动态互换角色 。各占新生代 10% ,合计 20%。
  • S0 和 S1 永远有一个是空的(这是 JVM 的设计巧思)。
  • 每经历一次 Minor GC,存活对象的 "年龄 + 1" 。

S0/S1 的交互 示例:

  • ① 初始状态:Eden 有对象,S0 有对象,S1 为空;
  • ② Eden 触发 Minor GC → 回收 Eden+S0 的垃圾对象,存活对象复制到 S1,清空 Eden+S0;
  • ③ 此时 S1 非空、S0 为空,两者角色互换(S0=To 区,S1=From 区);
  • ④ 下次 Minor GC 重复上述过程,存活对象在 S0/S1 之间 "来回复制" 。

Old Generation(老年代):

  • 存储 长期存活、体积较大 的对象,比如单例对象、缓存对象、经历多次 Minor GC 仍存活的对象。默认占堆总容量 2/3。
  • 触发 Major GC / Full GC,频率极低,但耗时极长。
  • 老年代大小决定 Full GC 频率 ------ 老年代越大,Full GC 频率越低,但单次 Full GC 耗时越长。

对象进入老年代的条件:

  • 年龄达标 :对象在 S0/S1 之间复制次数达到阈值(默认 15 次,-XX:MaxTenuringThreshold调整);
  • 大对象 :超过阈值的对象(-XX:PretenureSizeThreshold)直接进入老年代;
  • 空间担保失败:Minor GC 后 Survivor 区放不下存活对象,多余对象直接晋升老年代;
  • 动态年龄判断:Survivor 区中相同年龄对象总和超过 50%,该年龄及以上对象直接进入老年代。

不同存活周期的对象放在不同区域,用不同算法回收,保证 GC 效率,这就是 "分代回收" 的核心思想。

努力的意义,不在于追逐别人的高度,而是拼尽全力,为自己创造一个绝地反击的故事。-- 烟沙九洲

​

相关推荐
海的透彻3 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
code2cat4 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle
后台模板学习4 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
w_zero_one4 小时前
算法--构造
java·数据结构·算法
SL_staff5 小时前
制造业订单交付崩盘?用四层协同框架重建交付可信度(技术实践)
java·产品·全栈
SL_staff5 小时前
打破风控迭代死循环:用决策编排重构业务与技术协作链路
java·产品·全栈
Mikko76 小时前
Redis 连接数满了服务端有错误信息吗?连接数不增加却命令超时?6.2 实测连接池、超时与大 key 怎么判定
java·spring boot·redis·后端
.Bryce.6 小时前
从零到一开发技术名词大全:从需求分析到 AI Agent 工程
java·网络·人工智能·agent·需求分析·agent评测
SL_staff6 小时前
JVS-APS的7个刚性约束设计:从无限产能幻觉到可执行排产的工程实践
java·spring cloud·全栈
akinggw7 小时前
libagentcore - 一个基于c++的AI多agent系统升级到2.0版本
开发语言·jvm·c++