zoukankan      html  css  js  c++  java
  • GC的判定的2种方式

    对象是否死亡的2中判定方法:引用计数和可达性分析(又称引用链)

    1.引用计数

            对象再被创建时,对象头里会存储引用计数器,对象被引用,计数器+1;引用失效,计数器 -1;GC时会回收计数器为0的对象。但是JVM没有用这种方式,因为无法判定相互循环引用(A引用B,B引用A)的情况,无法解决对象互相循环引用。

    2.引用链

            程序把所有的引用看作图(类似树结构的图),选定一个对象作为GC Root根节点,从该节点开始寻找对应的引用节点并标记,找到这个节点之后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点认为是不可达的无用节点,会被回收。

            可以作为GC Root根节点的对象有:

                a.虚拟机栈中的引用对象(本地变量表)

                b,方法区类静态属性的引用对象

                c,方法区常量引用的对象

                 d,本地方法栈中的引用对象

    Java中存在的4种引用类型:

       a 强引用

    是指创建一个对象并把这个对象赋给一个引用变量 类似 string s="hello",只要引用存在,GC永远不会回收

      b 软引用

    非必需引用,内存不足时回收。软引用主要用于用户实现类似缓存的功能,在没有被回收前可以直接通过软引用取值,无需从繁忙的真实来源查询数据,提升速度;当内存不足时,自动删除这部分缓存数据,从真实的来源查询这些数据。

    c 弱引用

    描述非必需对象。被弱引用关联的对象只能生存到下一次垃圾回收之前,垃圾收集器工作之后,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。弱引用主要用于监控对象是否已经被标记为即将回收的垃圾,可以通过弱引用的isEnQueues方法返回对象是否被垃圾回收器标记。

    d 虚引用

    虚引用是每次垃圾回收的时候都会被回收,唯一作用当对象被回收时,可以收到通知。

  • 相关阅读:
    一览js模块化:从CommonJS到ES6
    JavaScript自定义事件
    BTrace:线上问题排查工具
    【转载】JVM 学习——垃圾收集器与内存分配策略
    简单GC具体操作参数查看
    CMS垃圾回收机制
    Lombok 在继承类上面的注意
    Intellij IDEA 修改默认配置
    缓存算法(FIFO 、LRU、LFU三种算法的区别)
    MySQL 变量类型
  • 原文地址:https://www.cnblogs.com/feicheninfo/p/9684736.html
Copyright © 2011-2022 走看看