您的位置:首页 > 编程语言 > Java开发

java垃圾回收浅析

2016-09-13 11:36 162 查看
java垃圾回收算法:

标记-清除:分为标记和清除两部分,首先标记处所有需要清理的对象,然后在标记完成之后在统一回收。该算法的最大缺点就是标记清除之后会产生大量不连续的内存碎片,空间碎片化太高可能会导致,当程序在以后的运行过程中需要分配大对象的时候没有办法找到连续的空间再去触发一次垃圾回收动作,有点得不偿失,还有一点就是该算法的收集效率也不是太高。

复制算法:将java新生代划分为较大的eden和两个相等大小的 survivor,每次是Eden和一个survivor使用,当一块内存块用完之后,就把存活的对象复制到另一块上去(就是说任意时刻两边必须有一边是空的),然后把已经使用过的内存空间一次清理掉,这样使得每次都对其中一块进行垃圾回收,再次进行内存分配的时候也不用考虑空间碎片化的问题。这种算法也有坏处就是内存压缩为原来的一半,利用率比较低,典型的空间换时间的解决方案。

标记-整理:根据老年代的特点,提出了另外一种“标记-整理”算法,顾名思义就是先标记在整理,标记过程和“标记-清除“算法中的标记一样,但是后续步骤不是直接对可回收对象进行清理,而是让所有的存活对象都向一端移动,然后清理掉边界以外的内存,这样也避免了内存空间碎片化。

分代算法:当前的商业虚拟机都采用的是”分代收集“算法,一般是把java堆分成新生代和老生代,这样就可以根据各个年代的特点采用最适当的垃圾收集算法,新生代中,对象大多是”朝生夕死“可以采用复制算法,而老年代的对象存活率比较高,而且没有担保空间进行内存分配,就要采用”标记-清除算法“或者”标记-整理“算法。

当前应用较多的是分代回收,就是把java对分成新生代和老生代两个部分,对不同部分的特点采用不同的回收算法。在新生代的 对象的生命周期比较短,存活率不高,适合采用复制算法;在老年代中,对象的存活率高适合采用标记-清理或者标记-整理的算法。

在不同的收集器中搭配使用不同的垃圾收集算法:

G1收集器可以实现在基本补习生吞吐量的前提下完成低停顿的内存回收,这是由于它能够极力避免全区域的内存垃圾收集,之前的垃圾收集器进行的收集都是整个新生代或老年代,而G1是将整个java堆划分为多个大小固定的独立区域,并且跟踪这些区域里面的垃圾堆积成都,在后台维护一个优先列表,每次根据允许的垃圾收集时间,优先回收垃圾最多的区域,这也是G1名字的来历,Garbage
First,区域划分及优先级的区域回收,保证了G1收集器在优先的时间内可以获得最高的垃圾效率
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: