jvm性能调优 - 03垃圾回收机制

简介: jvm性能调优 - 03垃圾回收机制

20210417114228539.png

Pre


上一篇文章给大家分析了JVM中的几块内存区域分别都是干什么的,今天的文章就给大家初步介绍一下垃圾回收的概念。

先来看一下昨天的一张图,回顾一下JVM中几块内存区域的作用。



20210417204640653.png


大家脑子里一定要有一个会动的图,你的代码在运行的时候,起码有一个main线程会去执行所有的代码,当然也可能是你启动的别的线程。


然后线程执行时必须通过自己的程序计数器来记录执行到哪一个代码指令了


另外线程在执行方法时,为每个方法都得创建一个栈帧放入自己的Java虚拟机栈里去,里面有方法的局部变量。


最后就是代码运行过程中创建的各种对象,都是放在Java堆内存里的。


结合上面的大图看一看,相信大家一定就明白是怎么回事了,大家对JVM的运行原理也应该都有了一个初步的理解和把握。


对象的分配与引用


现在我们假设有下面一段代码,大概意思你可以理解为通过“loadReplicasFromDisk”方法的执行,去磁盘上加载需要的副本数据


然后通过“ReplicaManager”对象实例完成了这个操作。

代码如下所示:

20210417205256470.png


结合我们之前理解过的JVM运行原理,一起通过动态的图来拆解一下上述代码的运行流程。

首先一个main线程肯定会来执行main()方法里的代码

main线程自己是有一个Java虚拟机栈的,他会把main()方法的栈帧压入Java虚拟机栈,如下图

20210417205405730.png


接着main()方法里调用了loadReplicasFromDisk()方法

那么就会创建loadReplicasFromDisk()方法的栈帧,压入main线程的Java虚拟机栈里去

这个过程如下图:

20210417205417966.png

此时发现在loadReplicasFromDisk()方法里,有一个“repliaManager”变量,那么就会在loadReplicasFromDisk()方法对应的栈帧里,放入一个“repliaManager”变量。



2021041720550942.png


接着发现在代码里创建了一个“ReplicaManager”类的实例对象,此时就会在Java堆内存中分配这个实例对象的内存空间。


同时,让loadReplicasFromDisk()方法的栈帧内的“replicaManager”局部变量去指向那个Java堆内存里的ReplicaManager实例对象,大家看下图:

20210417205543473.png



接下来,就会执行通过“replicaManager”局部变量引用的“ReplicaManager”实例对象去执行他的load()方法,去完成我们实现的业务逻辑。

好,到这里为止,其实都是上篇文章讲解过的知识,我们就是重新串联了一遍 ~


一个方法执行完毕之后会怎么样?


接着大家来回顾一下上面的代码。


20210417205706984.png


其实目前的图我们已经表述到了“replicaManager.load()”这行代码这里


那么现在有个问题,如果这行代码执行结束了,此时会怎么样? 一旦方法里的代码执行完毕,那么方法就执行完毕了,也就是说loadReplicasFromDisk()方法就执行完毕了。


一旦你的loadReplicasFromDisk()方法执行完毕,此时就会把loadReplicasFromDisk()方法对应的栈帧从main线程的Java虚拟机栈里出栈

20210417205751156.png


此时一旦loadReplicasFromDisk()方法的栈帧出栈,那么大家会发现那个栈帧里的局部变量,“replicaManager”,也就没有了。


也就是说,没有任何一个变量指向Java堆内存里的“ReplicaManager”实例对象了。


核心点来了,此时大家发现了,Java堆内存里的那个“ReplicaManager”实例对象已经没有人引用他了


这个对象实际上已经没用了,该干的事儿都干完了,现在你还让他留在内存里干啥呢?


大家要知道,内存资源是有限的。


一般来说,我们会在一台机器上启动一个Java系统,机器的内存资源是有限的,比如就4个G的内存


然后我们启动的Java系统本质就是一个JVM进程,他负责运行我们的系统的代码 。


那么这个JVM进程本身也是会占用机器上的部分内存资源,比如占用2G的内存资源。


那么我们在JVM的Java堆内存中创建的对象,其实本质也是会占用JVM的内存资源的,比如“ReplicaManager”实例对象,会占用500字节的内存。


所以大家看到这里,心中应该无比明白的一个核心点:我们在Java堆内存里创建的对象,都是占用内存资源的,而且内存资源有限。


2021041720595611.png


不再需要的那些对象应该怎么处理?–GC


继续思考上面的图,既然“ReplicaManager”对象实例是不需要使用的,已经没有任何方法的局部变量在引用这个实例对象了,而且他还空占着内存资源,那么我们应该怎么处理呢?


JVM的垃圾回收机制


VM本身是有垃圾回收机制的,他是一个后台自动运行的线程

你只要启动一个JVM进程,他就会自带这么一个垃圾回收的后台线程。

这个线程会在后台不断检查JVM堆内存中的各个实例对象

还是给大家画一张图,来看看这个过程:


20210417210104838.png

如果某个实例对象没有任何一个方法的局部变量指向他,也没有任何一个类的静态变量,包括常量等地方在指向他。


那么这个垃圾回收线程,就会把这个没人指向的“ReplicaManager”实例对象给回收掉,从内存里清除掉,让他不再占用任何内存资源。


这样的话,这些不再被人指向的对象实例,即JVM中的“垃圾”,就会定期的被后台垃圾回收线程清理掉,不断释放内存资源


20210417210524747.png


到此为止,相信大家跟上文章思路一路看下来,就很清晰明了。到底什么是JVM中的“垃圾”?什么又是JVM的“垃圾回收”!


思考题


既然今天提到了Java堆内存里的对象会被回收掉,那么加载到方法区的类会被垃圾回收吗?什么时候被回收?为什么呢?

  • 首先该类的所有实例对象都已经从Java堆内存里被回收
  • 其次加载这个类的ClassLoader已经被回收
  • 最后,对该类的Class对象没有任何引用

满足上面三个条件就可以回收该类了


相关文章
|
8天前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
29 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
6天前
|
存储 监控 算法
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程 ?
尼恩提示: G1垃圾回收 原理非常重要, 是面试的重点, 大家一定要好好掌握
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程  ?
|
3天前
|
监控 架构师 Java
JVM进阶调优系列(6)一文详解JVM参数与大厂实战调优模板推荐
本文详述了JVM参数的分类及使用方法,包括标准参数、非标准参数和不稳定参数的定义及其应用场景。特别介绍了JVM调优中的关键参数,如堆内存、垃圾回收器和GC日志等配置,并提供了大厂生产环境中常用的调优模板,帮助开发者优化Java应用程序的性能。
|
8天前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
25 3
|
8天前
|
存储 监控 算法
G1 垃圾回收器:底层原理与调优过程
【10月更文挑战第9天】G1(Garbage-First)垃圾回收器是Java虚拟机(JVM)中一款面向服务端应用的垃圾收集器,它在JDK 1.7中引入,并从JDK 9开始成为默认的垃圾回收器。G1的设计目标是在有限的停顿时间内,尽可能地提高系统的吞吐量,特别是在多CPU和大内存的场景下表现出色。
26 3
|
11天前
|
存储 缓存 监控
聊聊JIT是如何影响JVM性能的!
聊聊JIT是如何影响JVM性能的!
|
9天前
|
算法 Java
JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
本文详细介绍了JVM中的GC算法,包括年轻代的复制算法和老年代的标记-整理算法。复制算法适用于年轻代,因其高效且能避免内存碎片;标记-整理算法则用于老年代,虽然效率较低,但能有效解决内存碎片问题。文章还解释了这两种算法的具体过程及其优缺点,并简要提及了其他GC算法。
 JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
|
10天前
|
算法 Java
谈谈HotSpot JVM 中的不同垃圾回收器
【10月更文挑战第5天】理解 HotSpot JVM 中的不同垃圾回收器(如 CMS、G1 和 ZGC)的区别,需要深入了解它们的设计原理、工作方式和应用场景。以下是对这三个垃圾回收器的简要概述以及一个示例 Java 程序,虽然示例程序本身不能直接展示垃圾回收器的内部机制,但可以帮助观察不同垃圾回收器的行为。
11 1
|
5天前
|
Java
JVM进阶调优系列(5)CMS回收器通俗演义一文讲透FullGC
本文介绍了JVM中CMS垃圾回收器对Full GC的优化,包括Stop the world的影响、Full GC触发条件、GC过程的四个阶段(初始标记、并发标记、重新标记、并发清理)及并发清理期间的Concurrent mode failure处理,并简述了GC roots的概念及其在GC中的作用。
|
10天前
|
算法 Java
JVM进阶调优系列(3)堆内存的对象什么时候被回收?
堆对象的生命周期是咋样的?什么时候被回收,回收前又如何流转?具体又是被如何回收?今天重点讲对象GC,看完这篇就全都明白了。