垃圾回收的概念与算法

GC中的垃圾,是指的是在内存中不在不再被使用的对象。

常见的垃圾回收算法

1.引用计数算法(无法回收循环引用的对象)

2.标记清除算法
分为标记阶段和清除阶段(会产生内存的空间碎片)

3.复制算法(缺点是将系统内存折半,高效性是建立在存活对象少,垃圾对象多的前提下的)

在java新生代串行垃圾回收器中,使用了复制算法的思想,新生代分为eden,from,to三个部分。from,to空间成为survivor空间,用于存放未被回收的对象。

其中:新生代指得是存放年轻对象的空间。

老年代指的是存放垃圾回收存活的对象。

在新生代中的垃圾回收中,eden区存活的对象会放在to中,正在使用from中的年轻对象也会被复制到to中,此时eden区与from区可以直接清空。

4.标记压缩法(高效性是建立在大多数的对象都是存活的)

用于老年代中的垃圾回收:

在标记清除算法中做了优化:从根节点开始,对所有可达对象做了标记。然后将所有的可达对象都压缩到内存的另一边,之后清理边界外的所有空间。

5.分代算法:

就是将复制算法与标记压缩法整合到一起。

6.分区算法:

将整个内存的对空间划分为连续的不同的小空间,每个小空间都单独的使用,独立的回收。由于对空间越大,一次GC所花费的时间越长,所以会减少GC的时间。

对象回收的情况

java提供了四个类型的引用:强引用,软引用,弱引用,虚引用。

强引用所指的对象在任何时候都不会被GC回收。

2.GC未必会回收软引用的对象吗,但是当内存资源紧张时,软引用的对象会被回收。

3.在GC中还要发现弱引用就会被回收。

4.一个虚引用随时随地都会被回收。

新生代与老年代GC的区别:

新生代GC比较频繁,但是持续的时间较短。

老年代GC发生次数少,但是持续的时间比较长。

垃圾回收器的分类:

1.串行回收器

单线程进行垃圾回收的回收器,对于并性能力较弱的计算机来说,性能比较好,是最古老的垃圾回收器。在串行收集器回收时,所有的线程都需要暂停,等待垃圾回收的完成。“stop the world”。

2.并行回收器

采用多个线程进行垃圾回收,对于并行能力强的计算机,可以有效的缩短垃圾回收的时间。

3.CMS回收器

主要关注于系统的停顿时间。意为并发标记清除。使用的是标记清除算法。同时他又是一个使用多线程并行回收的回收器。

 

posted @ 2017-05-13 18:22  起个po名真费劲  阅读(446)  评论(0编辑  收藏  举报