A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

如何判断垃圾对象
  • 引用计数法
    • 什么是引用计数法,简单的来说就是有一个计数器,如果对象被引用一次计数器就加1,如果引用失去,就减1,如果引用计数为0,表示该对象没有被引用,这个对象是一个垃圾
      file:///C:/Users/Administrator/Desktop/Notes/resources/2D991CEE75A4740B507AE69126867CD6.jpg
    • 引用计数法存在的问题(JVM没有采用该方式判断对象是否为垃圾的原因)
      如果对象的引用是发生在堆上2个对象之间的相互引用,这样对象即的引用计数器不会为0所以对象不会被回收,看图
      file:///C:/Users/Administrator/Desktop/Notes/resources/7E4172C5BC95034CDBCD874666EE7287.jpg
      通过代码来验证
      public class Demo {
         private Object obj = new Object();

         public Demo(){
            //为了明显的看到回收器收集了垃圾
            //定义一个比较大的字节数组,占用大
            //的内存空间,调用gc()之后会释放
            byte[] bytes = byte[30*1024*1024];
         }

         public static void main(String[] args) {

             Demo d1 = new Demo();
             Demo d2 = new Demo();

             d1.obj = d2.obj;
             d2.obj = d1.obj;

             d1 = null;
             d2 = null;

             System.gc();
         }
      }


      通过idea工具来查看GC输出日志文件
      配置VM的GC输出参数,如果不配置不会在控制台输出GC日志信息
      file:///C:/Users/Administrator/Desktop/Notes/resources/BEBDAA0AD914B9C4A75040289EB77899.jpg
      idea运行代码控制台输出的日志信息
      file:///C:/Users/Administrator/Desktop/Notes/resources/EB7163212052AFF3D3B1AC864CA99B80.jpg
      通过日志文件可以看出JVM任然回收了垃圾,这就说明JVM虚拟机并没有采用引用计数法这种方式

  • 可达性分析法
    • 来判定对象是否存活的。这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话来说,就是从GC
      Roots到这个对象不可达)时,则证明此对象是不可用的。如图下图所示,对象object5、object6、object7虽然互相有关联,但是它们到GCRoots是不可达的,所以它们将会被判定为是可回收的对象。
      file:///C:/Users/Administrator/Desktop/Notes/resources/8EF828802CF748C535AF67A1453C3F6F.jpg
    • 在Java语言中,可作为GC Roots的对象包括下面几种:
      1.虚拟机栈(栈帧中的本地变量表)中引用的对象。
      2.方法区中类静态属性引用的对象。
      3.方法区中常量引用的对象。
      4.本地方法栈中JNI(即一般说的Native方法)引用的对象。


如何回收
我们研究清楚了那些对象该回收之后我们来研究怎么去回收,回收一般有以下几中方式
  • 回收策略
    • 标记-清除算法
      通过可达性分析法找到那些对象属于可回收对象之后,对他们进行标记,垃圾回收器判断对象是否被打标记,如果有清楚。
      标记清除法的确定
      会造成大量的内存碎片
    • 标记-整理算法和分代收集算法
    • 分代收集算法
    • 复制算法

  • 垃圾回收器
    • serial
      单线程垃圾收集器
      存在stop-the-word的问题:如果开始垃圾回收,其他线程需要全部停止。
    • parnew
      多线程垃圾回收器
      存在stop-the-word的问题,但是会开启多个线程来回收垃圾
    • cms
    • G1



2 个回复

倒序浏览
回复 使用道具 举报
感谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马