垃圾收集器
收集算法未内存回收的方法论,则垃圾回收则为内存回收的具体实现。主流的垃圾收集器为 Serial,ParNew,Parrallel Scavenge, CMS,Serial OLd, Parrel Old, G1.
Serial收集器
- GC线程 新生代采取复制算法,暂停所有用户线程
- GC线程 老年代采取标记整理算法,暂停所有用户线程
虚拟机运行在client模式下默认的新生代收集器
优势
- 简单而高效
- 对于现场定单个CPU环境来说,Serial收集器由于没有线程开销,可以专心做垃圾收集自然可以获得最高的单线程收集效率
ParNew收集器
是多线程的Serial收集器
- 新生代采用复制算法,暂停所有用户线程
- 老年代采取标记整理算法, 暂停所有用户线程
优势
运行在Server模式下的首选的新生代收集器
PS:两个词 并行 并发
- 并行: 多条垃圾回收线程并行工作,但用户线程仍处于 等待状态
- 并发: 用户线程与垃圾回收线程同时执行,但不一定是并行的,可能会使用户线程在运行,但垃圾收集程序运行于另一个CPU上
Parrallel New
不同于其他垃圾收集器,ParrallelNew的目标达到一个可控制的吞吐量(运行用户代码时间/(运行用户代码时间+GC消耗时间)),停顿时间越短就越适合需要与用户交互的程序,而搞吞吐量则可以高效率的利用CPU时间,适合在后台运算二不需要太多交互的任务。
Serial Old
Serial收集器的老年代版本,单线程标记整理算法,在client模式下的虚拟机使用。
Parallel Old
ParrellScavenge的老年代版本,使用多线程和标记整理算法。
CMS收集器
以获取最短回收停顿时间为目标的收集器。
- 初始标记 STW
- 并发标记 和用户线程一起
- 重新标记 STW
- 并发清除 和用户线程一起
缺点
- 对CPU资源敏感
- 无法处理浮动垃圾
- 基于标记清除算法,有大量的碎片
G1
G1之前的 收集器 收集范围为整个新生代或者老年代,G1则是 将整个JAVA堆划分为多个大小相等的区域,虽然还保留新生代和老年代的概念,但是新生代和老年代不再是物理隔离,而是一部分region的集合。可预测停顿是 建立在其有计划的进行全区域的垃圾收集,G1跟踪各个区域内的垃圾堆积的价值大小,在后台维护一个有限列表,每次根据允许的手机时间,手机回收价值最大的区域。
- 并行和并发
- 分代收集
- 空间整合 G1从整体来看是基于 标记 整理,从局部看 是 基于复制算法的。
- 可预测的停顿
ways
- 初始标记 STW
- 并发标记
- 最终标记STW
- 筛选回收 STW