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 对老年代空间进行清理和压缩。

相关推荐
环流_1 分钟前
Redis:epoll和IO多路复用
java·redis·mybatis
Chase_______4 分钟前
Java基础语言 ④ :面向对象核心——构造方法、this关键字与对象内存模型详解
java·开发语言·面向对象·类与对象
欢璃4 分钟前
表白墙案例
java·开发语言·jvm·spring boot·spring·maven·mybatis
X56619 分钟前
Python Django怎么处理404_关闭DEBUG模式并自定义配置全局404与500友好错误重定向页面
jvm·数据库·python
‎ദ്ദിᵔ.˛.ᵔ₎11 分钟前
Java 匿名内部类与 Lambda 表达式
java
m0_7485548111 分钟前
golang如何集成Etcd配置中心_golang Etcd配置中心集成方法
jvm·数据库·python
hhhhhaaa13 分钟前
Java 并发编程核心原理与生产级最佳实践
java·后端
Jetev15 分钟前
Golang怎么做API网关_Golang API网关教程【总结】
jvm·数据库·python
m0_6908258215 分钟前
Go语言如何发GET请求_Go语言HTTP GET请求教程【总结】
jvm·数据库·python
2301_7838486517 分钟前
HTML怎么处理右键菜单_HTML contextmenu自定义(已废弃)替代方案【指南】
jvm·数据库·python