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

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.rhkb.cn/news/362220.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【仿真建模-anylogic】Scale解析

Author:赵志乾 Date:2024-06-27 Declaration:All Right Reserved!!! 1. 应用场景 Scale是比例尺,用于长度单位和像素之间的换算,anylogic默认为每个agent生成一个scale,…

Navicat 外网连接 mysql (1、通过SSH方式内网访问 2、对外开放3306端口)

1、通过SSH方式内网访问 直接常规方式使用IP、账号密码连接,失败 SSH方式: 常规 选项卡中:localhost录入数据库账号密码 SSH 选项卡中:勾选使用SSH,输入服务器IP、账号、密码 如果出现该错误,可能是服务器…

主流电商平台API接口(天猫获得淘宝商品详情,获得淘宝app商品详情原数据 ,获得淘口令真实url API,按图搜索淘宝商品(拍立淘) API )

主流电商平台商品接口在电商企业中具有重要应用价值。通过商品接口,电商企业可以实现商品同步功能: 商品信息同步:通过接口可以实时同步主流电商平台上的商品信息,包括商品标题、价格、库存、销量等数据,确保企业在自…

GPU_Gems-物理模型的水模拟

创建一个多网格的平面 void GraphicsWindowBase::RenderPlane() {constexpr int width 150;constexpr int depth 150;constexpr int vertNum width * depth;float length 60.f;if (quadVAO 0){float planeVert[vertNum * 5];float offsetX length / (width - 1.f);float…

【精选】数据治理项目实施(合集)05——解码“数据架构”,数据架构包含哪些内容?

上一篇讲到了数据治理项目的前期调研工作,继数据调研工作完成之后,就要开始关于治理工作的各项方案设计,整体方案设计包括数据架构、元数据、主数据、数据质量、数据安全、指标标签体系、数据生命周期管理和管理评价等内容。这一篇重点讲一下…

聊一聊UDF/UDTF/UDAF是什么,开发要点及如何使用?

背景介绍 UDF来源于Hive,Hive可以允许用户编写自己定义的函数UDF,然后在查询中进行使用。星环Inceptor中的UDF开发规范与Hive相同,目前有3种UDF: A. UDF--以单个数据行为参数,输出单个数据行; UDF&#…

为什么说展厅数字人是展览未来的趋势?

展厅数字人是利用数字化、智能化和网络化等信息技术手段提升展厅展览服务和游览体验的全新载体。随着人工智能和虚拟现实技术的应用发展,展厅数字人已成为展厅展览转型升级的重要趋势。 展厅数字人凭借其创新性、强可塑性,成为展厅新名片,为各…

趣测系统搭建APP源码开发,娱乐丰富生活的选择!

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 趣测系统提供了一个集合多种有趣测试的平台,如心理测试和星座测试等,这些测试内容富有趣味性和娱乐性,能够帮助大众在忙碌的生活中找到放松和娱乐的时刻…

Vite 动态导入警告问题解决方案

如上图我要实现从后台获取权限菜单并动态导入进行渲染 但由于 vite 暂时不支持这种导入方式 图中也给出了提示 本人也是这么去做了 但并没什么卵用 后来参考了 vite 的 import.meta.glob 这种方式 我在处理菜单权限控制的菜单里进行了如下操作: …

Hyperf 在 NginxProxyManager 如何配置 websocket?

新建代理 填写域名等服务信息&#xff0c;选择支持WebSockets。 创建 SSL 编写nginx配置 location /message.io{proxy_pass http://<你的ip>:<对应端口号>;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upg…

会计报表分析

目录 一. 会计报表的种类 \quad 一. 会计报表的种类 \quad 反应财务状况的是资产负债表 反应经营成果的是利润表 有时间点的就是静态表 动态表就是有一个区间的, 比如一年, 一个季度等

学习笔记——动态路由——RIP(RIP路由汇总介绍)

四、RIP路由汇总介绍 当网络中路由器的路由条目非常多时&#xff0c;可以通过路由汇总&#xff08;又称路由汇聚或路由聚合&#xff09;来减少路由条目数&#xff0c;加快路由收敛时间和增强网络稳定性。 路由汇总的原理是&#xff0c;同一个自然网段内的不同子网的路由在向外…

Django 如何使用视图动态输出 CSV 以及 PDF

Django 如何使用视图动态输出 CSV 以及 PDF 这一篇我们需要用到 python 的 csv 和 reportLab 库&#xff0c;通过django视图来定义输出我们需要的 csv 或者 pdf 文件。 csv文件 打开我们的视图文件 testsite/members/views.py 。新增一个视图方法&#xff1a; import csv …

活用变量,让Postman的使用飞起来

在 Postman 中使用变量是一种非常强大的功能&#xff0c;它可以极大地增强 API 测试和开发的灵活性和效率。 Postman变量的类型 变量在 Postman 中可以在多个层次设置和使用&#xff0c;包括 全局变量环境变量集合变量局部变量&#xff08;如在脚本中暂时创建的变量&#xf…

Clickhouse 的性能优化实践总结

文章目录 前言性能优化的原则数据结构优化内存优化磁盘优化网络优化CPU优化查询优化数据迁移优化 前言 ClickHouse是一个性能很强的OLAP数据库&#xff0c;性能强是建立在专业运维之上的&#xff0c;需要专业运维人员依据不同的业务需求对ClickHouse进行有针对性的优化。同一批…

想问一下stm32学习哪些东西才算入门并且能做项目?

STM32&#xff08;所有的MCU都一样&#xff09;归根结底只是一个工具&#xff0c;能做的事情也很多&#xff0c;如果只谈性能&#xff0c;不考虑稳定性等因素&#xff0c;那么103估计做个导弹控制器&#xff0c;火箭控制器都没有问题&#xff0c;阿波罗登月的主控主频才多少&am…

kafka 消费者 API 使用总结

前言 应用程序使用KafkaConsumer向Kafka订阅主题&#xff0c;并从订阅的主题中接收消息。不同于从其他消息系统读取数据&#xff0c;从Kafka读取数据涉及一些独特的概念和想法。如果不先理解这些概念&#xff0c;则难以理解如何使用消费者API。本文将先解释这些重要的概念&…

Attention步骤

一个典型的Attention思想包括三部分&#xff1a;Qquery、Kkey、Vvalue。 Q是query&#xff0c;是输入的信息&#xff1b;key和value成组出现&#xff0c;通常是原始文本等已有的信息&#xff1b;通过计算Q与K之间的相关性a&#xff0c;得出不同的K对输出的重要程度&#xff1b;…

数据结构与算法基础(王卓)--学习笔记

1 数据结构分类 1.1 逻辑结构分类 集合结构线性结构&#xff1a;线性表、栈、队列、串树形结构图形结构 1.2 物理结构分类 逻辑结构在计算机中的真正表示方式&#xff08;又称为映射&#xff09;称为物理结构&#xff0c;也可叫做存储结构 顺序存储结构&#xff1a;数组链…

百度安全X盈科全球数据合规服务中心:推进数据安全及合规智能化创新领域深化合作

6月19日&#xff0c;百度安全与盈科全球数据合规服务中心举行合作签约仪式&#xff0c;双方将充分发挥各自优势&#xff0c;在数据安全及合规智能化创新领域深化合作&#xff0c;在遵守国家法律法规和顺应市场规则的前提下&#xff0c;推动地方经济社会发展&#xff0c;促进企业…