Stop - the - World:
- JVM由于要执行GC而停止了应用程序执行
- 任何一种GC算法中都会发生
- 多数GC优化通过减少Stop - the - World发生的时间来提高程序性能(高吞吐、低停顿)
吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)
常见的垃圾收集器
新生代垃圾收集器:
Serial收集器(复制算法):
- 单线程收集,进行垃圾收集时,必须暂停所有工作线程
- 简单高效,Client模式下默认的年轻代收集器
ParNew收集器(复制算法):
- 新生代收集器,可以认为是Serial收集器的多线程版本,在多核CPU环境下有着比Serial更好的表现
Parallel Scavenge收集器(复制算法):
- 多线程收集,其余的行为、特点和Serial收集器一样
- 单核执行效率不如Serial,在多核下执行才有优势
- 比起关注用户线程停顿时间,更关注系统的吞吐量
- 在多核下执行才有优势,Server模式下默认的年轻代收集器
老年代垃圾收集器:
Serial Old收集器(标记 - 整理算法):
- 单线程收集,进行垃圾收集时,必须暂停所有工作线程
- 简单高效,Client模式下默认的老年代收集器
Parallel Old收集器(标记 - 整理算法):
- 多线程,吞吐量优先
CMS收集器(标记 - 清除算法):
- 初始标记:stop - the - world
- 并发标记:并发追溯标记,程序不会停顿
- 并发预清理:查找执行并发标记阶段从年轻代晋升到老年代的对象
- 重新标记:暂停虚拟机,扫描CMS堆中的剩余对象
- 并发清理:清理垃圾对象,程序不会停顿
- 并发重置:重置CMS收集器的数据结构
G1收集器(复制 + 标记 - 整理算法)(既用于年轻代也用于老年代):
G1收集器可以实现在基本不牺牲吞吐量的情况下完成低停顿的内存回收,这是由于它极力的避免全区域的回收,G1收集器将Java堆(包括新生代和老年代)划分为多个区域(Region),并在后台维护一个优先列表,每次根据允许的时间,优先回收垃圾最多的区域 。
特点:
- 并行和并发
- 分代收集
- 空间整合(解决内存碎片问题)
- 可预测的停顿,可以非常精确地控制停顿
G1 收集器:
- 将整个Java堆内存划分成多个大小相等的Region
- 年轻代和老年代不再物理隔离