您的位置:首页 > 编程语言 > Java开发

java垃圾回收算法以及垃圾收集器

2016-11-02 10:56 411 查看

java垃圾回收算法以及垃圾收集器

1. java垃圾回收算法

1.1标记-清除算法

        算法分为了标记和清除两个阶段,标记:利用引用计数法和可达性分析算法(算法简介:引用计数法和可达性算法介绍)标记出需要清除的对象。然后对这些对象进行回收。

        ps:标记-清除算法的主要不足之处是:1.效率问题 ,标价和清除的效率都并不高。2.空间问题,标记清除之后会产生大量的碎片问题,碎片过多的话会影响程序的运行效率。

1.2复制算法

      为了解决效率算法,一种名为复制算法出现了。他将内存划分为相同的两块,每次都使用其中的一块,当这一块使用完了,将对象复制到另一块上去。然后再将自己使用的内存一次清除掉,每次都是对整个半区进行回收,这样内存分配的时候就不用考虑内存碎片的问题等复杂情况,只需要移动指针,按顺序分配内存即可。但是使用该算法代价是将内存缩小为原来的一半,代价太高。

     改进:分情况使用复制算法,在新生代和老年代使用不同的策略,因为新生代中的对象98%都是朝生夕死的类型,所以不必要按照1:1的比例去划分内存空间,只需要将内存划分为一块一块比较大的Eden和两块比较小的Survivor内存就好。每次使用一块Eden和Survivor,当回收时,将Eden和Survivor中还存活的对象复制到;另外一块Survivor内存中去就好了。如果另外一块的Survivor中没有足够的空间大小区存放上一次新生代中收集下来的存货对象的时候,这些对象将直接通过担保分配的机制进入老年代

1.3标记-整理算法

     标记的过程基本跟标记-清除算法一致,但是后续的步骤不是可回收对象进行回收,而是让所有存活对象都向一遍移动,然后直接清理掉边界以外的内存。

2.垃圾收集器

      java垃圾收集器主要有Serial,parNew.Parallel Scavenge,CMS,Serial Old,Serial Old,G1。

     2.1Serial收集器

                 这个收集器是一个单线程的收集器,这个收集器在进行垃圾收集的时候,必须暂停其他所有线程的工作。这种情况叫“Stop the World”

     2.2ParNew收集器

                parnew收集器时Serial收集器的多线程版本,基本原理跟Serial收集器类似(两种收集器公用了许多的代码,收集算法,对象分配算法,回收策略等等),唯一不一样的地方就是ParNew收集器使用了多条线程进行垃圾收集。

     2.3Parallel Scavenge收集器

                Parallel Scavenge收集器是一个新生代的垃圾收集器,它是使用了复制算法的收集器,又是并行的多线程编辑器,看上去跟parNew一样

               具体的区别在于:

               1.Parallel Scavenge收集器的关注点不一样,CMS收集器的关注点是尽可能的缩短垃圾收集时用户的停顿的时候 ,但是Parallel Scavenge收集器的目标是达到一个可控的吞吐量。所谓的吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值。所以Parallel Scavenge收集器也称为吞吐量优先的收集器。

               2.自适应调节策略也是Parallel Scavenge收集器与ParNew收集器的区别之一,所谓的自适应调节策略就是虚拟机会根据当前系统的运行情况收集性能监控信息,动态的调节这些参数以提供合适的停顿时间或者最大的吞吐量

      2.4Serial Old收集器

              Serial Old收集器是老年代的版本,它是一个单线程的收集器,使用的是标记-整理算法,两大用途1.在JDK1.5以及之前版本与parallel Scavenge收集器搭配使用。2.另一种的用途就是作为CMS收集器的备用预案。

      2.5Parallel Old收集器

              Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多线程和标记-整理算法,这个收集器在jdk1.6版本以后开始使用

      2.6CMS收集器

              CMS收集器是一种以获得最短回收暂停时间为目标的收集器,整个过程分了四个步骤:1.初始标记2.并发标记3.重新标记4.并发清除,在初始标记和重新标记两个部分还是要Stop the World。初始标记的过程就是标记一下GC Root能直接关联到的对象,速度很快,重新标记就是使用可达性分析算法堆GC Root进行tracing 的过程由于整个过程耗时最长的是并发标记和并发清除的过程收集器线程可以跟用户工作线程并发操作,所以说CMS收集器的内存回收的过程时与用户线程并发执行的。

              CMS优点:并发收集,低停顿。

              CMS3大缺点:

              1.CMS收集器堆CPU资源十分敏感

              2.CMS收集器无法处理浮动数据,所谓的浮动数据就是由于CMS并发清理期间,用户线程还是运行,所以用户线程还在产生垃圾,但是CMS收集器无法在当次的收集中处理他们,只好等到下一次GC的时候再清理他们,这种垃圾就称作为浮动垃圾。

              3.CMS是一项给予标记-清理算法实现的收集器,所以会产生内存碎片的问题

       2.7G1收集器

              G1是一项面向服务端的垃圾收集器,与其他的收集器相比较,G1收集器具有以下的优点:

              1.并发和并行 ,G1使用多CPU和硬件优势来缩短Stop the World的时间,G1收集器在进行垃圾收集的时候java程序还是继续执行。

              2.分代收集,分代的概念虽然在G1收集器中还是存在的,但是G1收集器不用和其他的收集器进行搭配进行垃圾收集,他能独立的管理整个的GC堆,采用不用的方法进行新创建的对象和存货比较久的对象。

              3.空间整合,G1从整体上看是给予标记-整理的算法实现的

              4.可预测的停顿,G1除了追求低停顿之外还会建立可预测的停顿时间的模型,能让使用者明确指定一个长度为M的毫秒的时间片断之内,消耗在垃圾回收的时间不得超过N毫秒。

               G1收集器的工作流程:

               1.初始标记    2.并发标记     3.最终标记     4.筛选回收
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息