版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_34122324/article/details/84680645
1. 垃圾回收机制是什么?
垃圾回收机制让开发者无需关注空间的创建和释放,而是以守护进程的形式在后台自动回收垃圾。
这样做不仅提高了开发效率,更改善了内存的使用状况。
2. 什么是垃圾呢?如何判断是否为垃圾呢?
什么是垃圾?垃圾指所有不再存活的对象。
常见的判断是否存活有两种方法:引用计数法和可达性分析。
-
引用计数法
为每一个创建的对象分配一个引用计数器,用来存储该对象被引用的个数。当该个数为零,意味着没有人再使用这个对象,可以认为“对象死亡”。但是,这种方案存在严重的问题,就是无法检测“循环引用”:当两个对象互相引用,即时它俩都不被外界任何东西引用,它俩的计数都不为零,因此永远不会被回收。而实际上对于开发者而言,这两个对象已经完全没有用处了。
因此,Java 里没有采用这样的方案来判定对象的“存活性”。 -
可达性分析
基本思路是把所有引用的对象想象成一棵树,从树的根结点 GC Roots 出发,持续遍历找出所有连接的树枝对象,这些对象则被称为“可达”对象,或称“存活”对象。其余的对象则被视为“死亡”的“不可达”对象,或称“垃圾”。参考下图,object5,object6 和 object7 便是不可达对象,视为“死亡状态”,应该被垃圾回收器回收。
3. GC root指的是谁?
GC Roots 本身一定是可达的,这样从它们出发遍历到的对象才能保证一定可达。那么,Java 里有哪些对象是一定可达呢?
主要有以下四种:
- 虚拟机栈(帧栈中的本地变量表)中引用的对象。
- 方法区中静态属性引用的对象。
- 方法区中常量引用的对象。
- 本地方法栈中 JNI 引用的对象。
这么几种类型的 GC Roots,每次垃圾回收器会从这些根结点开始遍历寻找所有可达节点。