相关概念:
并行(Parallel):指多条垃圾收集过程并行工作,但此时用户线程仍然处于等待状态
并发(Concurrent):指用户线程与垃圾收集线程同时执行,用户程序在继续运行,而垃圾收集程序运行于另一个CPU上
垃圾收集器是内存回收的具体实现,一个HotSpot虚拟机包含7中用于不同分代的收集器:
(1)Serial收集器:单线程收集器使用一个CPU或一条收集线程去完成垃圾收集工作,它进行垃圾收集时,必须停掉所有其他的工作线程,使用复制算法。是虚拟机运行在Client模式下的默认新生代收集器,优点在于简单而高效,对于限定的单个CPU的环境来说,由于没有线程交互开销,专心做垃圾收集器可以获得最高的单线程收集效率
(2)ParNew收集器:Serial收集器的多线程版本,除了使用多线程收集外,其他与serial没有太大区别,是许多运行在Server模式下的虚拟机中首选的新生代收集器,只有它能和CMS收集器合作
(3)Parallel Scavenge收集器:新生代收集器,也是使用复制算法的收集器,又是并行的多线程收集器。CMS等收集器的目标是尽可能缩短垃圾收集是用户线程的停顿时间,而Parallel Scavenge收集器的目标是达到一个可控制的吞吐量,吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),前者适合需要与用户交互的程序,后者适合后台运算而不需要太多交互的任务
(4)Serial Old收集器:Serial收集器的老年代版本,使用“标记-整理”算法,其它与Serial收集器类似
(5)Parallel Old收集器:Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法
(6)CMS(Concurrent Mark Sweep)收集器:一种以获取最短回收停顿时间为目标的收集器,基于“标记-清除”算法实现,运作过程分为4个步骤:
a.初始标记(CMS initial mark):标记GC Roots所直接关联的对象,需要停止其它线程,但时间很短
b.并发标记(CMS concurrent mark):进行可达性分析标记间接关联的对象,不需要停止其它线程,与用户线程并发工作
c.重新标记(CMS remark):修正并发标记期间因用户程序继续运行导致标记产生变动的那部分对象的标记记录,也需要停止其它线程,时间略长于初始标记,但远小于并发标记
d.并发清除(CMS concurrent sweep):垃圾清理过程,与用户线程并发工作
(7)G1收集器:
特点:a.并发与并行:能充分利用对CPU、多核环境下的硬件优势,使用多个CPU来缩短停顿时间,部分需要停顿其他Java线程的动作可以通过并发让程序继续运行。b.空间整合:基于“标记-整理”法和复制算法实现的,不会产生内存空间碎片。c.可预测的停顿,使用者可以知道消耗在垃圾收集上的时间
运作步骤:a.初始标记 b.并发标记 c最终标记 d:筛选回收