JVM专题七:JVM垃圾回收机制

news2025/1/11 21:40:10

JVM专题六:JVM的内存模型中,我们介绍了JVM内存主要分哪些区域,这些区域分别是干什么的,同时也举了个例子,在运行过程种各个区域数据是怎样流转的。细心的小伙伴可能发现一个问题,在介绍完方法弹栈以后就没有介绍后续流程了。方法执行完以后,堆内存存放的对象实例咋整呢,带着这样的疑问进入今天的内容。

JVM垃圾回收机制是什么

1、为什么需要垃圾回收机制

同样带着这段代码进入今天的内容。

public class App {
    public static void main(String[] args) {
        runApp(args);
        System.out.println("====");

    }

    private static void runApp(String[] args) {
        SpringApplication sApp = new SpringApplication();
        sApp.run(App.class, args);
//        sApp.getRunListeners(args);

    }
}

public class SpringApplication {

    public String run(Class appClass, String[] args) {
        System.out.println("my Spring Application ");
        return "run args";
    }

    public String getRunListeners( String[] args) {
        System.out.println("My  getRunListeners ");
        String myRunListenersVar = "myRunListenersVar";
        this.getSpringFactoriesInstances(args);
        return "run args";
    }

    public String getSpringFactoriesInstances( String[] args) {
        System.out.println("My  getSpringFactoriesInstances ");
        String mySpringFactoriesInstancesVar = "mySpringFactoriesInstances";

        return "run args";
    }


}

上述代码执行到了new的时候,我们会在JVM的堆内存中创建SpringApplication对象实例,并返回实例的引用给给局部变量持有。如下图所示:

再看下面JVM空间分布图会更加清晰:

代码继续执行,当run方法执行结束,run方法出栈以后引用不存在,此时JVM内存分配如下图所示:

核心点来了,此时大家应该都发现了,Java堆内存里的这个'Spring Application”实例对象已经没有人引用他了(特意换成白色不知道有没有小伙伴发现这个细节),这个对象实际上已经没用了,该干的事儿都干完了,JVM还让他留在内存里干啥呢?
在讨论JVM的时候我们时刻记住一个点内存资源是有限的。一般来说,我们会在一台机器上启动一个Java系统,机器的内存资源是十分有限的,比如常用的生产机器4核8G的内存,我们启动的Java系统本质就是一个JVM进程,他负责运行我们的系统的代码。那么这个JVM进程本身也是会占用机器上的部分内存资源,比如占用6G的内存资源,

那么我们在JVM的Java堆内存中创建的对象,其实本质也是会占用JVM的内存资源的,比如“SpringApplication”实例对象,假设会占用2kb的内存(实际更具对象的各个属性和运行时的资源实际会有不同大小)。

既然内存资源很紧张,且这个对象实例我们有没有作用,对于我们系统来说上述的2kb内存就是垃圾,对于垃圾我们自然需要进行处理。所以需要JVM垃圾回收机制

2、JVM垃圾回收基本原理

Java虚拟机(JVM)的垃圾回收机制的基本工作原理,可以总结如下:

  1. 自动性:JVM启动时,会自动启动垃圾回收线程,这些线程在后台运行,不需要开发者手动触发。

  2. 持续监控:垃圾回收线程会持续监控JVM堆内存中的对象,检查它们是否还有活跃的引用。

  3. 引用检查:如果一个对象没有任何局部变量、静态变量、常量或其他方式的引用指向它,那么这个对象被认为是不可达的。

  4. 垃圾回收:对于不可达的对象,垃圾回收线程会将其标记为垃圾,并在适当的时候进行回收,释放它们占用的内存资源。

  5. 定期清理:垃圾回收是一个周期性的过程,它会定期执行,以清理不再需要的对象,从而维持内存的可用性。

  6. 资源释放:通过垃圾回收,JVM可以有效地管理内存资源,防止内存泄漏,并确保应用程序的持续运行。

  7. 性能考虑:虽然垃圾回收有助于内存管理,但其执行过程可能会暂时影响应用程序的性能,尤其是在进行Full GC时。

简而言之,JVM的垃圾回收机制是一个自动化的后台进程,它通过周期性地检查和回收不可达的对象(垃圾),帮助管理内存资源,确保应用程序的高效运行。

此时JVM内存如下图所示:

到目前为止,我们其实我们已经介绍了整个Java从源文件编译称class字节码,从字节码加载到JVM,JVM通过字节码执行器执行代码,执行过程中内存分布,执行结束后的垃圾处理。所以基本流程图应该可以回执出来啦。这时候回头看看专题一的整体图是不是更加清晰了呢:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1854483.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL找出所有员工当前薪水salary情况

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 有一个薪水表…

13.爬虫---PyMongo安装与使用

13.PyMongo安装与使用 1.安装 PyMongo2.使用PyMongo2.1连接数据库和集合2.2增加数据2.3修改数据2.4查询数据2.5删除数据 3.总结 MongoDB 安装可以看这篇文章MongoDB安装配置教程(详细版) 1.安装 PyMongo PyMongo 是Python中用于连接MongoDB数据库的库&a…

win32API(CONSOLE 相关接口详解)

前言: Windows这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外,它同时也是⼀个很⼤的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程式达到开启视窗、描绘图形…

Linux使用——查看发行版本、内核、shell类型等基本命令

先做快照 虚拟机中编辑网络 关机 普通账户和管理员账户 互相对照 localhost相当于IP 参数: 短格式:以减号(-)开头,参数字母 长格式:以2个减号(--)后跟上完整的参数单词 当前发行版本 [rootserver ~]# cat /etc/redhat-release Red Hat Enterprise Linux release 9.…

区块链技术原理

1.起源: ➢ 中本聪(Satoshi Nakamoto), 2008 ➢ 比特币:一种点对点的电子现金系统 2.分布式账本技术原理 ➢ 将交易向全网所有节点进行广播 ➢ 众多记账节点对记账权达成共识,由共识确认的记账节点把记账区块发布给全网 ➢ 所有账本数据完整存储于区块…

ADD属性驱动架构设计(一)

目录 一、架构设计过程 1.1、架构设计过程 1.1.1、设计目的 1.1.2、质量属性(非功能需求) 1.1.3、核心功能(功能需求) 1.1.4、架构关注 1.1.5、约束条件 1.2、基于设计过程 二、什么是ADD? 三、为什么选择ADD? 四、作…

OpenGL3.3_C++_Windows(18)

接口块: glsl彼此传输数据,通过in / out,当更多的变量,涉及数组和结构体接口块(Interface Block)类似struct,in / out 块名{……}实例名 Uniform缓冲对象: 首先理解uniform Object:负责向gl…

RTSP协议分析与安全实践

RTSP协议,全称实时流协议(Real Time Streaming Protocol),前文已经简单介绍了RTSP相关协议; RTSP和RTP(RTCP) 这里再提一下RTSP和RTP/RTCP、RSVP的关系;如图: RTSP和HTTP 相似性:RTSP和HTTP协议都使用纯…

Android13 WMS窗口层级树

1,认识层级树 可以通过dumpsys activity containers 看到 WMS 层级树的结构 ACTIVITY MANAGER CONTAINERS (dumpsys activity containers) ROOT typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 Displa…

【驱动篇】龙芯LS2K0300之单总线驱动

实验过程 实验目的: 在龙芯开发板上面使用单总线驱动DS18B20温度传感器 ① 根据原理图连接DS18B20模块 ② 将i2c0引脚的功能复用为GPIO ③ 注册字符设备,按照DS18B20的读写时序编写读写驱动接口 ④ 编写测试用例解析传感器的数值 原理图 将板子上…

细粒度图像分类论文阅读笔记

细粒度图像分类论文阅读笔记 摘要Abstract1. 用于细粒度图像分类的聚合注意力模块1.1 文献摘要1.2 研究背景1.3 本文创新点1.4 计算机视觉中的注意力机制1.5 模型方法1.5.1 聚合注意力模块1.5.2 通道注意力模块通道注意力代码实现 1.5.3 空间注意力模块空间注意力代码实现 1.5.…

[MQTT]Mosquitto的權限管理_使用者/密碼(pwfile)和訪問控制清單(aclfile)

延續Mosquitto的內網連接(intranet)和使用者/密碼權限設置文章,經解讀mosquitto官網文檔,在權限管理部分,除了設置使用者/密碼(pwfile)之外,還有訪問控制清單(Access Control List, aclfile)可以設置。經過測試,同時設…

Python中使用PyQT5库时报错:没有Qt平台插件可以初始化

一、发现问题:无限易pythonGo打开执行的时候报:“没有Qt平台插件可以初始化,请重新安装应用程序。”的错误,点击确定后无限易崩溃闪退。 二、解决问题: 1、重新安装依赖,打开CMD输入pip list,查…

开发uniapp插件包aar文件,使uniapp可以调用jar包

背景 使用 uniapp 开发应用时,很多时候都需要调用第三方的sdk,一般以 jar 为主。为了应对这个问题,官方提供了插件方案,可以将第三方 jar 包进行封装为 aar 包后,再集成到 uniapp 中使用。 一、环境安装工具 1、jdk…

拓扑排序——C语言

拓扑排序(Topological Sorting)是一种用于有向无环图(DAG)的排序算法,其输出是图中所有顶点的线性排序,使得对于每条有向边 (u, v),顶点 u 在 v 之前出现。拓扑排序确定了项目网络图中的起始事件…

嵌入式中逻辑分析仪与示波器的基本原理

大家好,今天主要给大家分享一下,嵌入式中如何使用逻辑分析仪和示波器的方法,希望对大家有所帮助。 https://dreamsourcelab.cn/ 第一:什么是逻辑分析仪 是否遇到使用示波器分析数字电路的冏境:深度不够,时间太短,无法抓到想要的波形,没有协议内容解析? 逻辑分析仪…

深度学习11-13

1.神经元的个数对结果的影响: (http://cs.stanford.edu/people/karpathy/convnetjs/demo/classify2d.html) (1)神经元3个的时候 (2)神经元是10个的时候 神经元个数越多,可能会产生…

注意 llamaIndex 中 Chroma 的坑!

llamaIndex 做索引是默认存在内存中,由于索引需要通过网络调用 API,而且索引是比较耗时的操作,为了避免每次都进行索引,使用向量数据库进行 Embedding 存储以提高效率。首先将 Document 解析成 Node,索引时调用 Embedd…

解析PDF文件中的图片为文本

解析PDF文件中的图片为文本 1 介绍 解析PDF文件中的图片,由两种思路,一种是自己读取PDF文件中的图片,然后用OCR解析,例如:使用PyMuPDF读取pdf文件,再用PaddleOCR或者Tesseract-OCR识别文字。另一种使用第…

小鹏汽车2025冲刺类L4智驾,挑战与机遇并存

随着科技的飞速发展,智能驾驶已成为汽车行业的前沿领域。近日,小鹏汽车在AI DAY上宣布国内首个量产上车的端到端大模型,这一创新举措无疑为智能驾驶的发展注入了新的活力。然而,在迈向2025年实现类L4级智能驾驶的道路上&#xff0…