垃圾收集器,垃圾回收算法

目录

1 GC垃圾回收算法和垃圾收集器的关系?分别是什么? 

1.1 四种主要的垃圾收集器

1.1.1 串行垃圾回收器(Serial):

1.1.2 并行垃圾回收器(Parallel): 

1.1.3 并发垃圾回收器(CMS) 

1.1.4 G1

2 GC算法总体概览图

3 怎么查看服务器默认的垃圾收集器是哪个?

4 JAVA的GC回收类型主要是以下七种: 

5 垃圾收集器介绍

6 如何选择垃圾收集器

6.1 部分参数预先说明:

6.2 Server/Client模式分别是什么意思?

6.2.1  适用范围:

6.2.2  操作系统:

6.3 新生代

6.3.1 串行GC(Serial)/ (Serial Copying)新生代串行,老年代串行

6.3.2 并行GC(ParNew)新生代并行,老年代串行

6.3.3 并行回收GC(Parallel)/(Parallel Scavenge)新生代并行,老年代并行

6.4 老年代

6.4.1 串行GC(Serial Old)/ (Serial MSC)JAVA6之前有

6.4.2 并行GC(Parallel Old)/ (Parallel MSC)

6.4.3 并行回收GC(CMS)

6.5 垃圾收集器配置代码总结

7 生产上如何选择合适的垃圾收集器?

8 G1垃圾收集器

8.1 G1是什么​

8.1.2 特点 

8.2  底层原理

8.2.1 Region区域化垃圾收集器

8.2.2 回收步骤 

8.2.3 四步过程

9 JVMGC+SpringBoot微服务生产部署调参优化

10 参考文献


垃圾回收算法: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 参考文献

以上内容均来自于下方视频,博客内容仅作为个人学习笔记记录

Java面试_高频重点面试题 (第一、二、三季)_ 面试 第1、2、3季_柴林燕_周阳_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值