【面试】JVM分代垃圾回收机制

一、分代收集算法

分代收集算法:就是目前虚拟机使用的回收算法

在不同年代使用不同的算法,从而使用最合适的算法,新生代存活率低,可以使用复制算法。而老年代对象存活率搞,没有额外空间对它进行分配担保,所以只能使用标记清除或者标记整理算法。

二、堆

堆是用来存放对象的内存空间,几乎所有的对象、数组包括常量池都都在堆中分配内存,以下是堆的存储结构图:

堆内存:分为1/3的新生代和2/3的老年代,其中新生代分为Eden区和survivor区,其中Eden区占8/10,survivor区占2/10,survivor又分为0区和1区(也称为from区和to区),各占1/10。

2.1 新生区的垃圾回收机制

1)开始创建的对象都是分配在Eden区,当Eden区满了,就会触发垃圾回收(Minor GC)

2)经过Minor GC处理后,将不再对其它对象引用的对象清理摧毁,然后将存活的对象转移到survivor区中空闲的区,然后清空Eden区。

3)当Eden区,再次被填满,就会再次触发垃圾回收(Minor GC),清理Eden区和survivor区中的垃圾对象,清理后,将Eden区和survivor区中存活的对象,转移到survivor区中空闲的区(0或者1区,总是保持一块空闲的区域,来提供复制算法垃圾回收)。

4)survivor区反复复制移动,经过多次GC,超过15次存活的对象,将会进入老年区(可通过JVM参数【-XX:MaxTenuringThreshold】来设置,默认是15)。

5)如果是大对象,就会直接把这个对象放入到老年区(可以通过JVM参数【-XX:PretenureSizeThreshold】来设置,比如设置为1M)。

6)如果对象太多无法放入Survivor区,也会转移到老年区。

2.2 老年区的垃圾回收机制

1)存活对象转移到老年区,此时老年区都放不下这些存活的对象了,就会触发Full GC。

2)如果老年代执行了Full GC之后,任然无法进行对象的保存,也会产生OOM(OutOfMemoryError)异常。

老年区的垃圾回收算法是标记整理算法。

一开始对象都是任意分布的,在经历完垃圾回收之后,就会标记出哪些是存活对象,哪些是垃圾对象,然后就会把这些存活的对象在内存中进iRhzAuuz行整理移动,尽量都挪到一边去靠在一起,然后再把垃圾对象进行清除,这样做的好处就是避免了垃圾回收后产生的大片内存碎片。

较为耗时,比复制算法慢10倍;

所以如果系统频繁出现Full GC,会严重影响系统性能,出现卡顿。所以JVM优化的一大问题就是减少Full GC频率。

总结

新生代和老年代,通过不同的阶段,采用不同的垃圾回收算法机制,在新生代中采用复制算法,在老年代中采用标记整理算法,新生代和老年代进行垃圾回收时页是通过不同的垃圾回收器进行回收的,下篇将会讲解到。

相关推荐
洋就在江州2 分钟前
gitlab-cicd 离线集成——springboot-cicd (非docker形式,shell形式)
java·spring boot·后端·ci/cd·gitlab·gitlab-runner
Nebula_g9 分钟前
JavaSE加强:线程Thread(线程安全重点)
java·开发语言·jvm·算法·javase·技术栈
令狐少侠201114 分钟前
centos7 下,使用docker 部署IOT 调试平台,ThingsBoard 并完美启动
java·spring boot·iot
JAVA面经实录91720 分钟前
Java高级后端 · 全套面试通关手册(线上故障排查)
java·jvm·面试
IT_Octopus20 分钟前
【零基础入门 LLM 开发 · Day 11】:ChatOpenAI vs init_chat_model——一行换供应商
java·前端·javascript
Wang's Blog35 分钟前
Java 中间件之 RabbitMQ 快速入门: MQ 常见技术选型对比
java·中间件·java-rabbitmq
蜗牛互联网36 分钟前
Java Agent 工具调用的 allowlist、参数校验与调用预算
java·开发语言·人工智能·后端·oracle
大文说跨境36 分钟前
多账号环境隔离方案技术选型:指纹浏览器、VPS 与云手机的三种架构对比
java·开发语言·前端
骉马代驾1 小时前
代驾系统长连接实战(二):心跳、断线重连与消息补偿的完整实现
java
程序员Sunday1 小时前
Spring @Transactional 没回滚?按代理调用、异常和传播行为排查
java·后端·spring