深刻理解java虚拟机---读后笔记(垃圾回收)

运行时数据区,主要包括方法区、虚拟机栈、本地方法栈、堆、程序计数器,该部份内存都是线程隔离的。java

而后和其交互的有执行引擎、本地库接口,此部分线程之间是能够共享的。算法

一、 引用计数算法spa

给对象添加一个引用计数器,当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1,任什么时候刻计数器为0的对象就是不可能再被使用的。使用的案例有微软的COM技术、使用ActionScript3的FlashPlayer,Python语言。java语言中没有选用引用计数算法来管理内存,其中最重要的缘由是它很难解决对象之间的相互循环引用的问题。线程

例子:日志

public class ReferenceCountingGC{
     public Object instance = null;
     private static final int _1MB = 1024*1024;
     /**
     * 这个成员属性惟一意义就是占点内存,以便能在GC日志中看清楚是否被回收过
     */
      private byte[] bigSize = new byte[2*_1MB];
      
      public static void testGC(){
            ReferenceCountingGC objA = new ReferenceCountingGC();
            ReferenceCountingGC objB = new ReferenceCountingGC();
            objA.instance = objB;
            objB.isstance  = objA;

            objA =null;
            objB = null;

            System.gc();
     }
}

这两个对象已经不可能再被访问啦,可是他们之间由于相互的引用着对方,因此他们的引用计数都不为0。code

二、根搜索算法对象

经过一系列名为“GC Roots”的对象做为起始点,从这些节点开始向下搜索,搜索所走过的路径成为引用连(Reference Chain),当一个对象到GC Roots没有任何引用连相连时,则证实该对象是不可达的,则能够被断定为是可回收的对象。blog

JAVA语言中,能够做为GC Roots的对象包括下面几种:接口

1)虚拟机栈(栈帧中的本地变量表)中的引用的对象。ip

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

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

4) 本地方法栈中JNI(即通常说的Native方法)的引用的对象。

相关文章
相关标签/搜索