美文网首页
2.垃圾回收过程及算法

2.垃圾回收过程及算法

作者: Pagliacci_Joker | 来源:发表于2019-01-28 16:44 被阅读0次

    判断对象存活状态

    1.引用计数法
    当有一个地方引用A对象,则A对象计数器+1,当引用失效时,则A对象计数器-1。
    优点:实现简单,判断效率高。
    缺点:很难解决循环引用。

    2.可达性分析算法
    GCRoots,遍历,不在树内的可回收。
    可以作为GCRoots的有:
    虚拟机栈(本地变量表local variable)中引用的对象
    方法区中类静态引用的对象
    方法区中常量引用的对象
    本地方法栈中NATIVE方法引用的对象

    引用状态

    强引用>软引用>弱引用>虚引用

    对象是否应该进行回收判断策略

    gc对象判断死亡过程.jpg

    回收方法区

    使用场景:大量使用反射、动态代理、GCLib等byteCode框架;动态生成JSP及OSGi频繁自定义ClassLoader
    1.该类所有实例已被回收,及堆中不存在该类的任何实例。
    2.加载该类的ClassLoader已被回收
    3.该类对应的java.lang.class对象没有被任何地方引用,无法在任何地方通过反射访问该类方法

    垃圾收集方法

    1.标记-清除算法
    不足:标记及清除,效率不高;易造成空间碎片化。

    标记-回收.png

    2.标记-复制算法
    新生代中的对象朝生夕死,所以分为eden:survivor1:survivor2 8:1:1,当survivor2空间不够时,老年代进行分配担保

    image.png

    3.标记-整理算法
    用于老年代

    4.分代搜集算法
    新生代:标记-复制算法(少量存活)
    老年代:标记-清除算法、标记-整理算法(大量存活)

    5.HOTSPOT算法
    枚举根节点,OopMap里记录了内存[偏移量]=数据类型(记录了栈上本地变量到堆上对象的引用关系,即记录了栈上代表引用的所有位置)
    安全点,记录OopMap的点,只有走到安全点时,才能进行gc。分为抢先式中断及主动式中断。
    安全区域(解决线程sleep、blocked状态时的gc),进入安全区域后,标记,离开安全区域时,检查是否完成gc过程

    相关文章

      网友评论

          本文标题:2.垃圾回收过程及算法

          本文链接:https://www.haomeiwen.com/subject/cdiajqtx.html