文章目录
17、垃圾回收器
一、GC分类与性能指标
垃圾回收器概述
垃圾回收器分类
评估GC的性能指标
- 吞吐量:程序运行时间 / 总运行时间
- 暂停时间:STW,用户线程不工作。
- 内存占用:堆占用的内存大小。
吞吐量(throughput)
暂停时间(pause time)
吞吐量 vs 暂停时间
二、不同的垃圾回收器概述
垃圾回收器发展史
7款经典的垃圾收集器
经典的垃圾收集器
官方文档:https://www.oracle.com/technetwork/java/javase/tech/memorymanagement-whitepaper-1-150020.pdf
7款经典收集器与垃圾分代之间的关系
垃圾收集器的组合关系
查看默认的垃圾收集器
-XX:+PrintCommandLineFlags
三、Serial回收器:串行回收
-XX:+UseSerialGC:表明新生代使用 Serial GC,同时老年代使用 Serial Old GC。
四、ParNew回收器:并行回收
-XX:+UseParNewGC:表明新生代使用ParNew GC。
五、Parallel回收器:吞吐量优先
-XX:+UseParallelGC:表明新生代使用Parallel GC。
-XX:+UseParallelOldGC:表明老年代使用Parallel Old GC。
两者相互激活,打开其中一个, 另一个也跟着被打开
六、CMS回收器:低延迟
个人理解:
- 初始标记:只标记GC Roots,没去标记引用链,为了低延迟,此时STW。
- 并发标记:标记GC Roots对应的引用链,此时与用户线程并行运行。
- 重新标记:因为上一阶段是和用户线程并行运行的,所以在初始标记和并发标记阶段的被标记对象可能会变成垃圾,或者重新被引用,所以需要对被标记的对象重新进行标记,但无法处理浮动垃圾,此时STW。
- 浮动垃圾:指在并发标记阶段,新生成的垃圾,重新标记阶段无法处理。
-XX:+UseConcMarkSweepGC:表明老年代使用CMS GC,同时,年轻代会被触发使用ParNew GC。
JDK后续版本中CMS的变化
七、G1回收器:区域化分代式
特点(优势)
缺点
参数设置
常见的操作步骤
适用场景
分区Region:化整为零
垃圾回收过程
记忆集(Remembered Set(RSet))
G1回收过程一:年轻代GC
G1回收过程二:并发标记过程
G1回收过程三:混合回收
年轻代每次GC都是对整个进行回收的,而老年代只对部分进行回收。
G1回收可选的过程四:Full GC
G1回收过程:补充
G1回收器优化建议
八、垃圾回收器总结
7种经典垃圾回收器总结
这里的并行是垃圾回收器线程的并行(此时为STW);这里的并发是垃圾回收器和用户线程并行。
垃圾回收器组合
怎么选择垃圾回收器?
面试
九、GC日志分析
JDK1.7和JDK1.8堆空间内存分配的区别
JDK1.7
JDK1.7当分配对象空间,堆空间的年轻代空间不足时,进行GC,如果还内存不够,就会把年轻代的数据转到老年代,然后再分配内存。
JDK1.8
而JDK1.8在分配对象内存空间,且堆空间的年轻代空间不足时,进行GC,如果还内存不够,对象的内存空间就直接分配到老年代里。
GC日志文件导出及查看
-Xloggc:./logs/gc.log:将GC日志文件导出到当前项目目录下的logs目录里。
GCEasy官网:https://gceasy.io/
十、垃圾回收器的新发展
JDK11新特性
http://openjdk.java.net/jeps/318
Open JDK12的Shenandoah GC
ZGC
https://docs.oracle.com/en/java/javase/12/gctuning/
JDK14新特性
AliGC
其他垃圾回收器
目前JVM这套视频就更新到上篇(p203),等中下篇和面试题出后就把剩下的笔记一起补上。
感谢康师傅,JVM上篇看完后收获很大。
下一篇笔记:待更新
JVM入门学习笔记——中篇:字节码与类的加载
JVM入门学习笔记——下篇:性能监控与调优
JVM入门学习笔记——大厂面试
学习视频(p169-p203):https://www.bilibili.com/video/BV1PJ411n7xZ?p=169