JVM入门学习笔记——上篇:内存与垃圾回收(17)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值