垃圾收集器表示内存回收的具体实现,区别于垃圾收集算法点击查看(相当于方法论),收集器基于收集算法实现。同时为了降低回收内存过程中对用户线程的影响的时间,衍生出不同的收集器。一般情况下年轻代需要回收的内存较多,存活对象较少,采用复制算法,年老代存活对象较多,需要回收的内存较少,采用标记清除/整理算法。
1.serial收集器:串行收集器,采用单线程回收内存,同时暂停所有用户线程直到收集结束。采用复制算法,属于年轻代收集器。
2.serial old收集器:串行收集器,采用单线程回收内存,同时暂停所有用户线程直到收集结束。采用标记整理算法,属于年老代收集器。
3.ParNew收集器:串行并发收集器,采用多线程回收内存,同时暂停所有用户线程直到收集结束,与serial收集器完全一样采用复制算法,属于年轻代收集器,只是采用多线程。
4.Parallel scavenge收集器:串行并发收集器,采用多线程回收内存,同时暂停所有用户线程直到收集结束,与ParNew收集器完全一样,采用复制算法,属于年轻代收集器。只是不再关注暂停用户线程的时间长短,而是关注暂停用户线程的时间占总运行时间的比例。又叫吞吐量,运行用户代码时间/(运行用户代码时间+垃圾收集时间)。
5.Parallel old 收集器:串行并发收集器,采用多线程回收内存,同时暂停所有用户线程直到收集结束,采用标记整理算法,属于年老代收集器,为配合Parallel scavenge收集器而生。
6.cms(concurrent mark sweep)收集器:并行并发收集器,采用多线程回收内存,部分过程暂停用户线程,采用标记清除算法,属于年老代收集器。
初始标记:串行
并发标记:并行并发
重新标记:串行并发
并发清除:并行并发
7.g1(garbage first) 收集器:并行并发收集器,采用多线程回收内存,部分过程暂停用户线程,整体采用标记整理算法,局部采用复制算法,属于分代收集器,独立管理整个gc堆。
初始标记:串行
并发标记:并行并发
最终标记:串行并发(也可并行,效率比串行低)
筛选回收:并行并发
配置运行参数
-XX:+UseSerialGC
serial收集器+serial old收集器组合完成内存回收,serial收集器负责回收年轻代,serial old收集器负责回收年老代。
-XX:+UseParNewGC
ParNew收集器+serial old 收集器,ParNew收集器负责回收年轻代,serial old收集器负责回收年老代。
-XX:+UseConcMarkSweepGC
ParNew + CMS + serial old,serial old作为cms出现concurrent mode failure失败时的替补,负责年老代。
-XX:+UseParallelGC
Parallel scavenge + serial old,Parallel scavenge年轻代,serial old年老代
-XX:+UseParallelOldGC
Parallel scavenge + Parallel old,Parallel scavenge年轻代,Parallel old年老代
-XX:+UseG1GC,使用G1单独管理。
G1和CMS比较
1,G1独立管理堆内存。CMS需要配合。
2,CMS使用标记清除,G1标记整理或复制,自适应回收。
3,CMS产生内存碎片。