图解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


相关文章
|
5月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
460 55
|
10月前
|
监控 算法 Java
Java虚拟机(JVM)垃圾回收机制深度剖析与优化策略####
本文作为一篇技术性文章,深入探讨了Java虚拟机(JVM)中垃圾回收的工作原理,详细分析了标记-清除、复制算法、标记-压缩及分代收集等主流垃圾回收算法的特点和适用场景。通过实际案例,展示了不同GC(Garbage Collector)算法在应用中的表现差异,并针对大型应用提出了一系列优化策略,包括选择合适的GC算法、调整堆内存大小、并行与并发GC调优等,旨在帮助开发者更好地理解和优化Java应用的性能。 ####
233 27
|
11月前
|
监控 算法 Java
Java虚拟机(JVM)的垃圾回收机制深度解析####
本文深入探讨了Java虚拟机(JVM)的垃圾回收机制,旨在揭示其背后的工作原理与优化策略。我们将从垃圾回收的基本概念入手,逐步剖析标记-清除、复制算法、标记-整理等主流垃圾回收算法的原理与实现细节。通过对比不同算法的优缺点及适用场景,为开发者提供优化Java应用性能与内存管理的实践指南。 ####
|
5月前
|
缓存 算法 Java
JVM深入原理(八)(一):垃圾回收
弱引用-作用:JVM中使用WeakReference对象来实现软引用,一般在ThreadLocal中,当进行垃圾回收时,被弱引用对象引用的对象就直接被回收.软引用-作用:JVM中使用SoftReference对象来实现软引用,一般在缓存中使用,当程序内存不足时,被引用的对象就会被回收.强引用-作用:可达性算法描述的根对象引用普通对象的引用,指的就是强引用,只要有这层关系存在,被引用的对象就会不被垃圾回收。引用计数法-缺点:如果两个对象循环引用,而又没有其他的对象来引用它们,这样就造成垃圾堆积。
146 0
|
5月前
|
算法 Java 对象存储
JVM深入原理(八)(二):垃圾回收
Java垃圾回收过程会通过单独的GC线程来完成,但是不管使用哪一种GC算法,都会有部分阶段需要停止所有的用户线程。这个过程被称之为StopTheWorld简称STW,如果STW时间过长则会影响用户的使用。一般来说,堆内存越大,最大STW就越长,想减少最大STW,就会减少吞吐量,不同的GC算法适用于不同的场景。分代回收算法将整个堆中的区域划分为新生代和老年代。--超过新生代大小的大对象会直接晋升到老年代。
98 0
|
7月前
|
缓存 监控 算法
JVM简介—2.垃圾回收器和内存分配策略
本文介绍了Java垃圾回收机制的多个方面,包括垃圾回收概述、对象存活判断、引用类型介绍、垃圾收集算法、垃圾收集器设计、具体垃圾回收器详情、Stop The World现象、内存分配与回收策略、新生代配置演示、内存泄漏和溢出问题以及JDK提供的相关工具。
JVM简介—2.垃圾回收器和内存分配策略
|
11月前
|
机器学习/深度学习 监控 算法
Java虚拟机(JVM)的垃圾回收机制深度剖析####
本文深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法、性能调优策略及未来趋势。通过实例解析,为开发者提供优化Java应用性能的思路与方法。 ####
230 28
|
10月前
|
算法 网络协议 Java
【JVM】——GC垃圾回收机制(图解通俗易懂)
GC垃圾回收,标识出垃圾(计数机制、可达性分析)内存释放机制(标记清除、复制算法、标记整理、分代回收)
|
10月前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
11月前
|
监控 算法 Java
Java虚拟机垃圾回收机制深度剖析与优化策略####
【10月更文挑战第21天】 本文旨在深入探讨Java虚拟机(JVM)中的垃圾回收机制,揭示其工作原理、常见算法及参数调优技巧。通过案例分析,展示如何根据应用特性调整GC策略,以提升Java应用的性能和稳定性,为开发者提供实战中的优化指南。 ####
132 5