JVM-基础到实战03-垃圾回收概念

1.为什么要进行垃圾回收?

不回收会造成内存泄漏

2.什么时候执行回收?
达到一定的比例,或者申请的内存超出了空闲内存,触发回收

3.如果是你,如何设计垃圾回收算法?就是回收哪些类型的对象

回收栈中没有指针指向对象,断开连接的对象

4.如何判定对象存活呢?
 

引用计数法:堆中的每个对象实例都一个引用计数器,每当一个对象被创建时,且将该对象分配给一个变量,
该变量数设置为1,当任何变量被赋值为这个对象的引用时,计数+1,(此处也可以看出,对象的赋值是引用的传递)
但当一个对象实例的引用超过了生命周期(比如程序执行完,出栈),或者被设为一个新值时,改实例的引用计数-1,
引用为0时,成为等待回收状态,并不会立即被回收,而是触发回收条件后执行回收

优点:引用计数通过引用加减1,为0时,等待回收,简单!

缺点:无法检测循环引用,A对象的属性引用B对象,B对象的属性引用了A对象,他们的引用计数器永远不可能为0

 

测试使用何种垃对象存活分析算法(被GC,说明使用的非引用计数算法):

/**
 * @Auther: jorian
 * @Date: 2019/7/11 23:31
 * @Description:
 */
public class ReferenceCountingGC {
    public Object instance = null;
    public static void main(String []args){
        ReferenceCountingGC objA = new ReferenceCountingGC();
        ReferenceCountingGC objB = new ReferenceCountingGC();
        objA.instance = objB;
        objB.instance = objA;
        objA = null;
        objB = null;
    }
}

配置启动参数,运行,查看GC结果
-verbose:gc -XX:+PrintGCDetails

 
占用和回收的内存都变大

说明:1.8版本已经不再使用引用计数器方式


6.可达性分析
概念:又称为根搜索法

根搜索法是从离散数学中的图论引入的,从根节点(GCROOT)开始搜索,寻找引用的节点,
找到节点后,继续寻找这个节点的引用节点,当所有的引用节点寻找完成后,
剩余的节点则被认为是没有被引用的节点,即是无用的节点。

Java中可以作为GCROOT的对象有:
虚拟机栈中引用的对象,本地变量表
本地方法栈中引用的对象
方法区中静态属性引用的对象
方法区中常量引用的对象

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章