zoukankan      html  css  js  c++  java
  • JAVA GC之标记 第五节

    JAVA GC之标记  第五节

            OK,我们继续昨天最后留下的问题,什么是标记?怎么标记?

            第一个问题相信大家都知道,标记就是对一些已死的对象打上记号,方便垃圾收集器的清理。 至于怎么标记,一般有两种方法:引用计数和可达性分析。

            引用计数实现起来比较简单,就是给对象添加一个引用计数器,每当有一个地方引用它时就加1,引用失效时就减1,当计数器为0的时候就标记为可回收。这种判断效率很高,但是很多主流的虚拟机并没有采用这种方法,主要是因为它很难解决几个对象之间循环引用的问题,向下图这个例子这样发生循环引用。虽然不怎么用了,但还是值得我们学习!

            可达性分析的基本思路就是:通过将一些称为"GC Roots"的对象作为起始点,从这些节点开始搜索,搜索和该节点发生直接或者间接引用关系的对象,将这些对象以链的形式组合起来,形成一张“关系网”,又叫做引用链。最后垃圾收集器就回收一些不在这张关系网上的对象。如图:



            连接GC Roots对象的object是确定还存活的对象,而右边的die obj由于和GCROOTS没有关系,所以会标记为可回收的对象。目前主流的商用虚拟机用的都是类似的方法。那什么对象才能作为“GC Roots”呢?在java中,有四种对象可以作为“GC Roots”

            1:栈帧(第一章的名词)中的引用对象。(栈中的)

            2:静态属性引用的对象。(方法区中的)

            3:常量引用的对象。(方法区中的)

            4:本地方法栈中JNI引用的对象。(本地方法栈中的)

            目前来说这两种标记的方法最为常用,带标记完成后就可以进行上一章所讲的回收方法了!

           

    长按下方二维码获得更多猛料干货,觉得写得还不错的话就分享给大家吧!

  • 相关阅读:
    hdu 5366 简单递推
    hdu 5365 判断正方形
    hdu 3635 并查集
    hdu 4497 数论
    hdu5419 Victor and Toys
    hdu5426 Rikka with Game
    poj2074 Line of Sight
    hdu5425 Rikka with Tree II
    hdu5424 Rikka with Graph II
    poj1009 Edge Detection
  • 原文地址:https://www.cnblogs.com/chengpeng15/p/5823928.html
Copyright © 2011-2022 走看看