jvm----GC回收机制

原文链接: https://my.oschina.net/zx133/blog/656419
何时回收
新生代: 当创建对象时Eden区空间不够时触发
年老代:年老代放满之后
回收区域
 堆内存:年轻代、年老代    (对象:强(不回收)弱软 、虚(finalizer独立线程回收))
 方法区内存:基本不参与回收



回收算法
根集(root set)算法:确定从根开始哪些是可达的和哪些是不可达的,从根集可达的对象都是活动对象,它们不能作为垃圾被回收,这也包括从根集间接可达的对象。而根集通过任意路径不可达的对象符合垃圾收集的条件,应该被回收。
      《1》 分代收集:分为年青代和老年代
      《2》 复制收集:年青代使用了2个幸存区来实现复制(默认比例:8:1:1,其中1用于交换,因此实际可用为90%)
      《3》 标记整理:老年代由于对象的存活率高,所以适合使用标记整理或标记清除来进行回收
回收过程
《1》对象在Eden区完成内存分配
《2》当Eden区满了,再创建对象会触发minorGC,对年轻代进行回收,minorGC回收时,eden不能回收的对象放到survivor,另一个survivor里不能被GC回收的对象也会放到这个survivor,始终保持一个survivor为空
《3》若survivor满了,则将这些对象拷贝到年老区或survivor没有满但有些对象足够老也会放入年老区
 《4》当年老区满了,进行fullGC
回收机制
《1》串行收集器:单线程处理所有来及回收、无需多线程交互,效率高
《2》并行收集器:对年轻代进行回收、减少垃圾回收时间
《3》并发收集器:保证大部分工作并发执行,垃圾回收只暂停很少的时间


GC如何工作
 1、标记(Mark)

    目标:找出所有引用不为0(live)的实例

    方法:找到所有的GC的根结点(GC Root), 将他们放到队列里,然后依次递归地遍历所有的根结点以及引用的所有子节点和子子节点,将所有被遍历到的结点标记成live。弱引用不会被虑在内

 2、计划(Plan)
    目标:判断是否需要压缩

    方法:遍历当前所有的generation上所有的标记(Live),根据特定算法作出决策

 3、清理(Sweep)
    目标:回收所有的free空间

    方法:遍历当前所有的generation上所有的标记(Live or Dead),把所有处在Live实例中间的内存块加入到可用内存链表中去

 4、引用更新(Relocate)

    目标: 将所有引用的地址进行更新

    方法:计算出压缩后每个实例对应的新地址,找到所有的GC的根结点(GC Root), 将他们放到队列里,然后依次递归地遍历所有的根结点以及引用的所有子节点和子子节点,将所有被遍历到的结点中引用的地址进行更新,包括弱引用。

  5、压缩(Compact)

   目标:减少内存碎片

  方法:根据计算出来的新地址,把实例移动到相应的位置。

转载于:https://my.oschina.net/zx133/blog/656419

你可能感兴趣的:(jvm----GC回收机制)