【JVM】垃圾收集算法思想---GC (二)

本文介绍了JVM中四种主要的垃圾回收算法:标记-清除、复制算法、标记-整理及分代收集算法。详细解释了每种算法的工作原理、优缺点以及应用场景,特别是针对新生代和老年代的不同特性所采取的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


         JVM在做垃圾回收的时候,会检查堆中的所有对象是否会被这些根集对象引用,不能够被引用的对象就会被垃圾收集器回收。


1.      标记-清除算法(Mark-Sweep)

         分为“标记”和“清楚”两个阶段:标记所有需要回收的对象,完成标记后统计收回被标记的对象。

         缺点:效率问题---标记和清楚的过程比较浪费时间;

         空间问题---标记清除后会产生大量不连续的内存碎片。

 

 

 

 

 

 

2.      复制算法(Copying)

         将可用内存划分为大小相等的两块,每次只使用其中一块,当其中一块内存使用完了,就将还活着的对象复制到另一块上面,然后在把之前的内存一次性清除。然后再把剩余的可用空间进行平均两分。

         优点:提高了效率。

         缺点:在对象存活率较高时执行的复制次数比较多,并且空间浪费很严重(50%)。

 


      (多数商业是虚拟机采用这种收集算法,经研究表明,新生代中的对象98%是朝生夕死---存活周期比较长,所以不需要完全按照1:1的比例进行内存的分割,而是将内存划分为一个Eden空间和两个survivor空间。具体的回收机制是这样:回收时,将Eden和survivor中还存活的对象复制到另一个surivor 中,然后清空Eden和survivor,然后周而复始。其中Hotspot虚拟机默认的Eden和survivor的大小比例是8:1。当survivor内存被占满时,会从Eden中重新分配出一块内存)

 

3.      标记-整理算法(Mark-Compact)

          该算法与标记—清除算法类似,但是在标记后不是进行清除操作,而是进行存活对象的移动操作,既清除掉死掉的对象然后将仍然存活的对象进行整理移动。

 

 

4.      分代收集算法(Generational Collection)

         根据对象的存活周期不同将内存划分几块。例如一般Java堆分为新生代和老年代,其中新生代中的对象存活周期短,老年代中的对象存活周期长,这样针对如此情况,在新生代采用复制算法,在老年代采用标记—清除或者标记—整理来进行内存回收,这样可以很好的节约资源和提高内存。




评论 62
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值