当前位置:   article > 正文

JAVA垃圾回收机制简单了解GC_jc回收算法

jc回收算法

GC:垃圾处理机制  
            GC作用区:堆和方法区 
        JVM在进行垃圾回收时,并不是对这三个区域进行统一回收,大部分时候,回收都是新生代
            新生代
            幸存区  
            老年区 :当一个对象经历了十五次GC,还没有被GC掉,就会进入老年区
        GC两种类:轻GC(普通GC),重GC(全局JC)
        GC的对象:
        (1)引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。

        (2)可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。不可达对象
        在Java语言中,GC Roots包括:

            虚拟机栈中引用的对象。

            方法区中类静态属性实体引用的对象。

            方法区中常量引用的对象。

            本地方法栈中JNI引用的对象。
        什么时候触发GC?
        (1)程序调用System.gc时可以触发

        (2)系统自身来决定GC触发的时机(根据Eden区和From Space区的内存大小来决定。
        当内存大小不足时,则会启动GC线程并停止应用线程)
        常用的算法:
        1、标记-清除算法

        为每个对象存储一个标记位,记录对象的状态(活着或是死亡)。分为两个阶段,一个是标记阶段,这个阶段内,为每个对象更新标记位,检查对象是否死亡;第二个阶段是清除阶段,该阶段对死亡的对象进行清除,执行 GC 操作。

        优点:
        最大的优点是,标记—清除算法中每个活着的对象的引用只需要找到一个即可,找到一个就可以判断它为活的。此外,更重要的是,这个算法并不移动对象的位置。

        缺点:
        它的缺点就是效率比较低(递归与全堆对象遍历)。每个活着的对象都要在标记阶段遍历一遍;所有对象都要在清除阶段扫描一遍,因此算法复杂度较高。没有移动对象,导致可能出现很多碎片空间无法利用的情况。

        2.标记-压缩算法(标记-整理)

        标记-压缩法是标记-清除法的一个改进版。同样,在标记阶段,该算法也将所有对象标记为存活和死亡两种状态;不同的是,在第二个阶段,该算法并没有直接对死亡的对象进行清理,而是将所有存活的对象整理一下,放到另一处空间,然后把剩下的所有对象全部清除。这样就达到了标记-整理的目的。

        优点
        该算法不会像标记-清除算法那样产生大量的碎片空间。
        缺点
        如果存活的对象过多,整理阶段将会执行较多复制操作,导致算法效率降低。

        4、分代收集算法

        现在的虚拟机垃圾收集大多采用这种方式,它根据对象的生存周期,将堆分为新生代(Young)和老年代(Tenure)。在新生代中,由于对象生存期短,每次回收都会有大量对象死去,那么这时就采用复制算法。老年代里的对象存活率较高,没有额外的空间进行分配担保,所以可以使用标记-整理 或者 标记-清除。

        具体过程:新生代(Young)分为Eden区,From区与To区
        当系统创建一个对象的时候,总是在Eden区操作,当这个区满了,那么就会触发一次YoungGC,也就是年轻代的垃圾回收。一般来说这时候不是所有的对象都没用了,所以就会把还能用的对象复制到From区。
        这样整个Eden区就被清理干净了,可以继续创建新的对象,当Eden区再次被用完,就再触发一次YoungGC,然后呢,注意,这个时候跟刚才稍稍有点区别。这次触发YoungGC后,会将Eden区与From区还在被使用的对象复制到To区,
        经过若干次YoungGC后,有些对象在From与To之间来回游荡,这时候From区与To区亮出了底线(阈值),这些家伙要是到现在还没挂掉,对不起,一起滚到(复制)老年代吧。 
        老年代经过这么几次折腾,也就扛不住了(空间被用完),好,那就来次集体大扫除(Full GC),也就是全量回收。如果Full GC使用太频繁的话,无疑会对系统性能产生很大的影响。所以要合理设置年轻代与老年代的大小,尽量减少Full GC的操作
        
        内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度)
        内存整齐度:复制算法=标记压缩算法>标记清除算法
        内存利用率:标记压缩算法=标记清楚算法>复制算法
        
        没有最优算法,只有最合适的算法------》GC:分代收集算法
        
        年轻代:
            存活率低(复制算法)
        老年代:
            存活率高,区域大,(标记清楚(内存碎片不是太多)+标记压缩混合实现)

有一部分觉得自己理解的不太透彻  所以搬了一些定义

【JAVA核心】Java GC机制详解_老莫的博客-CSDN博客_javagc

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号