• 深入理解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方法)的引用的对象。

  • 相关阅读:
    Win11安装跳过TPM的方法 Win11安装怎么跳过TPM
    选取文件,列举文件(含子文件夹),记录大小信息,限制文件层级
    选取文件夹,枚举文件及子文件夹
    数据库SQL中having和where的用法区别
    Environ 函数调用系统环境变量 电脑用户名等
    Notepad++正则表达式语法
    VB几种函数参数传递方法,Variant,数组,Optional,ParamArray
    Access导出到Excel方法汇总
    VBA编程自动导出生成Excel表
    LeetCode 136 只出现一次的数字
  • 原文地址:https://www.cnblogs.com/Eunice-mogu/p/5315450.html
Copyright © 2020-2023  润新知