JAVA的平凡之路——此峰乃是最高峰JVM-GC垃圾回收器(2)-06

一、 触发GC

1、都有什么gc

Young gc、 Full gc、 Mixed gc

2、区别是什么

|------|-------------|-----------|---------|
| | Young gc | Mixed gc | Full gc |
| 执行节点 | 年轻代满了 | 老年代到达阀值 | 老年代满了 |
| 操作区域 | 年轻代+老年代(移入) | 年轻代+部分老年代 | 堆内所有区域 |
| 操作方式 | STW | STW | STW |
| 执行频率 | 高 | 中 | 低 |
| 执行成本 | 高 | 中 | 低 |

3、避免的gc

我们一般说的避免gc,指向的是full gc,因为full gc,设计区域广并且停顿时间长,会对用户体验造成不可逆影响。

二、细数GC

1、目前主流gc

(1)Serial

最早的gc回收器,年轻代,使用的是标记复制,单线程年轻代回收器。

(2)Serial Old

Serial 对应的老年代回收器,使用的标记整理,单线程老年代回收器。

(3)Parallel

Serial的多线程版本,多线程年轻代回收器 注重吞吐量

(4)Parallel Old

Serial Old的多线程版本,多线程老年代回收器

(5)ParNew

并行年轻代收集器,与CMS收集器配合使用

(6)CMS

真正意义上的并发收集器,老年代,4-8g时内存使用

(7)G1

逻辑分代,但是物理不分代的并发收集器,8g以上内存再考虑

(8)ZGC

不分代的并发收集器,100g内存再考虑

2、CMS并发收集器

图1.1

初始标记和重新标记都是STW,其余阶段都是并发处理

3、G1并发收集器

图1.2

初始标记、最终标记、筛选回收都是STW

4、ZGC并发回收器

图1.3

初始标记时会有短暂停顿,卖点是大内存,低停顿

三、查缺补漏

1、zgc的读屏障和颜色指针

对象指针在局部变量表中,64位的指针的高位进行对象状态存储,原有gc状态是保存在内存中的对象头中,所以减少了再根据指针查询对象的操作,降低消耗。

m0、m1都是标记位,只是根据周期不同进行使用,并且根据周期不同还会出现00、01、10、11等特殊含义,1为标记,0为不标记,标记为不回收,cms里面就有一个标记重置的处理,所以为了减少标记位重置的消耗,使用两个标记位交替使用。

读屏障,如果处于并发重分配阶段,访问会进到读屏障中,会根据转发表里的新纪录转发到新复制的对象上

相关推荐
古法老登瞎折腾1 小时前
大数据智能运维实战(十一):运维 MCP 的工程化——权限、限流、审计与错误处理
java·大数据·运维·spring ai·mcp
学逆向的2 小时前
C 堆区内存管理
c语言·开发语言·网络安全
huoyueyi2 小时前
《融天AI-APP从0到1开发实录》
开发语言·lua
智能运维指南2 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
yz_aiks3 小时前
Spring AI 2.1 ChatMemory 已过时用什么替代:迁移到 Session Memory 实战(JDBC 存储与会话压缩)
java·spring boot·大模型·ai agent·spring ai
金銀銅鐵3 小时前
[Java] 用 GUI 展示 EnumMap 增删键值对时的内部变化
java·后端·ai编程
学长毕设3 小时前
基于SpringBoot的上门洗车服务系统设计与实现
java·spring boot·后端
jason成都3 小时前
RTKLIB-Java 多基线联合RTK:FIX率从0%到91.5%的三层根因修复
java·gnss·rtklib·rtklib_java
OpenAnolis小助手4 小时前
PHP 两个严重漏洞曝光,龙蜥社区 24 小时完成 3 版本修复
开发语言·操作系统·php·龙蜥社区
鱼宵4 小时前
Stream 终端操作一次讲透:collect、count、reduce 怎么选
java·stream·终端操作