java垃圾回收的方法_java垃圾回收的方法都有哪些

我们在前几期的文章中曾经给大家讲解过java编程开发的垃圾回收机制问题,而今天我们就再来聊聊java垃圾回收的方法都有哪些。

1、标记清除法(Mark-Sweep)

71944aa54bf7d03a6f29f1f5adc65e21.png

标记清除算法是现代垃圾回收算法的思想基础。它主要分为两个阶段:标记阶段和清除阶段。在标记阶段,先通过根节点,标记所有从根节点开始的可达队对象,因此未被标记的对象就是未被引用的垃圾对象。然后在清除阶段,清除所有的未被标记的对象。

标记清除算法的不足有:效率的问题和标记清除后产生的大量不连续的内存碎片。而内存碎片太多可能会导致在分配大对象时,无法找到连续的内存而不得不提前触发另外一次垃圾回收。

2、复制算法(Coping)

复制算法的核心思想是:将原有的内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中存活对象复制到未使用的内存块中,之后清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收。

如果系统中的待回收的对象很多,复制算法需要复制的存活对象就会相对较少,真正的垃圾回收时刻,复制算法的效率就会很高。而且对象是在垃圾回收过程中的,统一复制到新的内存空间,再清除原来使用的内存,因此可以确保回收后的内存空间是没有碎片的。但是另一方面,复制算法的代价是需要使用更多的内存空间。

复制算法比较适用于新生代。因为新生代垃圾对象通常多余存活对象,复制算法的效率会比较高。

3、标记整理算法(Mark Compact)

在老年代,大部分的对象都是存活对象。如果依然用复制算法,由于存活的对象多,复制的成本也将提高。因此基于老年代的垃圾回收特性,需要使用其他的算法。标记整理算法是一种老年代的回收算法。它在标记算法的基础上做了一些优化。和标记清除算法一样,它也是从更节点开始,但是并不是清除未标记的对象,而是将存活的对象压缩到内存的一边,之后清除边界外所有空间。这种方法避免了碎片的产生,又不需要过多的内存空间,因此性价比比较高。

标记整理法的终效果等同于标记清除算法执行完成后,再进行一次内存碎片的整理,因此也可以把它称为标记清除整理(MarkSweepComact)。

4、分代算法(Generational Collecting)

分代算法是根据对象存活周期不同将内存化为几块。一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用合适的收集算法。新生代中的特点是对象朝生夕死,大约90%的新建对象会被回收,因此新生代适合复制算法。当一个对象经过几次回收后依然存活,对象就会被放入老年代的内存空间。在老年代中可以认为对象在一段时间内,甚至在程序的整个生命周期,是常驻内存的,可以对老年代使用标记清除和标记整理算法。

对于新生代和老年代来说,通常新生代的回收频率很高,但是每次回收的耗时都很短,而老年代回收的频率比较低,但是会消耗更多的时间。

5、分区算法(Region)

一般来说,相同条件下,堆空间越大,一次GC所需要的事件越长,从而产生的停顿也越长。为了更好的靠之停顿时间,将一块大的内存区域分割成多个大小形同的小区域,依据目标的停顿时间,每次回收若干个小区间,而不是整个堆空间,从而减少一次GC所产生的停顿。分区算法是将整个堆空间划分为连续的不同小区间。每个小区间独立使用,独立回收。

【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值