‍♂️垃圾收集算法必看!学习指数满天星!!!

🐵看完这篇文章,希望你有点收获🚗
注意:看之前你需要对JVM有点了解。。。
首先,垃圾回收算法主要分有三种:

标记-清除算法

见名知意,标记-清除(Mark-Sweep)算法分为两个阶段:

  • 标记:标记出所有需要回收的对象。
  • 清除:回收所有被标记的对象
    在这里插入图片描述

标记-清除算法比较基础,但是主要存在两个缺点:

  • 执行效率不稳定:如果java堆中包含大量对象,而且其中大部分是需要被回收的。这时必须进行大量标记和清除的动作,导致标记和清除两个过程的执行效率都随对象数量的增加而降低。
  • 内存空间的碎片化问题: 标记、清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后程序在运行过程中,需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
    PS:其实,可以边看边在脑子里想一下整个流程。

2.标记-复制算法

标记-复制算法解决了标记-清除算法面对大量可回收对象时执行效率低的问题。
过程呢!也很简单:将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另一块上面,然后再把已使用过的内存空间一次清理掉。
在这里插入图片描述
这种算法存在一个明显的缺点:一部分空间没有使用,存在空间的浪费。
新生代垃圾收集主要采用这种算法,因为新生代的存活对象比较少,每次复制的只是少量的存活对象。当然,实际新生代的收集不是按照这个比例。

3.标记-整理算法

为了降低内存的消耗,引入一种针对性的算法:标记-整理(Mark-Sweep)算法。
其中的标记过程仍“标记-清除””算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存。
在这里插入图片描述
标记-整理算法主要用于老年代,移动存活对象是个极为负重的操作,而且这种操作需要STW(Stop The World)才能进行,只能从整体的吞吐量来考量,老年代使用标记-整理算法更加合适。

除此之外!这次写博客,说了一个新的名词:STW

这是个啥意思呢!既然说到了,就简单说一哈!!!
Stop-The-World,简称STW,指的是GC事件发生过程中,会产生应用程序的停顿,停顿产生时整个应用程序线程都会被暂停,·没有任何响应,就有点像卡死了的感觉,这种停顿我们就称之为STW.
我们知道在JVM有种算法用来区分那些是可以进行回收的(可达性分析算法)。而这种算法中吗,枚举根节点(GC Roots)会导致所欲偶java执行线程停顿。
当然,STW的过程也有几个重要的点:

  1. 分析工作必须在一个能确保一致性的快照中进行。
  2. 一致性指整个执行系统看起来就像被冻结在某个时间点上。
  3. 如果出现分析过程中对象引用关系还在不断变化,则分析结果的准确性无法保证。

被STW中断的应用程序,线程会在完成GC之后恢复,频繁中断会让用户感觉像是网速不快造成电影卡带一样,所有我们需要减少STW的发生。
STW事件和采用哪款GC无关,所有的GC都有这个事件。哪怕是G1也不能完全避免stop-the-world情况发生,只能说明垃圾回收器越来越优秀,回收效率越来越高,尽可能地缩短了暂停时间。
STW是JVM在后台自动发起和自动完成的。在用户不可见的情况下,把用户正常的工作线程全部停掉。开发中不要用System,gc();会导致Stop-The-World的发生。

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

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

相关文章

小米打印机Mi All-in-One Inkjet Printer进行扫描

1,打开电脑的控制面板,找到打印机 2,,选择小米打印机【Mi All-in-One Inkjet Printer】;右键,选择开始扫描 3,可以预览,或者直接扫描 4,点击下一步,导入图片 …

使用 Flask Blueprint 实现模块化 Web 应用

文章目录 1. 什么是 Flask Blueprint?2. 为什么要使用 Flask Blueprint?3. 如何使用 Flask Blueprint?4. 在 Blueprint 之间进行通信5. 结合 Flask 插件系统进行功能拓展结语 当构建大型 Flask Web 应用时,保持代码的组织结构清晰…

USB3.0接口——(2)数据结构

1.数据结构 在 USB 3.0 及更高版本的 xHCI 协议中,“Rings”、“Transfer Request Block (TRB)” 和 “Transfer Descriptor (TD)” 是用于管理 USB 数据传输和事件的重要概念。 1.1.Rings Rings是指一种数据结构,用于组织和管理 USB 数据传输和事件。…

STM32-07-STM32_外部中断

文章目录 STM32 中断系统1. 中断2. NVIC3. EXTI4. AFIO5. 中断配置步骤6. 外部中断代码 STM32 中断系统 1. 中断 目的:中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。中断过程:当CPU正在处理某事件的时候外界发生了紧急事件请求 &#…

Java构造方法详解

在Java方法内部定义一个局部变量时,必须要初始化,否则就会编译失败,如下: 要让上述代码通过编译,只需在使用a之前给a赋一个初始值即可 如果是对象:下面用一个日期类演示 我们没有给年月日赋值,…

优雅谈论大模型7:重新审视神经网络

这个专栏围绕着大模型的基本知识点深入浅出,章节之间的联系较为紧密。若在某个环节出现卡点,可以回到如何优雅的谈论大模型重新阅读。而斯坦福2024人工智能报告解读则为通识性读物。若对于如果构建生成级别的AI架构则可以关注AI架构设计专栏。技术宅麻烦…

springboot房屋租赁系统

摘要 房屋租赁系统;为用户提供了一个房屋租赁系统平台,方便管理员查看及维护,并且可以通过需求进行设备信息内容的编辑及维护等;对于用户而言,可以随时进行查看房屋信息和合同信息,并且可以进行报修、评价…

【C++】学习笔记——继承_2

文章目录 十二、继承5. 继承与友元6. 继承与静态成员7. 复杂的菱形继承及菱形虚拟继承 未完待续 十二、继承 5. 继承与友元 友元关系不能继承,也就是说父类友元不能访问子类私有和保护成员 。除非子类也设置成友元。 6. 继承与静态成员 父类定义了 static 静态成…

干最毒的事,做最靓的仔,贾诩为何会被称为“汉末第一毒士”?

两汉各有一毒士,西汉陈平,东汉贾诩。 啥叫“毒士”呢?就是那种专出那种缺德的招术、招招要人命的参谋、秘书。 这种人,对于他们的老板来说,那是绝对是嘎嘎好使,因为一出手就能起到立竿见影的效果。但是&a…

IC卡16个扇区详解:揭秘智能卡的存储结构

目录标题 IC卡的基本结构扇区的划分扇区的功能扇区的安全性扇区的应用NFC卡和IC卡,从外观怎样区分总结 在智能卡的世界里,IC卡(Integrated Circuit Card)以其安全性和便捷性成为了现代生活中不可或缺的一部分。无论是用于支付、身…

基于正点原子的FreeRTOS学习笔记——任务挂起与恢复

目录 学习目标: 学习笔记: 一、什么是挂起 二、任务挂起 三、任务恢复 四、中断中恢复任务 1、中断任务恢复函数 2、优先级说明 实验代码: 一、任务 二、中断 学习目标: 掌握任务的挂起与恢复 学习笔记: …