JVM垃圾回收算法

来源:互联网 发布:网络黄金egd裴蕾抓了吗 编辑:程序博客网 时间:2024/06/04 19:47

列举常用的垃圾回收算法:

1.标记清除法

实现方式:
    阶段一: 标记出所有需要进行垃圾回收的对象—-可达性分析算法(用来判断对象是否可以回收)
    阶段二: 清除垃圾

弊端:
    1.标记和清除两个阶段效率都不高
    2.标记垃圾和清除垃圾这样会造成大量的内存碎片化,以致于在后面进行大对象分配的时候连续空间不足,又需要触发垃圾收集

2.复制算法

实现方式:
将堆分为大小相同的两块,在一块中进行对象的分配,当这一块的内存使用完毕之后,将其中存活的对象移动到另一块,然后再把使用过的那一块全部清理,这样效率很高,并且内存规整浪费少,并且每一次只对半块内存进行回收。

弊端:
    1.实际上分配内存的时候只能够使用一半的内存,也就是内存使用缩小了一半
    2.在对象存活率较高的时候 需要进行大量的复制操作 效率会变低

注意:现在商业虚拟机都采用此种算法进行垃圾回收,并且考虑到一次只使用一半,保留的内存大小太大,因为在大多数的系统中98%对象都是创建之后很快死亡,存活的需要保存的对象占了少数,所以一般来说是将内存划分为一块较大的Edne空间和两块较小的Survivor区域每次使用Edne区域和其中一块Survivor区域,当回收的时候,将Edne和Survivor中存活的对象复制到另一块Surrivior区域中,然后清理掉edne以及刚才用过的Survivor,在Java Hotsport 虚拟机中,这三个区域的比例是8:1:1 也就是说在每次用来分配对象的区域(新生代)占了整个JVM堆的90%(80%+10%),浪费的内存区域只占了10%

3.标记整理法

实现方式:
    阶段一: 标记出所有需要进行垃圾回收的对象—-可达性分析算法
    阶段二: 清除垃圾
    阶段三: 将存活的对象向一端进行移动
    阶段四: 清理掉边界以外的内存

弊端:
    我们可以看到标记-整理算法是在标记-清除算法的基础之上进行了内存的整理所以相对于标记-清除算法效率较低

优势:
    防止了内存的碎片化

4.分代收集算法

    现在使用的商业虚拟机大多采用此种算法

    将Java堆分为:

         新生代:
             存储新创建的对象
             特点:每次垃圾回收就有大量的对象死去
             采用算法:采用复制算法,只需要复制少量数据即可完成收集(因为新生代对象的存活率较低)

         老年代:
             存储持久使用的对象
             特点:对象的存活率较高
             采用算法:采用标记-清理或者标记-整理算法来进行回收

原创粉丝点击