当前位置: 首页 > news >正文

垃圾回收——G1

G1

G1不像之前的垃圾回收器一样,把堆内存分为新生代和老年代,取而代之的是分区。

G1相比于之前的CMS吞吐量显著增加,并且SWT时间很短,并且没有内存碎片。把之前CMS使用的标记-清除算法改成标记-整理,标记-复制算法。

步骤

1.初始标记:短暂STW,标记GCRoot能够到达的对象。

2.并发标记:不需要STW,标记间接可以到达的对象,这个时候是并行处理。

3.重新标记:需要STW,因为是并行标记所以有可能出现引用变更,所以把变更的对象进行标记。

4.筛选回收:根据标记结果,把存活的对象复制到一个新的区域,然后把旧的区域残留的对象回收。

分代

G1将堆内存分为多个大小相等的区域,每个区域都可以是Eden区,Survivor区或者Old区。可以通过-XX:G1HeapRegionSize=n来设置Region的大小,可以设定为1M,2M,4M,8M...32M

G1有专门分配大对象的Humongous区,而不是让大对象直接进入老年代的Region,规定如果一个对象超过了区域的50%就会被放到大对象区。

增量

G1可以以增量的方式回收垃圾,并不需要一下子全部回收掉,而是逐步的,增量的清理,有助于控制停顿时间。让用户感受不到这种细微的停顿。

并行

G1可以并行回收垃圾,使用多个CPU加速垃圾回收的速度,在年轻代里比较明显,因为年轻代需要经常回收。

标记整理

老年代在垃圾回收的时候使用了标记-整理算法。这个过程分为两个阶段。

1.标记存活的对象。

2.压缩堆空间

年轻代使用标记-复制算法,因为年轻到通常是朝生夕死的。

三种GC模式

YoungGC

当Eden区满的时候就会使用YoungGC,当需要分配对象到 Humongous 区域或者堆内存的空间占比超过 -XX:G1HeapWastePercent 设置的 InitiatingHeapOccupancyPercent 值时,G1 会触发一次 concurrent marking,它的作用就是计算老年代中有多少空间需要被回收,当发现垃圾的占比达到 -XX:G1HeapWastePercent 中所设置的 G1HeapWastePercent 比例时,在下次 Young GC 后会触发一次 Mixed GC。

MixedGC

MixedGC是指回收一部分年轻代和一部分老年代的区域。MixedGC采用的也是标记-复制算法。 在MixedGC过程中,如果发现老年代的空间还是不够,或者比例不对,那么就会出发FullGC 。

FullGC

回收整个堆内存和方法区

如果当前老年代区域不够,或者是YoungGC的平均晋升大小大于OldGC的剩余空间,那么久不会出发YoungGC而是出发FullGC

本文由 mdnice 多平台发布

http://www.cnnetsun.cn/news/1559784.html

相关文章:

  • ComfyUI+ControlNet实战:5分钟搞定AI线稿上色,手把手教你生成奇幻角色插画
  • 硬件工程师避坑指南:用Multisim仿真DC-DC电路时,这3个参数设置错误会让结果完全失真
  • PyTorch 2.8镜像多场景落地:从Diffusers文生视频到Transformers微调全流程
  • 如何用Scrapling提升网络爬取效率?全方位指南与实战技巧
  • 别再手动算日期了!用moment.js轻松搞定antd-design-vue的长期有效期功能
  • Lucia 智能家居自治系统:基于多智能体编排与边缘计算融合
  • 突破300毫秒瓶颈:Depth Pro单目度量深度估计技术全解析
  • 大模型风口来袭!0基础小白也能逆袭拿高薪?这份保姆级转行攻略免费送!
  • 在Windows 10/11上创建虚拟显示器:开源驱动完整指南
  • 用若依框架快速开发一个CMS栏目管理模块(SpringBoot+Vue3实战)
  • EServer跨平台GUI集成环境架构设计:基于Electron+Vue3的本地开发服务管理解决方案
  • 你的FVC结果靠谱吗?聊聊用NDVI估算植被覆盖度时,GIMMS-3G+数据预处理里那些容易被忽略的细节
  • Claude Code + DeepSeek v3.1 实战:如何用AI生成高质量图片水印工具类(附避坑指南)
  • openclaw生态Nunchaku FLUX.1-dev:GPU利用率监控与性能瓶颈分析
  • 解锁数字记忆:QQ空间历史数据备份与导出全攻略
  • 大语言模型安全实战:从提示词注入到全方位防御体系构建
  • **驱动程序设计实战:用 Rust实现高性能 Linux 字符设备驱动**在嵌入式系统与操作系统底层开发中,**驱动程序是连接硬件和内
  • PP-DocLayoutV3案例解析:从扫描版书籍到结构化电子书
  • 5个维度解析开源项目管理工具OpenProject:如何提升团队协作效率
  • 超越遥控器:玩转Ardupilot无人船的DOCK自动停靠与FOLLOW编队模式全攻略(基于OpenMV/Jetson)
  • OneMO模组ML307A的TCP vs UDP性能对比测试:OpenCPU环境下的实战数据
  • 告别手动转换!用Python脚本一键批量处理Labelme的JSON标注,生成YOLOv5/v8训练所需的TXT文件
  • Java伪终端完全实战:如何用pty4j实现跨平台命令行交互
  • OpenInTerminal深度解析:macOS终端快速启动架构设计与高效工作流方案
  • Reachy Mini桌面机器人:开源硬件的技术突破与实践应用
  • MTT S80显卡避坑指南:魔笔马良在Ubuntu 20.04上的完整部署流程
  • 使用Anaconda管理cv_unet_image-colorization开发环境:依赖隔离技巧
  • Steam客户端现代化改造技术:Millennium开源框架深度解析与实战指南
  • 解锁3大效率引擎:wewe-rss订阅服务实战指南
  • KEIL开发必备:3种生成bin文件的方法对比(含路径问题解决方案)