垃圾收集器
Serial收集器
单线程收集器,在垃圾收集的过程中必须暂停到其他所有的工作线程。
虚拟机在client模式下的默认新生代收集器
ParNew收集器
是Serial的多线程版本,是一款并行收集器,可以用-XX:ParallelGCThreads来控制垃圾收集的线程数。
Parallel Scavenge 收集器
新生代并行收集器,关注垃圾收集事用户线程的停顿时间,目标是达到一个可控制的吞吐量。
-XX:MaxGCPauseMillis 参数允许的值是一个大于0的毫秒数,收集器尽可能地保证内存回收花费的时间不超过该值。
-XX:GCTimeRatio 参数是一个大于0小于100的整数,即用户线程时间与垃圾收集时间的比率,相当于吞吐量的倒数,默认值是99,那么允许1%的垃圾回收时间。
-XX:UseAdaptiveSizePolicy 开关参数,打开后,不需要设置新生代、Eden与Survivor的比例、今生老年代对象大小等参数,虚拟机动态调节。
Serial Old 收集器
Serial old 收集器是Serial 收集器的老年代版本,是一个但线程收集器,使用标记整理算法。有两个用途:1. JDK1.5之前的版本与Parallel Scavenge收集器搭配使用;2. 作为CMS收集器的后备方案,在并发收集发生Concurrent Mode Failure时使用。
Paralel Old 收集器
CMS 收集器
老年代,标记清理算法。
是一种以获取最短回收停顿为目标的收集器。分四个步骤:初始标记->并发标记->重新标记->并发清除,初始标记和重新标记仍需要 Stop The World。
缺点:1. 由于并发,对CPU资源非常敏感;2. 无法收集浮动垃圾;3. 标记清除算法产生大量空间碎片。
由于并发清理阶段,用户线程产生的垃圾,CMS无法清除,这部分垃圾称为浮动垃圾。由于并发,CMS不能像其他垃圾收集器那样等到老年代几乎填满在进行收集,需要预留一部分让程序运行。-XX:CMSInitiatingOccupancyFraction 的值来设置触发垃圾收集的百分比,JDK1.5默认68%,JDK1.6默认92%。
由于会产生空间碎片,老年代可能无法为大对象提供内存就要触发 Full GC。-XX:+UserCMSCompactAtFullCollection 开关参数,默认开启。用于进行Full GC时开启内存碎片的合并整理。-XX:CMSFullGCsBeforeCompaction 这个参数用于设置执行多少次不压缩的Full GC后,跟着来一次带压缩的,默认值时0,表示每次进入Full GC时都进行碎片整理。
G1 收集器
特点:1. 并行与并发;2.分代收集;3.空间整合;4.可预测的停顿。
化整为零的思路,把java堆分成多个region,使用remebered set避免全堆扫描,如果引用对象在不通的region,通过CarTable把相关引用信息记录到被引用对象所属的Region的Remembered Set中,当进行内存回收时,在GC根结点的枚举范围加入Remembered Set即可保证不对全堆扫描也不会有遗漏。