JVM 垃圾回收器介绍

来源:互联网 发布:淘宝旺铺怎么装修 编辑:程序博客网 时间:2024/05/16 00:34

JAVA虚拟机规范没有规定实现来及回收的算法,因此不同厂商会有不同的垃圾回收器。如下是HotSpot虚拟机基于JDK1.7版本所包含的所有垃圾收集器:
这里写图片描述

Serial(串行)收集

最基本、发展历史最悠久的一种收集器。这个收集器是一个单线程的收集器,只使用一个CPU或一条收集线程去完成垃圾收集工作,最重要的是,在它进行垃圾收集的时候,必须暂停其他所有的工作线程,知道它收集结束。虽然有这个缺点,但是依然是虚拟机运行在Client模式下的默认新生代收集器。优点是:简单而高效,没有线程交互的开销。
这里写图片描述

ParNew收集器

ParNew收集器其实就是Serial收集器的多线程版本,除了使用多条线程进行垃圾收集之外,其他行为和Serial收集器一样。ParNew是许多运行在Server模式下的虚拟机中首选的新生代收集器,其中有一个与性能无关的重要原因,除了Serial收集器外,目前只有ParNew能与老年代的CMS收集器配合使用。ParNew是一种并行的收集器。在垃圾回收中,并行是指:多条垃圾收集线程并行工作,用户线程处于等待状态;并发是指:用户线程和垃圾收集线程同时执行(不一定并行,可能交替执行)。
这里写图片描述

Parallel Scavenge收集器

Parallel Scavenge收集器使用的是复制算法,也是一个并行的多线程收集器。和ParNew相似,但是Parallel Scavenge的关注点不同,CMS收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量,吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)。Parallel Scavenge提供了两种参数用于控制吞吐量
MaxGCPauseMillis 允许GC执行的最大毫秒数,当设置改值垃圾收集器会尽量咋允许的时间内执行GC操作
GCTimeRatio相当于吞吐量的倒数 ,默认为99
以上三种回收的都是新生代,下面介绍老年代收集器。新生代老年代详解

Serial Old收集器

Serial Old收集器是新生代Serial收集器的老年代版本,同样是一个单线程收集器,使用“标记-整理”算法,Serial Old的主要意义也是在于给Client模式下的虚拟机使用。
这里写图片描述

Parallel Old收集器

Parallel Old是新生代收集器Prarllel Scavenge的老年代版本,使用多线程和“标记-整理”算法。与新生代Parallel Scavenge收集器一套使用。
这里写图片描述

CMS收集器

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。主要用于互联网或B/S系统的服务端,这类应用尤其重视服务的响应速度。
从名字可以看出,CMS是基于“标记-清除”算法的,运作过程更加复杂一些,分为4个步骤:
①.初始标记(CMS initial mark) 标记GC Roots直接关联的对象
②.并发标记(CMS concurrenr mark) 可达性分析算法
③.重新标记(CMS remark) 并发变动修改
④.并发清除(CMS concurrent sweep)
其中初始标记、重新标记这两个步骤任然需要停顿其他用户线程。初始标记仅仅只是标记出GC ROOTS能直接关联到的对象,速度很快,并发标记阶段是进行GC ROOTS 根搜索算法阶段,会判定对象是否存活。而重新标记阶段则是为了修正并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间会比初始标记阶段稍长,但比并发标记阶段要短。由于整个过程中耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,所以整体来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。

这里写图片描述

G1收集

G1收集器是最新的一款收集器,JDK1.7才发布,是一种面向服务端应用的垃圾收集器,有如下特点:
(1)并行与并发:G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短Stop-The-World停顿的时间;
(2)分代收集:分代概念在G1中依然得以保留。虽然G1可以不需其他收集器配合就能独立管理整个GC堆,但它能够采用不同的方式去处理新创建的对象和已经存活了一段时间、熬过多次GC的旧对象以获取更好的收集效果;
(3)空间整合:与CMS的“标记-清理”算法不同,G1从整体看来是基于“标记-整理”算法实现的收集器,从局部(两个Region之间)上看是基于“复制”算法实现,无论如何,这两种算法都意味着G1运作期间不会产生内存空间碎片,收集后能提供规整的可用内存;
(4)可预测的停顿时间;

使用G1收集器时,Java堆的内存布局与就与其他收集器有很大差别,它将整个Java堆划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔离的了,它们都是一部分Region(不需要连续)的集合。

G1的收集过程分为以下几个步骤:
(1)初始标记(Initial Marking)
(2)并发标记(Concurrent Marking)
(3)最终标记(Final Marking)
(4)筛选回收(Live Data Counting and Evacuation)
前几个步骤和CMS有很多相似之处。
这里写图片描述

原创粉丝点击