安全点(Safepoint)
一次GC操作是一次地球停转事件(Stop the world event)。这个时候所有的用户进程都会等待GC操作的完成。所以如何才能保证进入GC操作是安全的,SafePoint的选定既不能太少以至于让GC等待的时间太长,也不能过于频繁以至于过分增大运行时的负荷。
如何选取安全点:
安全点的选择以程序“是否具有让程序长时间执行的特征”为标准进行选定的。这些特征是:方法的调用,循环的跳转,异常跳转,具有这些特征的指令才会产生SafePoint。
HotSpot的所有收集器
以下是基于JDK1.7 Update 14之后的HotSpot:
这里一共有7中不同的作用与不同分代的收集器,如果两个收集器之间存在连线,则表示它们可以搭配使用。属于新生代的收集器有(Serial,ParNew,Parallel Scavenge),属于老年代的收集器有(CMS,Serial Old, Parallel Old),
Serial收集器和Serial Old收集器
Serial收集器(新生代)
特点:一个单线程收集器。进行垃圾清理的时候必须暂停其他所有的工作线程,直到它的收集工作完成。(Stop the world event)
算法:复制算法
缺点:用户体验不好(因为Stop the world)。
优点:简单高效,对于单个CPU环境来说没有线程交互的开销。
Serial Old收集器(老年代)
特点:单线程收集器
算法:标记-整理
缺点:用户体验不好(因为Stop the world)。
优点:简单高效,对于单个CPU环境来说没有线程交互的开销。
示意图:
ParNew 收集器和Serial Old收集器
ParNew收集器(新生代)
特点:Serial的多线程版本,除了Serial之外只有它可以和CMS收集器配合使用
算法:复制算法
示意图:
Parallel Scavenge和Parallel Old收集器
特点:吞吐量优先组合
适用:注重吞吐量和CPU资源敏感的场合
Parallel Scavenge(新生代)
特点:吞吐量优先,多线程
算法:复制算法
Parallel Old(老年代)
特点:吞吐量优先,多线程
算法:标记-整理算法
示意图:
CMS收集器
特点:获得最短停顿时间
算法:标记-清除
步骤:
1:初始标记(CMS initial mark)--stop the world event
2:并发标记(CMS concurrent mark)
3:重新标记(CMS remark)--stop the world event
4:并发清除(CMS concurrent sweep)
主要缺点:
1:对CPU资源非常敏感。
2:无法实现处理浮动垃圾,可能出现“Concurrent Mode Failure”失败而导致一次Full GC的产生。
3:基于“标记-清除”算法,会产生大量空间碎片。