图解JVM垃圾回收

简介: 图解JVM垃圾回收

一、垃圾收集器所属分代总览


1、各代采用的收集器


有连线的表示可搭配使用


image.png

HotSpot虚拟机各代对应的垃圾收集器


2、垃圾回收算法


2.1、标记-清除过程


第一阶段:标记出可回收对象

第二阶段:回收被标记的对象

缺点:产生大量的内存碎片


image.png

2.2、复制回收过程


内存被分为相等的两块(S0+S1),S0为使用内存,S1为保留内存,回收时将S0的存活对象一次性全部复制到S1,再一次性清空S0内存

缺点:内存使用率只有50%


image.png


2.3、标记整理过程


第一阶段:标记出存活对象

第二阶段:存活对象往一端移动,清理边界外内存


image.png


3、各收集器采用的收集算法


业界商用的JVM收集算法都是采用分代收集,按不同代的特点采用不同的收集算法。

通常情况,年轻代采用复制算法,年老代采用标记-整理或标记-清除算法。


image.png

G1整体上看基于 "标记-整理" 算法,而两个Region之间则基于 "复制" 算法


二、各垃圾收集器详解


1、Serial 和Serial Old组合收集


单线程串行收集器,垃圾收集时会“Stop The World”


image.png

Serial 和Serial Old组合收集示意图


2、ParNew 和Serial Old组合收集


ParNew收集器就是Serial收集器的多线程版本,收集算法和回收策略和Serial完全一样,也会Stop The World。


注意:ParNew是并行收集器,不是并发收集器


image.png

ParNew 和Serial Old组合收集示意图


3、Parallel Scavenge收集器


跟ParNew类似,是一种吞吐量优先收集器,即目标是达到一个可控制的吞吐量

吞吐量 = 运行用户代码时间 / (运行用户代码时间) + 垃圾收集时间


4、Parallel Scavenge和Parallel Old组合收集


Parallel Old是Parallel Scavenge收集器的老年代版本


image.png

Parallel Scavenge和Parallel Old组合收集示意图


5、CMS收集器


CMS收集器是一种并发收集器,目标时已达到最小回收停顿时间,采用标记清除算法。


image.png

CMS收集器示意图


6、G1收集器


G1内存布局中,保留了年轻代年老代的概念,但不是物理隔离,而是很多个大小相同的

独立区域(Region),年轻代和年老代都是一部分Region(不需要连续)的集合


初始标记:标记GC Roots能直接关联到的对象


并发标记:从GC Roots中对堆对象进行可达性分析,找出存活对象


最终标记:修改并发期间变动的标记记录


筛选回收:根据用户指定的停顿时间制定回收计划


image.png

G1收集器示意图


image.png

G1内存布局示意图


三、存活对象的判断


不管是采用什么样的垃圾回收算法,都需要判断对象的存活状态,通常会采用两种方式判断


1、引用计数法


对象中增加一个引用计数器,每当有地方引用该对象时,其计数器+1,引用失效后计数器-1,当计数器为0的对象,即认为是可回收的对象,但是这种方式无法解决循环引用的问题,所以目前主流的垃圾回收器都没有采用这种方式。


2、可达性分析算法


通过GC Roots集合中的对象开始搜索,当某对象不能通过GCRoots到达时,判定为对象可回收。


对象1、2、3、4不可回收,对象5、6、7可回收


image.png

GCRoots.png


附一张之前画过的JVM内存模型


image.png

内存模型.jpeg


相关文章
|
2月前
|
存储 算法 Oracle
极致八股文之JVM垃圾回收器G1&ZGC详解
本文作者分享了一些垃圾回收器的执行过程,希望给大家参考。
|
8天前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
29 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
6天前
|
存储 监控 算法
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程 ?
尼恩提示: G1垃圾回收 原理非常重要, 是面试的重点, 大家一定要好好掌握
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程  ?
|
3月前
|
存储 算法 Java
Java面试题:深入探究Java内存模型与垃圾回收机制,解释JVM中堆内存和栈内存的主要区别,谈谈对Java垃圾回收机制的理解,Java中的内存泄漏及其产生原因,如何检测和解决内存泄漏问题
Java面试题:深入探究Java内存模型与垃圾回收机制,解释JVM中堆内存和栈内存的主要区别,谈谈对Java垃圾回收机制的理解,Java中的内存泄漏及其产生原因,如何检测和解决内存泄漏问题
59 0
|
3月前
|
存储 算法 安全
Java面试题:Java内存模型及相关知识点深度解析,Java虚拟机的内存结构及各部分作用,详解Java的垃圾回收机制,谈谈你对Java内存溢出(OutOfMemoryError)的理解?
Java面试题:Java内存模型及相关知识点深度解析,Java虚拟机的内存结构及各部分作用,详解Java的垃圾回收机制,谈谈你对Java内存溢出(OutOfMemoryError)的理解?
62 0
|
10天前
|
算法 Java
谈谈HotSpot JVM 中的不同垃圾回收器
【10月更文挑战第5天】理解 HotSpot JVM 中的不同垃圾回收器(如 CMS、G1 和 ZGC)的区别,需要深入了解它们的设计原理、工作方式和应用场景。以下是对这三个垃圾回收器的简要概述以及一个示例 Java 程序,虽然示例程序本身不能直接展示垃圾回收器的内部机制,但可以帮助观察不同垃圾回收器的行为。
10 1
|
28天前
|
存储 算法 Java
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
本文介绍了 JVM 的内存区域划分、类加载过程及垃圾回收机制。内存区域包括程序计数器、堆、栈和元数据区,每个区域存储不同类型的数据。类加载过程涉及加载、验证、准备、解析和初始化五个步骤。垃圾回收机制主要在堆内存进行,通过可达性分析识别垃圾对象,并采用标记-清除、复制和标记-整理等算法进行回收。此外,还介绍了 CMS 和 G1 等垃圾回收器的特点。
94 0
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
|
16天前
|
存储 Java PHP
【JVM】垃圾回收机制(GC)之引用计数和可达性分析
【JVM】垃圾回收机制(GC)之引用计数和可达性分析
40 0
|
3月前
|
Java
Jinfo 查看 jvm 配置及使用 Jstat 查看堆内存使用与垃圾回收
Jinfo 查看 jvm 配置及使用 Jstat 查看堆内存使用与垃圾回收
88 5
|
3月前
|
存储 算法 Java
JVM 垃圾回收算法与垃圾回收器
JVM 垃圾回收算法与垃圾回收器
42 3