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

相关推荐
qq_3729069320 小时前
Python最短路径怎么求_Dijkstra算法与优先队列结合
jvm·数据库·python
qq_3300379920 小时前
如何查看集群版本_crsctl query crs activeversion当前版本
jvm·数据库·python
阿巴斯甜20 小时前
userList.stream().sorted((u1, u2) -> u2.getAge() - u1.getAge()); 怎么判断是升序还是降序?
java
小松加哲20 小时前
AspectJ编译期织入实战
java·开发语言
贺小涛20 小时前
python和golang进程、线程、协程区别
java·python·golang
214396520 小时前
golang如何使用expvar暴露运行时指标_golang expvar运行时指标暴露步骤
jvm·数据库·python
Seven9720 小时前
Tomcat的架构设计和启动过程详解
java
Mr-Wanter20 小时前
踩坑记录:IDEA 启动服务连续三次 OOM 内存溢出完整解决
java·ide·intellij-idea·oom
阿巴斯甜20 小时前
User::getName含义?
java
2601_9498180920 小时前
SpringBoot项目集成ONLYOFFICE
java·spring boot·后端