GC垃圾回收机制就是对无用的对象进行回收从而释放内存
通过俩种算法去判断是否需要去回收
- 引用计数法
引用计数法很简单,但是存在问题,因而java并不采用这种方式进行对象存活判断。
引用计数法的逻辑是:在堆中存储对象时,在对象头处会有一个计数器,如果一个对象增加了一个引用与之相连,则次数加一,如果一个引用关系失效则次数减一。如果一个对象的次数变为0,则说明这个对象已经不适用,不处于存活状态
最大问题就是:
如果一个对象A持有对象B,对象B也持有对象A,那么gc永远无法回收这俩个对象
2.可达性分析法
这个算法的基本思路就是通过一系列名为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径成为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象时不可用的
由图可知,obj8,obj9,obj10都没有到GCRoots对象的引用链,即便obj9和obj10之间有引用链,他们还是会被当成垃圾处理,可以进行回收
一般来说,以下情况的对象可以作为GC Roots:
- 虚拟栈(栈桢中的本地变量表)中的引用对象
- 方法区中的类静态属性引用的对象
- 方法区中的常量引用的对象
- 本地方法栈中JNI(Native方法)的引用的对象