【JVM】垃圾回收算法

标记-清除

首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象。

**缺点:**执行效率不稳定、内存空间碎片化

标记-复制

将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

**缺点:**空间浪费多、复制开销大

**优化:**HotSpot虚拟机默认Eden和Survivor的大小比例是8∶1,发生垃圾搜集时,将Eden和Survivor1中仍然存活的对象一次性复制Survivor2空间上,然后直接清理掉Eden和Survivor1空间。

当Survivor空间不足以容纳一次Minor GC之后存活的对象时,就需要依赖其他内存区域(实际上大多就是老年代)进行分配担保

**空间分配担保:**在发生Minor GC之前,虚拟机必须先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果这个条件成立,那这一次Minor GC可以确保是安全的。如果不成立,则虚拟机会先查看-XX:HandlePromotionFailure参数的设置值是否允许担保失败(Handle Promotion Failure);如果允许,那会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试进行一次Minor GC,尽管这次Minor GC是有风险的;如果小于,或者-XX:HandlePromotionFailure设置不允许冒险,那这时就要改为进行一次Full GC。

标记-整理

标记-整理算法的标记过程仍然与"标记-清除"算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向内存空间一端**移动**,然后直接清理掉边界以外的内存。

优点:解决了空间碎片化问题

相关推荐
她说彩礼65万6 小时前
C# AutoResetEvent和ManualResetEvent
java·jvm·c#
Bug退退退12313 小时前
JVM 内存结构
jvm
那我掉的头发算什么18 小时前
【javaEE】多线程--认识线程、多线程
java·jvm·redis·性能优化·java-ee·intellij-idea
堕落年代1 天前
JVM新生代转老年代机制详解
jvm
235161 天前
【JVM】Java为啥能跨平台?JDK/JRE/JVM的关系?
java·开发语言·jvm·spring boot·后端·spring·职场和发展
AAA卷不动了1 天前
JVM(二)------ 类加载、初始化与单例模式的联系
java·jvm·单例模式
程序员卷卷狗2 天前
JVM 内存结构与 GC 调优全景图
java·开发语言·jvm
闲人编程2 天前
构建一个短链接生成器服务(FastAPI + SQLite)
jvm·python·sqlite·fastapi·生成器·短链接·caodecapsule
Boop_wu2 天前
[Java EE] 多线程 -- 初阶(1)
java·jvm·算法
小满、3 天前
对象住哪里?——深入剖析 JVM 内存结构与对象分配机制
java·jvm·#java对象分配·#hotspot实现