问题10:gc的理解

主要目的是内存回收。针对一些不是强依赖的对象进行回收以便释放内存空间

具体的算法:

1、引用计数算法

思想:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器加1;当引用失效时,计数器减1;任何时刻计数器为0的对象就是不可能再被使用的。

使用状况:引用计数算法是在JVM中被摒弃的一种对象存活判定算法,不过它也有一些知名的应用场景(如Python、FlashPlayer)。

优点和缺点:引用计数算法的实现简单,判定效率也很高,大部分情况下是一个不错的算法。它没有被JVM采用的原因是它很难解决对象之间循环引用的问题。例如如下代码:

2、可达性分析算法

思想:通过一系列的称为“GC Roots”的对象作为起点,从这些节点向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话来说,就是GC Roots 到这个对象不可达)时,则证明此对象时不可用的,所以它们将会被判定为是可回收的对象。

Java中,可作为GC Roots的对象包括以下几种:

1)虚拟机栈(栈帧中的局部变量表,Local Variable Table)中引用的对象。

2)方法区中类静态属性引用的对象。

3)方法区中常量引用的对象。

4)本地方法栈中JNI(即一般说的Native方法)引用的对象。