现在的位置: 首页 > 综合 > 正文

垃圾收集器

2018年06月08日 ⁄ 综合 ⁄ 共 1133字 ⁄ 字号 评论关闭
文章目录

转载请注明出处:http://blog.csdn.net/kai_wei_zhang/article/details/8240852

1、判断对象是否“存活”的两种方式

(1)引用计数算法

给对象加一个引用计数器,有一个地方引用它则 +1 ,当引用失效则 -1,当为 0 时则该对象不再使用

但是,这样的话会造成循环引用场景无法回收

(2)根搜索算法

通过一系列名为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径为引用链,当一个对象到GC Roots没有引用链相连(也就是从GC Roots到这个对象不可达——图论的话)时,判定为可回收对象

2、Java中,可作为GC Roots的对象包括:

(1)虚拟机栈(栈帧中的本地变量)中引用的对象

(2)方法区中的类静态属性引用的对象和常量引用的对象

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

3、引用的分类:

强引用(Object obj = new Object( );):永远不会回收

软引用:发生内存溢出之前会回收

弱引用:下次垃圾回收时会被回收

虚引用:对生存时间不影响,无法通过它获得对象实例,出现的目的是被回收是能收到一个系统通知

4、方法区的回收:

不同于堆的回收(对象实例回收)、方法区的GC操作较少,但也有;是对类的卸载和常量的废弃,框架都需要要求虚拟机具备类卸载功能,以保证永久代不会溢出

类卸载条件(同时满足):

(1)该类所有实例都已经被回收,也就是Java堆中不存在该类的任何实例

(2)加载该类的ClassLoader已经被回收

(3)该类对应的java.lang.class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法

5、主要的垃圾回收器分为两种类型:

引用计数收集器(采用引用计数器算法的思想)

跟踪收集器(采用跟搜索算法的思想):跟踪收集器主要有复制、标记—清除、标记—压缩三种实现算法

(1)复制

 从根集合扫描出存活的对象,并将找到存活的对象复制到一块新的完全未使用的空间中(当空间存活对象较少时,复制算法比较高效)

(2)标记—清除

标记存活对象,清除未标记对象(易产生碎片)

(3)标记—压缩

在“标记—清除”的基础上,增加了压缩。把存活对象往左端移动,更新引用其对象的指针(需要成本)

6、JVM堆分成新生代和旧生代

Sun JDK(程序大部分对象的存活时间较短),将JVM堆分成新生代和旧生代,并基于新、旧生代中对象的存活时间特征提供了不同的GC实现

新生代又划分为Eden、S0和S1三块空间:其中Eden Space存放新创建的对象,S0或S1分别为From Space和To Space,因为新生代普遍存活时间短,故使用基于copying算法。然后又分三种方式:串行GC、并行回收GC和并行GC

抱歉!评论已关闭.