垃圾收集算法是垃圾回收的方法论, 垃圾回收器则是垃圾回收的具体实现。
各个厂商差异较大, 这里只讨论常用的HotSpot虚拟机。
HotSpot垃圾收集器可搭配使用的关系图。
为了应对不同的场景和需求,需要选择不同的新生代和年老代垃圾收集器搭配使用。
串行收集器,采用复制算法, HotSpot运行在Client模式下的默认新生代收集器。
特点:
单线程, 一但进行垃圾收集必须暂停其他所有线程(Stop The World)
单线程垃圾收集简单高效。
参数 :
-XX:+UseSerialGC 使用Serial作为新生代收集器
并行收集器, 采用复制算法, Serial的多线程版本, Server模式下的首选新生代收集器
特点:
多线程, 多核CPU下对系统资源的利用率较高, 其余属性与Serial相同.
除了Serial外唯一能和CMS收集器配合工作的收集器.
参数:
-XX:+UseParNewGC 指定使用ParNew垃圾收集器
-XX:ParallelGCThreads 指定垃圾收集的线程数
并行多线程新生代收集器, 采用复制算法.
特点:
参数:
-XX: MaxGCPauseMillis 收集器尽力保证收集时间不超过设定值.
-XX: GCTimeRatio 值是一个大于0小于100的整数, 即垃圾收集时间占总时间的比例.
-XX:+UseAdaptiveSizePolicy 开关参数,自动调整定-Xmn、 -XX:SurvivorRatio、-XX:PretenureSizeThreshold等
参数以提供最合适的停顿时间和吞吐量.GC自适应调节.
-XX:+UseParallelGC 新生代使用Parallel收集器
-XX:+UseParallelOldGC 老年代使用Parallel old收集器
Serial的老年代版本, 单线程收集器, 采用标记-整理算法, 在Client模式下使用.
特性:
Parallel Scavenge的年老代版本, 多线程上映标记-整理算法, jdk1.6中开始提供.
特性:
目前主流的互联网企业选用的垃圾收集器. 使用标记-清除算法的年老代并发收集器
特性:
收集过程:
整个过程耗时最长的并发标记和并发清理都是并发执行的, 因此可以认为CMS是与用户线程并发执行的.
特点:
款面向服务端应用的收集器,主要目标用于配备多颗 CPU 的服务器治理大内存.
整个Java堆划分成为多个大小相等的区域Region, 新生代和年老代是一部分Region的集合.
根据每个Region里面垃圾堆积的价值大小, 维护一个优先列表, 每次根据列表回收价值最大的Region, 保证了回收的效率.
建立Remembered Set 避免不同Region和区域间的对象引用. 每个Region都有一个Remembered Set, 当对引用进行操作时会维护被引用对象所属的Region的Remembered Set.
特点:
收集过程:
参考:《深入理解Java虚拟机》