垃圾收集算法

假如想象 提交于 2020-02-08 16:59:07

收集算法思想:

垃圾收集算法的实现涉及大量的程序细节,仅介绍几种算法的思想以及发展过程。

  1. 标记-清除算法
    最基础的后手算法,算法可分为标记、清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象,标记算法即二次标记过程。
    不足之处:
    ①效率问题,标记和清除两个过程的效率都不高
    ②空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾回收动作
  2. 复制算法
    解决标记-清除算法效率问题,讲可用内存划分为内存大小相同的两块,每次只使用其中一块。当一块内存用完时,就将还存活着的对象复制到另外一块上面,然后再把使用过的内存一次性清理。这样使得内存分配实现简单、运行高效,仅需要按顺序分配内存空间即可。
    缺点:内存可用空间缩小为原来的一半。
    解决方案:将该类算法应用于新生代(新生代对象98%“朝生夕死”),无需按1:1划分,可将新生代内存划分为一块较大的Eden空间和两块较小的Survivor空间,每次使用一块Eden空间与一块Survivor空间。每当回收时对正在使用的Eden和Survivor空间进行垃圾收集,存活的对象将一次性复制到空闲的另一块Survivor空间(大对象将直接进入老年代)。
    担保:10%的内存区域并不是每次都足以容纳继续存活的新生代对象,因此需要老年代对新生代进行担保,Survivor内存不足时,部分新生代对象将直接进入老年代。
  3. 标记-整理算法
    复制算法在对象存活率较高时进行较多的复制操作,效率将会变低。更关键的是不想浪费50%的空间就要进行内存担保,因此老年代一般不能直接选用复制算法。
    整理-标记算法,标记过程仍然与"标记-清除"算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都想一端移动,然后直接清理掉端边界以外的内存。
  4. 分代收集算法
    一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代因对象存活率高,没有额外空间进行分配担保,就必须使用"标记-清理"或者"标记-整理"的算法进行回收。

垃圾收集器实现:
Java虚拟机规范中堆垃圾收集器应该如何实现并没有任何规定,因此不同的厂商、不同版本的虚拟机提供的垃圾收集器都有很大差别,并且一般都会提供参数供用户根据自己的应用特点和要求组合出各个年代所使用的的收集器。

  1. Serial收集器
    最基本、发展历史最悠久的收集器(Client模式下的默认收集器),单线程收集器,执行过程中会暂停其他所有的工作线程,知道它收集结束。
  2. ParNew收集器
    Serial的多线程版本,除使用多线程进行垃圾收集之外,其余行为包括Serial收集器可用的所有控制参数
  3. Parallel Scavenge收集器
    新生代收集器,使用标记-复制算法,切实并行的多线程收集器。该收集器与其它收集器侧重点不同,CMS等收集器的关注点尽可能的缩短垃圾收集时的用户线程停顿时间(注重单次停顿,不注重停顿频率,适合要求响应速度快的应用,例如B/S架构服务器、客户端等),而Parallel Scavenge收集器的目地是达到一个可控制的吞吐量(即运行代码时间/(运行用户代码时间+垃圾收集时间),即注重单次停顿时间与停顿频率的乘机)
  4. Serial Old收集器
    Serial收集器的老年代版本,它同样是一个单线程收集器,使用"标记-整理"算法。主要意义也是在于给Client模式下的虚拟机使用。
  5. Parallel Old收集器
    Parallel Scavenge收集器的老年代版本,适用于注重吞吐量以及CPU资源敏感的场合与Parallel Scavenge搭配使用
  6. CMS收集器
    CMS收集器是一种以获取最短回收挺短时间为目标的收集器。目前大部分的Java应用集中在互联网站或者B/S系统的服务端上,这类应用尤为重视服务的响应速度,希望系统停顿时间最短,以给用户较好的体验。
    可分为四个工作过程:
    ①初始标记:其它工作线程停止,对GC Roots直接相连的节点进行标记
    ②并发标记:与其它工作线程并发执行,对被标记的直接相连节点进行Trace
    ③重新标记:其它工作线程停止,修正并发标记过程因用户程序继续运作而导致的标记变动
    ④并发清除:对被标记内存进行评估、排序、清除
  7. G1收集器
    面向服务端应用的垃圾收集器:
    特点:
    ①并行与并发
    ②分代收集
    ③空间整合:整体上采用"标记-整理算法",局部区域(Region)上使用"标记-复制算法"
    ④可预测的停顿
    其它收集器将内存划分为新生代、老年代,而G1则将内存划分为多个大小相等的独立Region,新生代、老生代将是一部分Region的集合。每次优先收集回收价值最大的Region,保证在有限的时间内可以获取尽可能高的收集效率。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!