GC算法

本文详细介绍了三种主要的垃圾回收算法:标记-清除算法、复制算法和标记-整理算法,分别适用于老年代和新生代的垃圾回收。同时,文章探讨了GC机制的触发条件和过程,包括MinorGC和FullGC的触发条件,以及GC线程如何通过可达性分析法回收对象。

GC算法

1.标记-清除算法:主要用于老年代的垃圾回收
a)首先标记出所有需要回收的对象,标记完成后统一回收被标记的对象;
b)不足之处:
i.效率低下;
ii.标记清除之后会产生大量的内存碎片,空间碎片太多的话会导致以后再分配较大的对象时无法找到足够的连续的内存而不得不提前触发一次GC。
2.复制算法:主要用于新生代的垃圾回收
a)将内存划分为容量大小相等的两快,每次只使用其中的一块,当一块内存用完之后将还存活的对象复制到另一块上面,然后再把使用过的内存一次性清除掉;
b)特点:
i.实行简单,运行高效;
ii.代价太高,将内存缩小为原来的一般;
iii.因为每次都是对一半内存连续处理,所以避免了产生大量内存碎片。
3.标记-整理算法:用于老年代的垃圾回收
a)根据老年代的特点,这种算法的过程仍与标记-清除算法一样,但后续不是直接对可回收对象清理,而是让所存活的对象都向一段移动,然后直接清理掉边界以外的内存。

GC机制

1.GC触发条件
a)程序调用System.gc时可以触发;
b)系统自身来决定GC触发的时机。
2.GC过程:当GC线程启动时,会通过可达性分析法把Eden区和From Space区的存活对象复制到To Space区,然后把Eden Space和From Space区的对象释放掉。当GC轮询扫描To Space一定次数后(默认15),把依然存活的对象复制到老年代,然后释放To Space区的对象。
在这里插入图片描述
a)对于用可达性分析法搜索不到的对象,GC并不一定会回收该对象,要完成回收一个对象至少要进行两次标记的过程:
i.对于一个没有其他引用的对象,筛选该对象是否有必要执行finalize()方法,如果没有必要则直接回收(筛选的依据:是否复写或执行finalize()方法,因为finalize()方法只能执行一次)。
ii.如果筛选之后有必要执行finalize()方法,则会放入FQueue队列,并自动创建一个低优先级的finalize线程来执行释放操作。如果在一个对象释放前被其他对象引用,则该对象会被移除FQueue队列。

Minor GC和Full GC

1.Minor GC触发的条件:当年轻代满时就会触发Minor GC,这里的年轻代指的是Eden区,survivor区满不会触发Minor GC;
2.Full GC触发的条件:
a)当老年代满时会触发Full GC,Full GC将会同时回收年轻代和老年代;
b)当永久代满时也会触发Full GC,会导致Class和Method元信息的卸载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值