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

🐵看完这篇文章,希望你有点收获🚗

注意:看之前你需要对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的发生。

相关推荐
胡耀超1 分钟前
从逻辑视角学习信息论:概念框架与实践指南
学习·安全·网络安全·信息与通信·数据科学·信息论
.生产的驴4 分钟前
Vue3 数据可视化屏幕大屏适配 页面自适应 响应式 数据大屏 大屏适配
java·c++·vue.js·后端·信息可视化·前端框架·vue
龙泉寺天下行走10 分钟前
《进化陷阱》--AI 生成文章 《连载 1》
java·服务器·前端
CodingCos11 分钟前
【ARM/RISCV 嵌入式 编译系列 16 -- GCC 进制优化编译的常用方法】
arm开发·jvm·gcc 优化
qq_3938282218 分钟前
Excel多合一文件合并工具
学习·excel·软件需求
王小义笔记19 分钟前
使用注解动态映射:根据实体List列表动态生成Excel文件
java·数据结构·list·excel·poi
crazyme_640 分钟前
C++ 中的暴力破解算法
开发语言·c++·算法
人类发明了工具44 分钟前
【强化学习】深度强化学习 - Deep Q-Network(DQN)算法
算法·数学建模·强化学习
珹洺1 小时前
计算机操作系统(十二)详细讲解调计算机操作系统调度算法与多处理机调度
android·java·数据库
fei_sun1 小时前
【Harmony OS】作业四 布局
java·linux·网络