JVM的垃圾回收机制--GC

news2024/11/18 3:40:14

  垃圾回收机制,是java提供的对于内存自动回收的机制。java不需要像C/C++那样手动free()释放内存空间,而是在JVM中封装好了。垃圾回收机制,不是java独创的,现在应该是主流编程语言的标配。GC需要消耗额外的系统资源,而且存在非常影响执行效率的“STW”问题(触发GC的时候,可能一瞬间把系统负载拉满,导致服务器无法响应其他的请求)。

GC回收的“内存”,更准确说,是“对象”,回收的是“堆上的内存”。

内存区域有四块:

1)程序计数器(不需要额外回收,线程销毁,自然回收了)

2)栈(不需要额外回收,线程销毁,自然回收了)

3)元数据区(一般也不需要,都是加载类,很少“卸载类”)

4)堆  (GC的主力部分

GC一定是一次回收一个完整的对象,不能回收半个对象(一个对象有10个成员,肯定是把10个成员的内存都回收了,而不是只回收一部分)

GC的流程

GC的流程,主要是两个步骤。1)找到谁是垃圾     2)释放对应的内存

找到谁是垃圾

一个对象,什么时候创建,时机往往是明确的。但是什么时候不再使用,时机往往是模糊的。在编程中,一定要确保,代码中使用的每个对象,都得是有效的,不能出现“提前释放”的情况。

因此判定一个对象是否是垃圾,判定方式是比较保守的。

此处引入了非常“保守”的,一定不会误判的做法(可能回释放的不及时)。判定某个对象,是否存在引用指向它。

在java中,使用对象,都是通过引用的方式来使用的。如果没有引用指向这个对象,意味着这个对象注定无法在代码中被使用。就可以视为是垃圾了。

如何判定,某个对象是否有引用指向呢?

1)引用计数(不是JVM采取的方案,而是Python/PHP的方案)

会在为new 对象开辟内存空间时,额外开辟一个计数器,每当对象多一个引用,计数器+1。当计数器为0时,即可回收对象。

这种方法存在两个缺陷:

1、消耗额外的存储空间 

如果对象比较大,浪费的空间还好,对象比较小并且对象数目多,空间浪费就多了。

2、存在“循环引用”的问题

 当执行 a = null  b = null 时,此时这两对象相互指向对方,导致两个对象的引用计数,都为1(不为0,不是垃圾)但是你外部代码,也无法访问到这两对象。  

2)可达性分析(是JVM采取的方案)

可达性分析是java采用的做法,解决了空间和循环引用的问题,但是付出了时间上的代价。核心思想是“遍历”,JVM把对象之间的引用关系,理解成了一个“树形结构”。JVM就会不停的遍历这样的结构,把所有能够遍历访问到的对象标记成“可达”,剩下就是“不可达”。

这些树的根结点是怎么确定的?

Java代码中,你所有的

1)栈上的局部变量,引用类型的,都是GC roots

2)常量池中,引用的对象

3)方法区中的静态成员

都是一棵树的根结点。JVM就会周期性的对这所有的树进行遍历,不停的标记可达,也不停的把不可达的对象干掉。

具体树是否复杂,都取决于实际代码的实现。

由于可达性分析,需要消耗一定的时间,因此,java的垃圾回收,没法做到“实时性”。只能周期性进行扫描(JVM提供了一组专门的负责GC的线程,不停的进行扫描工作)

释放垃圾的策略

1、标记-清除

直接把标记为垃圾的对象对应的内存释放掉  (简单粗暴)

这样的做法会存在“内存碎片”问题。指空闲内存被分成一个个的碎片了,后续很难申请到连续的大的内存。并不实用。

2、复制算法

将内存空间分成两块,要释放某一块内存空间时,将无需删除的数据提前复制到另一块内存中。

这种做法空间浪费太多了。如下图删除1、3、5:

3、标记-整理

将无需删除的部分向前搬运,覆盖掉要删除的数据。如删除2、4、6

这种方法能解决空间利用率问题,但是时间开销更大。

JVM中实际采取的方案是综合上述方案,更复杂的策略。分代回收。也就是分情况讨论,根据不同的场景和特点选择合适的方案。根据对象的年龄(经历GC周期性扫描的轮次)来讨论,GC有一组线程,回对内存进行周期性扫描。某个对象经历了一轮GC之后,还是存在,没有成为垃圾,年龄就+1。

JVM堆区的结构如下:

分代回收的流程:1)把新创建的对象,放到伊甸区中。

2)伊甸区中,大部分的对象,生命周期都是比较短的,第一轮GC到达的时候,就会成为垃圾。只有少数对象能活过第一轮GC。

3)伊甸区 -> 生存区    通过复制算法。(由于存活对象很少,复制开销也很低,生存空间也不必很大)

4)生存区 -> 另一个生存区    通过复制算法。每经过一轮GC,生存区中都会淘汰掉一批对象,剩下的通过复制算法,进入到另一个生存区(进入另一个生存区的还有从伊甸区里进来的对象),存活下来的对象,年龄+1.

5)生存区 -> 老年代   某些对象,经历了很多轮GC,都没有成为垃圾,就会复制到老年代。

老年代的对象,也是需要进行GC的,但是老年代的对象生命周期都比较长,就可以降低GC的扫描频率。

以上,关于JVM的垃圾回收机制,希望对你有所帮助。

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

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

相关文章

“2024深圳数字能源展”共同探讨数字能源未来发展方向和挑战

在数字化浪潮的推动下,新一轮科技革命与产业革命正以前所未有的速度加速兴起。在这个时代背景下,数字化技术与能源行业的高度融合,使得能源数字化成为未来发展的必然趋势。数字经济浪潮的蓬勃兴起,为能源行业的数字化转型提供了强…

网络安全-钓鱼篇-利用cs进行钓鱼

一、环境 自行搭建,kill,Windows10,cs 二、原理 如图所示 三、钓鱼演示 首先第一步:打开System Profiler-分析器功能 选择克隆www.baidu.com页面做钓鱼 之后我们通过包装域名,各种手段让攻击对象访问:h…

XXE漏洞详解——进阶篇

读取文件时有特殊符号 在读取文件时&#xff0c;文件中包含"<,>,&"等这些特殊符号时&#xff0c;会被xml解析器解析&#xff0c;报错从而导致读取失败&#xff0c;例如尝试读取以下文件 C:\test.txt 内容&#xff1a; <Baize Sec> payload: <…

搜维尔科技:Movella Xsens用于动画,CG,短视频制作案例

用户名称 广州百漫文化传播有限公司 应用场景 基于Xsens MVN Link 动作捕捉系统的动画制作、CG制作、短视频制作、快速动画MAYA插件、影视动漫实时合成预渲染。 现场照片 《西行纪》内容简介&#xff1a;在远古神明的年代&#xff0c;世间存在着天众、龙众、阿修罗等八部众…

探索 ChatboxAI:智能对话的新时代

在人工智能迅速发展的今天&#xff0c;智能对话已经成为了我们日常生活中不可或缺的一部分。从智能助理到聊天机器人&#xff0c;AI 技术正在改变我们与世界互动的方式。今天&#xff0c;我们要介绍的是一个全新且功能强大的平台——ChatboxAI。 什么是 ChatboxAI&#xff1f;…

S32K --- FLS MCAL配置

一、前言 二、MCAL配置 添加一个Mem_43_infls的模块, infls是访问内部flash, exfls是访问外部flash 2.1 General 这边暂时保持的默认,还没详细的去研究,等有空研究了,我再来更新 2.2 MemInstance 双金“index”的下标“0”可以进里面详细配置,这个是基本操作了。 2.2.1 G…

为什么说想当产品经理,最好的时候就是现在?

今年,随着人工智能(AI)技术的火热,AI产品经理岗位的需求也一路暴涨,薪资也同步水涨船高。 根据美国招聘社交媒体Glassdoor的数据,AI产品经理年收入高达125万元,是普通产品经理年收入的1.43倍,更是项目经理年收入的2.14倍。在中国,大厂AI产品经理的月收入也高达3到7万左右。但即…

国家首批20个“数据要素×”典型案例发布,珈和科技助力金融、气象两案例入榜

5月24日&#xff0c;国家数据局会同生态环境部、交通运输部、金融监管总局、中国科学院、中国气象局、国家文物局、国家中医药局等部门在第七届数字中国峰会主论坛上发布首批20个“数据要素”典型案例。 其中&#xff0c;珈和科技以其专业的产品和服务助力金融服务领域的浙江网…

Linux 系统编程笔记--基本概念(一)

操作系统&#xff1a; 管理计算机硬件和软件资源的计算机程序。 内核&#xff1a; 操作系统的核心&#xff0c;是应用程序连接硬件设备的桥梁。 CPU 可以在两种状态下运行:用户态和内核态&#xff0c;在用户态下运行时&#xff0c;CPU 只能访问用户空间的内存;在内核态运行时&…

【Pandas】深入解析`pd.read_json()`函数

【Pandas】深入解析pd.read_json()函数 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#x…

学习笔记|如何移植NCNN

在计算机视觉和深度学习领域&#xff0c;NCNN&#xff08;Netural Network Computer Vision&#xff09;是一个轻量级的神经网络计算框架&#xff0c;被广泛应用于各类嵌入式设备和移动平台。今天&#xff0c;让我们一同跟随共创社团队的步伐&#xff0c;揭秘他们如何进行NCNN的…

React Hooks是如何保存的

React 函数式组件是没有状态的&#xff0c;需要 Hooks 进行状态的存储&#xff0c;那么状态是怎么存储的呢&#xff1f;Hooks是保存在 Fiber 树上的&#xff0c;多个状态是通过链表保存&#xff0c;本文将通过源代码分析 Hooks 的存储位置。 创建组件 首先我们在组件中添加两…

净念——雷江书画艺术汇报展暨作品捐赠仪式在合阳博物馆盛大开幕

古莘初夏万物秀,丹青妙笔谱华章&#xff01;5月25日上午9时&#xff0c;由合阳县委宣传部、合阳文化和旅游局主办&#xff0c;合阳历史文化博物馆、合阳县旅游发展有限公司承办的净念雷江书画艺术汇报展暨作品捐赠仪式在合阳县历史博物馆盛大开幕。 陕西省原副省长魏增军&#…

SAP锁机制(SAP Locks)经验小结

1. 数据一致性与锁 为什么要有锁机制&#xff1f;其背后的核心逻辑在于“保证数据的一致性”。 当数据被应用程序修改时&#xff0c;我们必须要保证修改后的数据具有一致性。在SAP系统中&#xff0c;将一致的数据状态从一个状态变动到另一个一致状态的时间跨度被称为LUW&…

宝塔安装java环境Jdk1.8

1.打开宝塔——选择“终端”——输入SSH的服务器IP和SSH账号&#xff0c;选择密码验证&#xff0c;输入密码 2。登录成功后&#xff0c;输入&#xff1a;yum list java-1.8*&#xff0c;用于列出所有与 “java-1.8” 相关的软件包 yum list java-1.8* 3.安装Jdk1.8: yum insta…

登峰造极,北斗相伴——纪念人类首次登顶珠穆朗玛峰71周年

71年前的今天&#xff0c;1953年5月29日11时30分&#xff0c;人类实现了一个伟大的壮举&#xff1a;首次登上了珠穆朗玛峰&#xff0c;这座海拔8848.86米的世界最高峰。这是一次充满了艰辛、勇气和智慧的探险&#xff0c;也是一次改变了人类历史和文化的探险。 自那以后&#…

有没有好用的供应商协同软件,能实现文件的便捷协作?

制造业供应商间文件协作非常频繁&#xff0c;而频繁的文件协作也是保证业务有效开展的基础&#xff0c;对于确保生产流程的顺畅和高效至关重要。以下是一些常见的制造业供应商文件协作的例子&#xff1a; 采购订单和合同&#xff1a;采购订单是供应商和制造商之间最基本的文件协…

力扣hot100:23. 合并 K 个升序链表

23. 合并 K 个升序链表 这题非常容易想到归并排序的思路&#xff0c;俩升序序列合并&#xff0c;可以使用归并的方法。 不过这里显然是一个多路归并排序&#xff1b;包含多个子数组的归并算法&#xff0c;这可以让我们拓展归并算法的思路。 假设n是序列个数&#xff0c;ni是…

ROS运行文件(LaunchFile)和参数(Parameter)

本文主要介绍ROS的Launch File和Parameter概念&#xff0c;通过Launch File启动单个或多个节点&#xff0c;并通过Parameter配置启动参数。 更多内容&#xff0c;访问专栏目录获取实时更新。 当你的应用中包含了很多工作包&#xff0c;每个工作包了又包含了多个节点时&#xff…

本地部署大模型的几种方式

现在大模型可谓是满天飞, 只要你稍微关注时下的AI资讯, 几乎每天都有新的AI大模型出现. 这之中当然有诸如GhatGPT, Gemini这样的私有化大模型, 更吸引人关注的可能是开源的可私有化部署的一些大模型. 比如Meta前两天开放的Lamma 3, Google的Gemma开源模型, 国内也有Qwen以及YI等…