目录
6.3.1 串行GC(Serial)/ (Serial Copying)新生代串行,老年代串行
6.3.3 并行回收GC(Parallel)/(Parallel Scavenge)新生代并行,老年代并行
6.4.1 串行GC(Serial Old)/ (Serial MSC)JAVA6之前有
6.4.2 并行GC(Parallel Old)/ (Parallel MSC)
垃圾回收算法:4种
复制用在新生代,后两种用在老年代。
1 GC垃圾回收算法和垃圾收集器的关系?分别是什么?
GC算法(引用计数/复制/标清/标整)是内存回收的方法论,垃圾收集器就是算法落地实现(即引用计数,复制,标记清除,标记压缩整理四种算法的实现类)。
因为目前位置还没有完美的收集器出现,更加没有万能的收集器,知识针对具体应用最合适的收集器,进行分代收集。
有4种垃圾收集器。
1.1 四种主要的垃圾收集器
1.1.1 串行垃圾回收器(Serial):
它为单线程环境设计,且只使用一个线程进行垃圾回收,会暂停所有的用户线程。所以不适合服务器环境。
例子:好比吃饭时被打断,中间打扫了一下,打扫后继续用餐。
总结:单线程环境,单线程垃圾回收,用户程序会暂停。
1.1.2 并行垃圾回收器(Parallel):
多个垃圾收集线程并行工作,此时用户现场是暂停的,停留时间比串行短,适用于科学计算/大数据处理首台处理等弱交互场景。
例子:好比吃饭时被打断,中间多个人一起打扫了一下,打扫后继续用餐。
总结:多个垃圾线程,用户程序会暂停
1.1.3 并发垃圾回收器(CMS)
用户线程和垃圾收集线程同时执行(不一定是并行,可能交替执行),不需要停顿用户线程互联网公司多用它,适用对响应时间有要求的场景。
也就是:一边标记清除,一边垃圾回收,停顿时间比前两者更好。
可能存在内存碎片
1.1.4 G1
G1垃圾回收器将堆内存分割成不同的区域然后并发的对其进行垃圾回收。
java11出现了ZGC
2 GC算法总体概览图
3 怎么查看服务器默认的垃圾收集器是哪个?
查看默认配置JVM参数命令:java -XX:+PrintCommandLineFlags -version
第三行最后面显示了默认垃圾收集器: -XX:+UseParallelGC (并行回收)
4 JAVA的GC回收类型主要是以下七种:
串行回收:-XX:+UseSerialGC
并行回收:-XX:+UseParallelGC
并发标记回收:CMS(UseConcMarkSweepGC)
young区的串行回收方式:UseParallelOldGC
老年区并行GC:UseParallelOldGC
G1GC:UsseG1GC
串行老年区GC(已作废):UseSerialOldGC:
4.1 源码(源码只有六个是因为UseSerialOldGC已经不用了):
5 垃圾收集器介绍
垃圾收集器就来具体实现这些GC算法并实现内存回收。
不同厂商,不同版本的虚拟机实现差别很大,HotSpot中包含的收集器如下图所示:
6 如何选择垃圾收集器
6.1 部分参数预先说明:
- DefNew: Default New Generation //默认新生代用的
- Tenured: Old //老年区
- ParNew: Parallel New Generation //新生代并行垃圾回收
- PSYoungGen: Parallel Scavenge //年轻代并行垃圾回收
- ParOldGen: Parallel Old Generation //老年代并行垃圾回收
6.2 Server/Client模式分别是什么意思?
6.2.1 适用范围:
掌握Service模式即可,Client模式不会用(一般不用)
6.2.2 操作系统:
- 32位Window操作系统,不论硬件如何,都默认使用Client的JVM模式。
- 32位其他操作系统,2G内存同时又2个CPU以上的用Server模式,低于该配置的还是Client模式。
- 64位only server模式 (一般都是64位,故只需掌握Service)
假设新生代配了串行垃圾回收,老年代会自动配相应的。所以新生代的配置尤为重要。
6.3 新生代
6.3.1 串行GC(Serial)/ (Serial Copying)新生代串行,老年代串行
串行收集器:Serial收集器,一般工作不用
一句话:一个单线程的收集器,在进行垃圾收集的时候,必须暂停其他所有的工作线程直到它收集结束。(具体可参考之前的餐厅吃饭被中断打扫的案例)
串行收集器是最古老,最稳定以及效率最高的收集器,只使用一个线程取回收但其在进行垃圾收集过程种可能会产生较长的停顿(Stop-The-World状态)。虽然在收集垃圾过程中需要暂停所有其他工作线程,但它简单高效,对于限定单个CPU环境来说,没有线程交互的开销可以获得最高的单线程垃圾收集效率。因此Serial垃圾收集器依然是JAVA虚拟机运行在Client模式下默认的新生代垃圾收集器。
对应的JVM参数: -XX:+UseSerialGC
开启后会使用:Serial(Young区用)+ Serial Old(Old区用)的收集器组合
表示:新生代、老年代都会使用串行回收收集器,新生代使用复制算法,老年代使用标记-整理算法
-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+UseSerialGC
6.3.1.1 DEMO
串行GC 调试
-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseSerialGC
可以看出,新生代和老年代用的是相对应的 都是串行。
6.3.2 并行GC(ParNew)新生代并行,老年代串行
并行收集器:使用多线程进行垃圾回收,在垃圾收集时,会Stop-The-World暂停其他所有的工作线程直到它收集结束。
6.3.2.1 DEMO
配置参数:
输出:
可以看出已经变成了并行收集
6.3.3 并行回收GC(Parallel)/(Parallel Scavenge)新生代并行,老年代并行
Parallel Scavenge收集器类似ParNew也是一个新生代垃圾收集器,使用复制算法,也是一个并行的多线程的垃圾收集器,俗称吞吐量优先收集器。一句话:串行收集器在新生代和老年代的并行化。
输出
看出使用了并行GC后,新生代和老年代都是并行。
6.4 老年代
6.4.1 串行GC(Serial Old)/ (Serial MSC)JAVA6之前有
CMS出问题时会用该收集器
6.4.2 并行GC(Parallel Old)/ (Parallel MSC)
可发现老年区激活了并行,新生代也激活了并行,所以激活任意一个,都是互相激活的。
6.4.3 并行回收GC(CMS)
前情回顾:标记清除(CMS就是标记清除理念的落地实现)
标记清除 优势 节约内存空间,劣势 产生内存碎片
重新标记相当于二次确认,可能有对象不需要清除了,所以重新标记
CMS算法简略描述(四步概述)
输出
6.5 垃圾收集器配置代码总结
底层代码:4.1 源码(源码只有六个是因为UseSerialOldGC已经不用了)
实际代码:6.3.2 DEMO
7 生产上如何选择合适的垃圾收集器?
8 G1垃圾收集器
8.1 G1是什么
8.1.2 特点
8.2 底层原理
8.2.1 Region区域化垃圾收集器
最大的好处是化整为零,避免全内存扫描,只需要按照区域来进行扫描即可。
8.2.2 回收步骤
8.2.3 四步过程
常用参数配置
9 JVMGC+SpringBoot微服务生产部署调参优化
1.开发工微服务我程
2.maven clean打包
3.微服务启动时,配置JVM/GC调优参数
- 使用mvn clean package 打包
- 在有包的路径下,运行jar命令,公式:java -server jvm的各种参数 -jar 第一步上面的jar/war包名字
10 参考文献
以上内容均来自于下方视频,博客内容仅作为个人学习笔记记录