文章目录
- 什么是JVM垃圾收集器
- 四种垃圾收集器(按类型分)
-
- [1.串行垃圾收集器(效率低)](#1.串行垃圾收集器(效率低))
- [2.并行垃圾收集器(JDK8默认使用此垃圾回收器)](#2.并行垃圾收集器(JDK8默认使用此垃圾回收器))
- [3.CMS(并发)垃圾收集器(只针对老年代垃圾回收的)](#3.CMS(并发)垃圾收集器(只针对老年代垃圾回收的))
- 4.G1垃圾回收器(在JDK9之后默认使用G1)
-
- [第一阶段----->Young Collection(年轻代垃圾回收)](#第一阶段----->Young Collection(年轻代垃圾回收))
- [Young Collection + Concurrent Mark (年轻代垃圾回收+并发标记)](#Young Collection + Concurrent Mark (年轻代垃圾回收+并发标记))
- [第三阶段----->Mixed Collection (混合垃圾回收,新老都参与)](#第三阶段----->Mixed Collection (混合垃圾回收,新老都参与))
- G1和CMS区别
什么是JVM垃圾收集器
垃圾收集器是负责执行垃圾回收的组件
,它们用于管理Java程序运行时的内存分配和释放
。垃圾收集器的主要任务是自动回收不再使用的内存对象
,并将内存空间重新回收
以供程序继续使用。
四种垃圾收集器(按类型分)
1.串行垃圾收集器(效率低)
Serial和Serial Old串行垃圾收集器,是指使用单线程进行垃圾回收
,堆内存较小,适合个人电脑
- Serial 作用于新生代,采用复制算法
- Serial Old 作用于老年代,采用标记-整理算法
垃圾回收时,只有一个线程在工作
,并且java应用中的所有线程都要暂停
(STW),等待垃圾回收的完成。
2.并行垃圾收集器(JDK8默认使用此垃圾回收器)
Parallel New和Parallel Old是一个并行垃圾回收器,JDK8默认使用此垃圾回收器
- Parallel New作用于新生代,采用复制算法
- Parallel Old作用于老年代,采用标记-整理算法
垃圾回收时,多个线程在工作,并且java应用中的所有线程都要暂停(STW
),等待垃圾回收的完成。(通过并行执行垃圾回收以提高性能)
相比较与串行垃圾收集器,并行垃圾收集器无非就是多开写线程来做垃圾回收,其实同样也要暂停所有正在执行的线程,只不过在多个线程并行回收效率比串行高
3.CMS(并发)垃圾收集器(只针对老年代垃圾回收的)
CMS全称 Concurrent Mark Sweep,是一款并发的
、使用标记-清除算法
的垃圾回收器,该回收器是针对老年代垃圾回收的
,是一款以获取最短回收停顿时间
为目标的收集器,停顿时间短
,用户体验就好
。
其最大特点是在进行垃圾回收时,应用仍然能正常运行。
4.G1垃圾回收器(在JDK9之后默认使用G1)
G1垃圾收集器的设计目标是
在可控的停顿时间
内实现高吞吐量的垃圾回收。
- 应用于
新生代
和老年代
- 划分成
多个区域
,每个区域
都可以充当 eden,survivor,old, humongous,其中humongous 专为大对象准备
- 采用
标记整理算法
因为基本上G1主要针对大型堆内存进行垃圾回收,而复制算法在大型堆内存上的应用存在一些挑战和限制。(必须考虑内存空间使用率)
-
响应时间与吞吐量兼顾
-
分成三个阶段:新生代回收、并发标记、混合收集(在不同的条件下被触发)
-
如果并发失败(即回收速度赶不上创建新对象速度),会触发 Full GC(尽量避免)
如果对象内存分配速度过快,mixed gc来不及回收,导致老年代被填满,就会触发一次full gc,G1的full gc算法就是单线程执行的serial old gc,会导致异常长时间的暂停时间,需要进行不断的调优,尽可能的避免full gc.
第一阶段----->Young Collection(年轻代垃圾回收)
- 初始时,所有区域都处于空闲状态
- 创建了一些对象,挑出一些空闲区域作为
eden区
存储这些对象
- 当伊甸园需要垃圾回收时,挑出一个空闲区域作为
幸存区(s)
,用复制算法复制存活对象
,需要暂停用户线程
- 随着时间流逝,
eden区
的内存又有不足 将eden区
以及之前幸存区中的存活对象
,采用复制算法
,复制到新的幸存区
,其中较老对象
晋升至老年代(o)
XX:MaxTenuringThreshold(默认15),计算出一个恰当的任期阈值,凡是超过任期阈值的对象都会被晋升到老年代。
或者幸存区里有大对象,也会直接晋升到老年代(毕竟大对象,复制来复制去影响整体效率)
Young Collection + Concurrent Mark (年轻代垃圾回收+并发标记)
当老年代
占用内存超过阈值(默认是45%)
后,触发并发标记
,这时无需暂停用户线程
并发标记之后
,会有重新标记阶段解决漏标问题
,此时需要暂停用户线程。
这些都完成后就知道了老年代有哪些存活对象,随后进入混合收集阶段
。此时不会对所有老年代区域进行回收
,而是根据停顿时间目标优先回收价值高(存活对象少)的区域
(这也是 Gabage First 名称的由来)。
注意,这个阶段只是做标记,根据重新标记停顿时间来判断哪些老年代里面或的对象少,下一阶段优先对这些回收价值高的老年代来回收
第三阶段----->Mixed Collection (混合垃圾回收,新老都参与)
混合收集阶段中,参与复制的有 eden、survivor、old
复制完成,内存得到释放。进入下一轮
的新生代回收、并发标记、混合收集