本文共 1298 字,大约阅读时间需要 4 分钟。
转载:
这里讨论JDK 1.7 Update 14之后的HotSpot虚拟机,包含的虚拟机如下图所示(存在连线的表示可以搭配使用):
最基本、发展历史最悠久,在JDK 1.3之前是新生代收集的唯一选择;
是一个单线程(只会使用一个收集线程,且必须暂停所有工作线程)的收集器,采用的是复制算法;
现在依然是虚拟机运行在Client模式下的默认新生代收集器,主要就是因为它简单而高效(没有线程交互的开销);
其实就是Serial收集器的多线程版本,采用的也是复制算法;
ParNew收集器在单CPU环境中绝对不会有比Serial收集器更好的效果;
是许多运行在Server模式下虚拟机首选的新生代收集器,重要原因就是除了Serial收集器外,只有它能与CMS收集器配合工作;
是一种以获取最短回收停顿时间为目标的收集器,特别适合互联网站或者B/S的服务端;
它是基于 标记-清除 算法实现的,主要包括4个步骤:
还有3个明显的缺点:
特点:
并行与并发(充分利用多核多CPU缩短STW时间);
分代收集(独立管理整个Java堆,但针对不同年龄的对象采取不同的策略); 空间整合(局部看是基于复制算法,从整体来看是基于标记-整理算法,都不会产生内存碎片); 可预测的停顿(可以明确指定在一个长度为M毫秒的时间片内垃圾收集不会超过N毫秒);
G1垃圾回收分为几个步骤:
初始标记(标记一下GC Roots能直接关联的对象并修改TAMS值,需要STW但耗时很短)
并发标记(从GC Root从堆中对象进行可达性分析找存活的对象,耗时较长但可以与用户线程并发执行)
最终标记(为了修正并发标记期间产生变动的那一部分标记记录,这一期间的变化记录在Remembered
Set Log里,然后合并到Remembered Set里,该阶段需要STW但是可并行执行)筛选回收(对各个Region回收价值排序,根据用户期望的GC停顿时间制定回收计划来回收);