zoukankan      html  css  js  c++  java
  • 深入理解java虚拟机---读后笔记(垃圾回收)

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

    然后和其交互的有执行引擎、本地库接口,此部分线程之间是可以共享的。

    1、 引用计数算法

    给对象添加一个引用计数器,当有一个地方引用它时,计数器值就加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。

    2、根搜索算法

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

    JAVA语言中,可以作为GC Roots的对象包括下面几种:

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

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

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

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

  • 相关阅读:
    SHELL[22]
    SHELL[15]
    SHELL[08]
    SHELL[12]
    SHELL[06]
    SHELL[24]
    SHELL[11]
    shell文件合并、去重
    SHELL[25]
    SHELL[14]
  • 原文地址:https://www.cnblogs.com/Eunice-mogu/p/5315450.html
Copyright © 2011-2022 走看看