JVM 分代垃圾回收过程

堆空间划分了代:

年轻代(Young Generation)分为 eden 和 Survivor 两个区,Survivor 又分为2个均等的区,S0 和 S1。

首先,新对象都分配到年轻代的 eden 空间,Survivor 刚开始是空的。

当 eden 满了以后,minor gc 就被触发了。

还被引用的对象被移到第一个 survivor 空间,然后把整个 eden 空间都清理掉。

下一次 minor gc 时还是同样的过程,把 eden 中还被引用的对象移到 survivor 空间,然后清除 eden 空间,只是这次是移到第二个 survivor(S1),同时,把上次 minor gc 移到 S0 中的对象也移到 S1,并增加这些对象的年龄,移到 S1 之后,S0 也被清理掉,这时,eden 和 S0 都干净了。

下一次 minor gc 同理,只是这次换为了 S0,eden 和 S1 都干净了。

这个过程不断重复,这样 survivor 中对象的年龄会一直增长,当达到一定程度(例如8),这个对象就从年轻代转移到了老年代。

这样,老年代中的对象就持续增加。

最后就会触发 major gc 对老年代空间进行清理和压缩。

相关推荐
阿巴斯甜5 分钟前
Java中 Consumer 的用法:
java
解救女汉子6 分钟前
Layui表格如何使用第三方插件实现树形展示
jvm·数据库·python
a95114164216 分钟前
Python字典底层实现_dict哈希结构解析
jvm·数据库·python
做个文艺程序员19 分钟前
Spring Boot 封装 OpenClAW 服务层最佳实践【OpenClAW + Spring Boot 系列 第2篇】
java·人工智能·spring boot·开源
LiAo_1996_Y20 分钟前
MongoDB中什么是Hashed Shard Key的哈希冲突_哈希函数的分布均匀性分析
jvm·数据库·python
weixin_3812881828 分钟前
PyTorch中高效实现SOM邻域权重更新:向量化替代双重循环
jvm·数据库·python
说实话起个名字真难啊30 分钟前
2026数字中国创新大赛数字安全赛道writeup之web题目一
java·前端·安全
后端AI实验室30 分钟前
我用AI把一个外包需求从30天压到5天交付,然后客户说:下次还找你
java·ai
m0_6178814235 分钟前
在 Go 中声明包级全局 Map 的正确方法
jvm·数据库·python
Polar__Star35 分钟前
Redis怎样管理废弃的数据集合_利用EXPIRE指令为任意数据类型设置生命周期
jvm·数据库·python