垃圾回收算法哪些阶段会STW

news/2025/4/2 11:23:54/文章来源:https://www.cnblogs.com/tsukinor/p/18799555

悲观者从机会中看到困难。乐观者从困难中看到机会。
——温斯顿·丘吉尔

标记-复制算法应用在CMS新生代(ParNew是CMS默认的新生代垃圾回收器)和G1垃圾回收器中。标记复制算法可以分为三个阶段:

  • 标记阶段,即从GC Roots集合开始,标记活跃对象;
  • 转移阶段,即把活跃对象复制到新的内存地址上;
  • 重定位阶段,因为转移导致对象的地址发生了变化,在重定位阶段,所有指向对象旧地址的指针都要调整到对象新的地址上。

下面以G1为例,通过G1中标记-复制算法过程(G1的Young GC和Mixed GC均采用该算法),分析G1停顿耗时的主要瓶颈。G1垃圾回收周期如下图所示:


G1的混合回收过程可以分为标记阶段、清理阶段和复制阶段。

标记阶段停顿分析

  • 初始标记阶段:初始标记阶段是指从GC Roots出发标记全部直接子节点的过程,该阶段是STW的。由于GC Roots数量不多,通常该阶段耗时非常短。
  • 并发标记阶段:并发标记阶段是指从GC Roots开始对堆中对象进行可达性分析,找出存活对象。该阶段是并发的,即应用线程和GC线程可以同时活动。并发标记耗时相对长很多,但因为不是STW,所以我们不太关心该阶段耗时的长短。
  • 再标记阶段:重新标记那些在并发标记阶段发生变化的对象。该阶段是STW的。

清理阶段停顿分析

  • 清理阶段清点出有存活对象的分区和没有存活对象的分区,该阶段不会清理垃圾对象,也不会执行存活对象的复制。该阶段是STW的。

复制阶段停顿分析

  • 复制算法中的转移阶段需要分配新内存和复制对象的成员变量。转移阶段是STW的,其中内存分配通常耗时非常短,但对象成员变量的复制耗时有可能较长,这是因为复制耗时与存活对象数量与对象复杂度成正比。对象越复杂,复制耗时越长,

四个STW过程中,初始标记因为只标记GC Roots,耗时较短。再标记因为对象数少,耗时也较短。清理阶段因为内存分区数量少,耗时也较短。转移阶段要处理所有存活的对象,耗时会较长。

因此,G1停顿时间的瓶颈主要是标记-复制中的转移阶段STW。

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

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

相关文章

【unity】学习制作2D横板冒险游戏-4-

敌人的基本逻辑和动画 创建文件如图所示c#文件继承父类Enemy给boar挂载代码在敌人脚本中定义基本的变量并实例化面朝方向 在游戏中我们可以看到野猪的默认方向为左边 此时的transform.localscale的值为1我们希望当野猪面向右边时facedir的值为1,以此来判断敌人的面朝方向野猪的…

判断垃圾的方法

悲观者从机会中看到困难。乐观者从困难中看到机会。 ——温斯顿丘吉尔在Java中,判断对象是否为垃圾(即不再被使用,可以被垃圾回收器回收)主要依据两种主流的垃圾回收算法来实现:引用计数法和可达性分析算法。 引用计数法(Reference Counting)原理:为每个对象分配一个引用计数…

mRNA,IncRNA,miRNA

mRNA、lncRNA 和 miRNA 的核心区别 三者均为 RNA 分子,但在结构、功能和生物学作用上有显著差异: 1. mRNA(信使RNA)功能 :将 DNA 的遗传信息转录后传递至核糖体,指导蛋白质合成(基因表达的核心步骤)。结构 :单链线性结构,长度通常为数百至数千个核苷酸(nt)。 包含编码…

Training-WWW-Robots 攻防世界

进入网站看到根据提示可知:robots.txt 是关键点 进去看到:看到关键路径:进入看到flag

python第三章课后练习题

3.19 import time date_str = time.strftime("%Y年%m月%d日",time.localtime()) print("当前日期:",date_str)3.20 import time current_time = time.localtime() format1 = time.strftime("%Y年%m月%d日",current_time) print("格式1:&q…

[DevOps] 使用 Windows Sysprep(系统准备)重置计算机 SID

关于 Sysprep(系统准备) https://learn.microsoft.com/zh-cn/windows-hardware/manufacture/desktop/sysprep--system-preparation--overview?view=windows-11 Sysprep 是 Windows 映像的一部分,在审核模式下运行。Sysprep(系统准备)可以准备 Windows 客户端或 Windows S…

堆区的介绍

悲观者从机会中看到困难。乐观者从困难中看到机会。 ——温斯顿丘吉尔我们先来说堆。堆是 OOM 故障最主要的发生区域。它是内存区域中最大的一块区域,被所有线程共享,存储着几乎所有的实例对象、数组。所有的对象实例以及数组都要在堆上分配,但是随着 JIT 编译器的发展与逃逸…

langchain0.3教程:从0到1打造一个智能聊天机器人

构建一个智能对话聊天机器人需要多少行代码?只需要不到30行。本篇文章结合gradio和langchain0.3从0到1创建一个智能聊天机器人并逐步优化流式输出、上下文记忆等功能在上一篇文章《大模型开发之langchain0.3(一):入门篇》 中已经介绍了langchain开发框架的搭建,最后使用la…

OpenGL渲染YUV实战:GPU加速转换与MipMap模糊效果实现

本文介绍了使用Qt和OpenGL渲染YUV420P数据的方法,包括YUV到RGB的转换以及通过OpenGL实现画质模糊的技术。文章详细讲解了YUV420P的结构、OpenGL纹理处理、MipMap技术及其在模糊效果中的应用,并探讨了在OpenGL ES 2.0环境下的兼容性问题及解决方案。最后,提出了进一步优化性能…

OpenGL绘制YUV、OpenGL 实现画质模糊以及 OpenGL ES 实现画质模糊

本文介绍了使用Qt和OpenGL渲染YUV420P数据的方法,包括YUV到RGB的转换以及通过OpenGL实现画质模糊的技术。文章详细讲解了YUV420P的结构、OpenGL纹理处理、MipMap技术及其在模糊效果中的应用,并探讨了在OpenGL ES 2.0环境下的兼容性问题及解决方案。最后,提出了进一步优化性能…

electron浏览器模式多标签方案

main.js let mainWindow function createWindow () {// Create the browser window.mainWindow = new BrowserWindow({}) }app.whenReady().then(() => {createWindow()const tabManager = new TabManager(mainWindow, baseUrl);//打开标签ipcMain.handle(open-tab, (event,…