目录
Parallel Scavenge回收器:吞吐量优先(java8默认的垃圾收集器)
GC分类和性能指标
分类
- 这里并行指的是多个垃圾回收器线程并行执行,并不是用户和垃圾回收器并行执行,垃圾回收器类似操作系统那个io阻塞,执行的时候用户线程是要暂停的,并行垃圾回收器就是暂停时间短一点
- 这里的并发指的就是能和用户线程交替执行
性能指标
- 下面标红的才是我们重点要去理解的,即吞吐量、暂停时间、内存占用
- 吞吐量优先和暂停时间优先的对比
- 现在的设计标注就是折中的
不同的垃圾回收器概述
发展历史
7款经典的垃圾收集器
垃圾收集器的组合关系
- 右图命令是查看当前jdk版本使用默认垃圾收集器
Serial回收器:串行回收
ParNew回收器:并行回收
- 并行指的是可以有多个垃圾回收器线程同时运行回收,这样暂停时间就会短一点,用户线程同样要暂停
Parallel Scavenge回收器:吞吐量优先(java8默认的垃圾收集器)
- 可控制的吞吐量,可以自己调节参数来控制以及一个自适应策略
- 参数配置
CMS回收器:低延迟
介绍
工作原理
- 初始标记阶段仅仅是标记能被GC Roots直接关联到的对象,还没递归遍历下去
- 并发标记阶段就是递归遍历下去标记
- 重新标记阶段是为了修正因用户程序运作导致标记产生变动的那一部分对象标记记录。注意:重新标记只是对并发标记阶段标记的对象进行一个确认,确认是不是垃圾,如果并发标记阶段用户线程产生的新垃圾,重新标记阶段是无法标记这些的,重新标记只是对并发标记阶段标记的对象做确认!!这个非常重要!!!
- 并发清除阶段就是清除垃圾的过程了
CMS的特点与弊端
- 特点就是低延迟,没啥好说的,可以与用户线程并发执行
- 还有一个就是CMS运行期间预留的内存不够程序使用,就会出现Concurrent Mode Failure,这时候只能用备用方案,使用Serial Old在老年代回收一下,因为Serial Old是单线程的,这样停顿时间就很长了
- 缺点也比较明显,采用的是标记-清除算法,清除的时候内存是不连续的,也就是内存碎片化, 下次分配内存极为麻烦,还得额外维护一个空闲列表
- 不换成标记-压缩算法也是有原因的,因为这个与用户线程并发执行,如果用标记-压缩,清除完还对内存进行整理,改变了对象的地址,那对正在运行的用户线程来说是非常崩溃的,每次都需要更改指针引用,得不偿失;也得出一个结论,内存整理是无法并发执行的,这样太过崩溃。
- 内存碎片是非常严重的,如果此时有许多访问量要创建对象,因为内存不连续的问题(空闲列表并不能像指针碰撞一样,自由划分空间,内存不连续,导致空闲列表每块区域都是固定的),分配大对象极容易触发Full GC,Full GC就得STW,在web项目使用CMS出现这种情况,用户直接卡半天。所以这是一个很严重的问题
- 对cpu资源敏感就不用多说了,就是与用户线程抢占资源呗
- 浮动垃圾指的就是并发标记阶段用户线程产生的垃圾,这些垃圾CMS是处理不了的,可能再导致Full GC产生!
参数设置
小结
G1回收器:区域化分代式
区域分代化
特点
缺点
参数设置
常见操作步骤
适用场景
分区Region:化整为零
垃圾回收过程概述
回收过程一:年轻代GC
回收过程二:并发标记过程
回收过程三:混合回收
回收可选的过程四:Full GC
垃圾回收器总结
GC日志分析
参数
Minor GC日志打印出来的信息详解
- PSYoungGen指的就是Parallel Scavenge垃圾回收器(JDK8默认的年轻代就是这个垃圾回收器)
Full GC日志打印出来的信息详解
- PSOldGen指的就是Parallel Old垃圾回收器(JDK8默认的老年代就是这个垃圾回收器)