31. 如何计算对象已死(引用计数器算法可达性分析算法)32.对象是否可 GC?33. Minor GC 和 Full GC

Posted to.to

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了31. 如何计算对象已死(引用计数器算法可达性分析算法)32.对象是否可 GC?33. Minor GC 和 Full GC相关的知识,希望对你有一定的参考价值。

31. 如何计算对象已死

31.1.引用计数器算法

引用计数器算法是给每个对象设置一个计数器,当有地方引用这个对象的时候,计数器+1,当引用失效的时候,计数器-1,当计数器为0的时候,JVM就认为对象不再被使用,是“垃圾”了。

引用计数器实现简单,效率高;但是不能解决循环引用问问题(A对象引用B对象,B对象又引用A对象,但是A,B对象已不被任何其他对象引用),同时每次计数器的增加和减少都带来了很多额外的开销,所以在JDK1.1之后,这个算法已经不再使用了。

31.2.可达性分析算法

可达性分析算法是通过一些“GC Roots”对象作为起点,从这些节点开始往下搜索,搜索通过的路径成为引用链(Reference Chain),当一个对象没有被GC Roots的引用链连接的时候,说明这个对象是不可用的,如下图所示。

GC Roots对象包括:
1.虚拟机栈(栈帧中的本地变量表)中的引用的对象。
2.方法区域中的类静态属性引用的对象。
3.方法区域中常量引用的对象。
4.本地方法栈中JNI(Native方法)的引用的对象。
上面只是标记了对象是否可以被回收,实际上在java中首先会标记下对象,会调用对象里面的protected void finalize()这个方法,这个时候对象还有救,只要在这个方法把该对象和引用链对接上,其实可以逃脱被回收

32.对象是否可 GC?

评注:这个问题就是在问,JVM如何判断对象是否需要被回收!不用答引用计数法,答可达性分析算法就行。
回答:
这个算法的基本思路是通过一些列称为“GC Roots”的对象作为起始点,从这些点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明对象需要被回收.

Java可作为GC Roots的对象包括下面几种:
虚拟机栈中引用的对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法栈中JNI引用的对象

33. Minor GC 和 Full GC

**评注:**基础题,会JVM调优的,基本都会!我只是奇怪,怎么没问Major GC呢?我们还是把Major GC也给答了吧!
回答:
堆内存是JVM中最大的一块由年轻代和老年代组成。
那么,从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC。
Major GC 是清理老年代。
Full GC 是清理整个堆空间—包括年轻代和老年代。

以上是关于31. 如何计算对象已死(引用计数器算法可达性分析算法)32.对象是否可 GC?33. Minor GC 和 Full GC的主要内容,如果未能解决你的问题,请参考以下文章

垃圾回收 GC

JVM垃圾回收 GC

如何确定垃圾

JVM中引用计数法与可达性分析

jvm-对象生存还是死亡

GC回收策略