JVM——垃圾回收算法(垃圾回收算法评价标准,四种垃圾回收算法)

news2024/11/28 19:00:26

目录

  • 1.垃圾回收算法发展简介
  • 2.垃圾回收算法的评价标准
    • 1.吞吐量
    • 2.最大暂停时间
    • 3.堆使用效率
  • 3.垃圾回收算法01-标记清除算法
    • 垃圾回收算法-标记清除算法的优缺点
  • 4.垃圾回收算法02-复制算法
    • 垃圾回收算法-复制算法的优缺点
  • 5.垃圾回收算法03-标记整理算法
    • 标记整理算法的优缺点
  • 6.垃圾回收算法04-分代垃圾回收算法

1.垃圾回收算法发展简介

⚫ Java是如何实现垃圾回收的呢?简单来说,垃圾回收要做的有两件事:
1、找到内存中存活的对象
2、释放不再存活对象的内存,使得程序能再次利用这部分空间


⚫ 1960年John McCarthy发布了第一个GC算法:标记-清除算法。
⚫ 1963年Marvin L. Minsky 发布了复制算法。
本质上后续所有的垃圾回收算法,都是在上述两种算法的基础上优化而来。在这里插入图片描述

2.垃圾回收算法的评价标准

Java垃圾回收过程会通过单独的GC线程来完成,但是不管使用哪一种GC算法,都会有部分阶段需要停止所有的用户线程。这个过程被称之为Stop The World简称STW,如果STW时间过长则会影响用户的使用。
在这里插入图片描述

所以判断GC算法是否优秀,可以从三个方面来考虑:

1.吞吐量

吞吐量指的是 CPU 用于执行用户代码的时间与 CPU 总执行时间的比值,即吞吐量 = 执行用户代码时间 /(执行用户代码时间 + GC时间)。吞吐量数值越高,垃圾回收的效率就越高。

比如:虚拟机总共运行了 100 分钟,其中GC花掉 1 分钟,那么吞吐量就是 99%

2.最大暂停时间

最大暂停时间指的是所有在垃圾回收过程中的STW时间最大值。比如如下的图中,黄色部分的STW就是最大暂停时间,显而易见上面的图比下面的图拥有更少的最大暂停时间。最大暂停时间越短,用户使用系统时受到的影响就越短。
在这里插入图片描述

3.堆使用效率

不同垃圾回收算法,对堆内存的使用方式是不同的。比如标记清除算法,可以使用完整的堆内存。而复制算法会将堆内存一分为二,每次只能使用一半内存。从堆使用效率上来说,标记清除算法要优于复制算法。


上述三种评价标准:堆使用效率、吞吐量,以及最大暂停时间不可兼得。


一般来说,堆内存越大,最大暂停时间就越长。想要减少最大暂停时间,就会降低吞吐量。
不同的垃圾回收算法,适用于不同的场景
在这里插入图片描述

3.垃圾回收算法01-标记清除算法

标记清除算法的核心思想分为两个阶段:

  • 1.标记阶段,将所有存活的对象进行标记。Java中使用可达性分析算法,从GC Root开始通过引用链遍历出所有存活对象。
  • 2.清除阶段,从内存中删除没有被标记也就是非存活对象。
    在这里插入图片描述

垃圾回收算法-标记清除算法的优缺点

优点:实现简单,只需要在第一阶段给每个对象维护标志位,第二阶段删除对象即可。

缺点:

  • 1.碎片化问题
    由于内存是连续的,所以在对象被删除之后,内存中会出现很多细小的可用内存单元。如果我们需要的是一个比较大的空间,很有可能这些内存单元的大小过小无法进行分配。在这里插入图片描述
  • 2.分配速度慢。由于内存碎片的存在,需要维护一个空闲链表,极有可能发生每次需要遍历到链表的最后才能获得合适的内存空间在这里插入图片描述

4.垃圾回收算法02-复制算法

复制算法的核心思想是:
1.准备两块空间From空间和To空间,每次在对象分配阶段,只能使用其中一块空间(From空间)。
2.在垃圾回收GC阶段,将From中存活对象复制到To空间。
3.将两块空间的From和To名字互换。在这里插入图片描述

完整的复制算法的例子:
1.将堆内存分割成两块From空间 To空间,对象分配阶段,创建对象。
2.GC阶段开始,将GC Root搬运到To空间
3.将GC Root关联的对象,搬运到To空间
4.清理From空间,并把名称互换在这里插入图片描述

垃圾回收算法-复制算法的优缺点

优点

  • 1.吞吐量高
    复制算法只需要遍历一次存活对象
    复制到To空间即可,比标记-整理
    算法少了一次遍历的过程,因而性
    能较好,但是不如标记-清除算法,
    因为标记清除算法不需要进行对象
    的移动

  • 2.不会发生碎片化
    复制算法在复制之后就会将对象按顺序放
    入To空间中,所以对象以外的区域都是可
    用空间,不存在碎片化内存空间。

缺点

  • 内存使用效率低
    每次只能让一半的内存空间来为创建对象使用内存使用效率低

5.垃圾回收算法03-标记整理算法

标记整理算法也叫标记压缩算法,是对标记清理算法中容易产生内存碎片问题的一种解决方案。
核心思想分为两个阶段:
1.标记阶段,将所有存活的对象进行标记。Java中使用可达性分析算法,从GC Root开始通过引用链遍历出所有存活对象。
2.整理阶段,将存活对象移动到堆的一端。清理掉存活对象的内存空间。
在这里插入图片描述

标记整理算法的优缺点

优点

  • 1.内存使用效率高
    整个堆内存都可以使用,不会像复
    制算法只能使用半个堆内存
  • 2.不会发生碎片化
    在整理阶段可以将对象往内存的一侧进行
    移动,剩下的空间都是可以分配对象的有
    效空间

缺点

  • 整理阶段的效率不高
    整理算法有很多种,比如Lisp2整
    理算法需要对整个堆中的对象搜索3
    次,整体性能不佳。可以通过TwoFinger、
    表格算法、ImmixGC等高效的
    整理算法优化此阶段的性能

6.垃圾回收算法04-分代垃圾回收算法

现代优秀的垃圾回收算法,会将上述描述的垃圾回收算法组合进行使用,其中应用最广的就是分代垃圾回收算法(Generational GC)。

分代垃圾回收将整个内存区域划分为年轻代和老年代:
在这里插入图片描述
arthas查看分代之后的内存情况
⚫ 在JDK8中,添加-XX:+UseSerialGC参数使用分代回收的垃圾回收器,运行程序。
⚫ 在arthas中使用memory命令查看内存,显示出三个区域的内存情况。在这里插入图片描述
垃圾回收算法-分代垃圾回收算法
分代回收时,创建出来的对象,首先会被放入Eden伊甸园区。
随着对象在Eden区越来越多,如果Eden区满,新创建的对象已经无法放入,就会触发年轻代的GC,称为Minor GC或者Young GC。
Minor GC会把需要eden中和From需要回收的对象回收,把没有回收的对象放入To区。在这里插入图片描述
垃圾回收算法-分代垃圾回收算法
接下来,S0会变成To区,S1变成From区。当eden区满时再往里放入对象,依然会发生Minor GC。
此时会回收eden区和S1(from)中的对象,并把eden和from区中剩余的对象放入S0。
注意:每次Minor GC中都会为对象记录他的年龄,初始值为0,每次GC完加1。在这里插入图片描述
垃圾回收算法-分代垃圾回收算法
如果Minor GC后对象的年龄达到阈值(最大15,默认值和垃圾回收器有关),对象就会被晋升至老年代。
当老年代中空间不足,无法放入新的对象时,先尝试minor gc如果还是不足,就会触发Full GC,Full GC会对整个堆进行垃圾回收。
如果Full GC依然无法回收掉老年代的对象,那么当对象继续放入老年代时,就会抛出Out Of Memory异常。在这里插入图片描述

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

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

相关文章

利用STM32和MFRC522 IC实现智能卡的读取和数据存储

利用STM32微控制器和MFRC522 RFID读写器芯片,可以实现智能卡的读取和数据存储功能。智能卡是一种集成了RFID技术和存储芯片的卡片,它可以用于身份验证、门禁控制、支付系统等应用场景。下面将介绍如何使用STM32和MFRC522芯片进行智能卡的读取和数据存储&…

【古诗生成AI实战】之四——模型包装器与模型的训练

在上一篇博客中,我们已经利用任务加载器task成功地从数据集文件中加载了文本数据,并通过预处理器processor构建了词典和编码器。在这一过程中,我们还完成了词向量的提取。 接下来的步骤涉及到定义模型、加载数据,并开始训练过程。…

如何申请永久免费的SSL证书

首先,让我们了解什么是SSL证书。 SSL(Secure Socket Layer)证书是一种数字证书,它提供了一种在互联网上安全地传输数据的方法。 这是一个必须的安全工具,可以加密您的网站和客户之间的所有信息。为了保护用户数据和确保…

消息队列使用场景、概念和原理

文章目录 1 使用消息队列的场景1.1 消息队列的异步处理1.2 消息队列的流量控制(削峰)1.3 消息队列的服务解耦1.4 消息队列的发布订阅1.5 消息队列的高并发缓冲 2 消息队列的基本概念和原理2.1 消息的生产者和消费者2.2 Broker2.3 点对点消息队列模型 ---…

059-第三代软件开发-巧用工控板LED指示灯引脚

第三代软件开发-巧用工控板LED指示灯引脚 文章目录 第三代软件开发-巧用工控板LED指示灯引脚项目介绍巧用工控板LED指示灯引脚第一种方式第二种方式 总结 关键字: Qt、 Qml、 Power、 继电器、 IO 项目介绍 欢迎来到我们的 QML & C 项目!这个项…

【Bootloader学习理解学习--加强版】

笔者在接着聊一下bootloader,主要针对MCU的Bootloader。 笔者之前介绍过一篇Bootloader文章,主要是其概念、一些升级包的格式和升级流程,本次接着来说一下。 1、MCU代码运行方式 之前文章也介绍过,MCU的代码运行方式有两种&…

二级分类菜单及三级分类菜单的层级结构返回

前言 在开发投诉分类功能模块时,遇到过这样一个业务场景:后端需要按层级结构返回二级分类菜单所需数据,换言之,将具有父子关系的List结果集数据转为树状结构数据来返回 二级分类菜单 前期准备 这里简单复刻下真实场景中 出现的…

二十六、搜索结果处理(排序、分页、高亮)

目录 一、排序 二、分页 1、深度分页问题 2、三种方案的优缺点 (1)fromsize 优点: 缺点: 场景: (2)after search 优点: 缺点: 场景: &#xff0…

hive杂谈

数据仓库是一个面向主题的、集成的、非易失的、随时间变化的,用来支持管理人员决策的数据集合,数据仓库中包含了粒度化的企业数据。 数据仓库的主要特征是:主题性、集成性、非易失性、时变性。 数据仓库的体系结构通常包含4个层次&#xff…

03-《人月神话》巴赫、UML和领域驱动设计伪创新:中译本纠错及联想

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 2001年,我们翻译《人月神话》的时候,由于水平有限,译文中存在不少错误。 这些年,随着阅历的增长,在重读的时候偶尔也会有“…

推动卓越创新:了解 4 种研发团队架构如何优化您的组织

揭示敏捷实践中常犯的12大错误,了解如何避免这些敏捷失败 陷阱,找出问题根源并采取有效改进措施,提高项目成功率。立即连线 Runwise.co 社区敏捷专家获得专业建议,或 Runwise.co 在线学习敏捷方法实战课程,提升您和团队…

go当中的channel 无缓冲channel和缓冲channel的适用场景、结合select的使用

Channel Go channel就像Go并发模型中的“胶水”,它将诸多并发执行单元连接起来,或者正是因为有channel的存在,Go并发模型才能迸发出强大的表达能力。 无缓冲channel 无缓冲channel兼具通信和同步特性,在并发程序中应用颇为广泛。…

代码随想录算法训练营 ---第四十五天

前言: 昨天的题做过之后,今天的题基本上都很简单,但是要注重一下细节。 第一题: 简介: 动态规划五部曲: 1.确定dp数组的含义 dp[i]:爬到有i个台阶的楼顶,有dp[i]种方法 2.确定dp…

CSS之弹性盒子Flexible Box

我想大家在做布局的时候,没接触flex布局之前,大家都是用浮动来布局的,但现在我们接触了flex布局之后,我只能说:“真香”。让我为大家介绍一下弹性盒子模型吧! Flexible Box 弹性盒子 在我们使用弹性盒子时&…

泛型你掌握多少?包装类你深入了解过吗?快进来看看吧~

目录 1、泛型是什么——引出泛型 2、泛型的使用 2.1、语法 2.2泛型类的使用 2.3、裸类型 3、泛型如何编译 3.1、擦除机制 3.2、为什么不能实例化泛型类型数组 4、泛型的上界 5、泛型方法 5.1、语法 5.2、举例 6、通配符 6.1、什么是通配符 6.2、统配符解决了什么…

2017年五一杯数学建模C题宜居城市问题值解题全过程文档及程序

2017年五一杯数学建模 C题 宜居城市问题 原题再现 城市宜居性是当前城市科学研究领域的热点议题之一,也是政府和城市居民密切关注的焦点。建设宜居城市已成为现阶段我国城市发展的重要目标,对提升城市居民生活质量、完善城市功能和提高城市运行效率具有重要意义。…

正则表达式回溯陷阱

一、匹配场景 判断一个句子是不是正规英文句子 text "I am a student" 一个正常的英文句子如上,英文单词 空格隔开 英文单词 多个英文字符 [a-zA-Z] 空格用 \s 表示 那么一个句子就是单词 空格(一个或者多个,最后那个单词…

An example of a function uniformly continuous on R but not Lipschitz continuous

See https://math.stackexchange.com/questions/69457/an-example-of-a-function-uniformly-continuous-on-mathbbr-but-not-lipschitz?noredirect1

十七、事件组

1、事件组是什么 1.1、举例说明 (1)学校组织秋游,组长在等待: 张三:我到了李四:我到了王五:我到了组长说:好,大家都到齐了,出发! (2)秋游回来第二天就要提交一篇心得…

leetcode刷题详解五

117. 填充每个节点的下一个右侧节点指针 II 关键点:先递归右子树 画一下就知道了,画一个四层的二叉树,然后右子树多画几个节点就知道为啥了 Node* connect(Node* root) {if(!root || (!root->left && !root->right)){return ro…