1、 引用计数算法:对对象添加一个引用计数器,每当一个地方引用它,引用计数+1,引用失效时,引用计数-1;
2、 可达性分析算法:通过一系列的称为“GCRoots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GCRoots没有任何引用链相连(用图论的话来说,就是从GC Roots到这个对象不可达)时,则证明此对象是不可用的。如图3-1所示,对象object 5、object 6、object 7虽然互相有关联,但是它们到GC Roots是不可达的,所以它们将会被判定为是可回收的对象。
在java语言中,可作为GC roots的对象包括:
1、 虚拟机栈中(栈帧中的本地变量表)引用的对象
2、 方法区中的静态变量引用的对象;
3、 方法区中常量引用的对象;
4、 本地方法栈中native方法引用的对象
垃圾收集算法
1、 标记--清除算法
标记--清除算法是最基础的收集算法,其他收集算法都是基于这种思想。标记清除算法分为“标记”和“清除”两个阶段:首先标记出需要回收的对象,标记完成之后统一清除对象。
它的主要缺点:
①.标记和清除过程效率不高
②.标记清除之后会产生大量不连续的内存碎片。
1、 复制算法
它将可用内存容量划分为大小相等的两块,每次只使用其中的一块。当这一块用完之后,就将还存活的对象复制到另外一块上面,然后在把已使用过的内存空间一次清理掉。这样使得每次都是对其中的一块进行内存回收,不会产生碎片等情况,只要移动堆订的指针,按顺序分配内存即可,实现简单,运行高效。
主要缺点:
内存缩小为原来的一半。
1、 标记--整理算法
标记操作和“标记-清除”算法一致,后续操作不只是直接清理对象,而是在清理无用对象完成后让所有存活的对象都向一端移动,并更新引用其对象的指针。
主要缺点:
在标记-清除的基础上还需进行对象的移动,成本相对较高,好处则是不会产生内存碎片。
1、 分代收集算法:把java堆分为新生代和老年代,在新生代中,每次垃圾回收时都发现有大量对象死去,只有少量的对象存活,采用复制算法,只需要少量的复制成本就可以完成收集,而在老年代中因为对象的存活率高,没有额外的空间对它进行分配担保,就必须使用标记—清理或者标记—整理算法进行回收。
垃圾收集器
1、 新生代:serial单线程垃圾收集器、parNew并发收集器、parallel Scavenge 并行收集器,三种收集器都采用复制算法进行GC收集
2、 老年代:CMS(concurrent Mark Sweep)(采用标记—清理算法)、Serial old(采用标记—整理算法)、Parallel old(采用标记—整理算法)
停顿时间越短就越适合与用户交互的程序,良好的响应速度可以提升用户的体验,而高吞吐量则可以高效率地利用CPU时间,尽快完成程序的运算任务,适合用于在后台计算而不需要很多交互的任务。
(1) Serial 单线程垃圾收集器:只使用一个CPU或者一条收集线程去完成垃圾收集工作,而且在垃圾回收过程中,必须停止其他所有的工作线程,直到它收集完毕;一般用于client模式
(2) parNew并行收集器,采用了多线程的并发处理方式,其他的与Serial 单线程垃圾收集器一致;server模式下新生代的首选收集器
(3) parallel Scavenge 并行收集器:目标:达到一个可控制的吞吐量:吞吐量= 运行用户代码时间/(运行用户代码时间+ 垃圾收集时间)
(4) Serial old: 采用标记--整理算法,主要用于client模式
(5) Parallel old: 采用标记—整理算法;
(6) CMS:采用标记—清除算法,以获取最短回收时间为目标的收集器,主用用于互联网或者B/S系统的服务端,注重响应速度;
步骤:
a) 初始标记:快速,标记GC Roots引用链可以关联到的对象
b) 并发标记:慢,进行GC RootS Tracing
c) 重新标记:快,修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录
d) 并发清除:慢,进行清除工作
CMS的缺点:
1、 CMS收集器对CPU资源非常敏感,CMS默认的启动线程数为:(CPU数量+ 3)/4,当CPU数量为2时,CMS收集器占用的CPU个数为1个,占到了总数的50%,霸占了太多的CPU资源
2、 CMS收集器无法处理浮动垃圾,由于CMS在执行第四个阶段进行并发清理时,用户线程也在并发执行着,因此也会产生新的垃圾,而这一部分垃圾在标记过程之后,CMS收集器无法再当次收集中处理掉他们,只好等待下一次垃圾收集(GC)时清理掉他们,这些垃圾就是浮动垃圾
3、 内存碎片化,由于CMS采用的是标记—清理算法,也就意味着在收集结束后,会有大量的空间碎片产生,空间碎片过多时,无法给大对象进行内存的分配,将导致Full GC