ZGC暂停时间超标?一文掌握日志分析核心技巧,快速定位瓶颈

第一章:ZGC暂停时间超标?问题的根源与应对策略

ZGC(Z Garbage Collector)作为JDK中面向低延迟场景的垃圾收集器,其目标是将GC暂停时间控制在10毫秒以内。然而在实际生产环境中,部分应用仍会出现暂停时间显著超标的异常情况,影响系统响应性能。

常见导致ZGC暂停时间延长的因素

  • 堆内存过大且未合理配置并发线程数
  • 应用存在大量短期存活的大对象分配
  • 操作系统资源竞争,如CPU调度延迟或内存交换(swap)
  • JVM参数配置不当,例如未启用-XX:+UnlockExperimentalVMOptions -XX:+UseZGC

关键JVM调优参数建议

参数推荐值说明
-XX:ZCollectionInterval30-60控制ZGC强制触发间隔(秒),避免长时间不回收
-XX:ZAllocationSpikeTolerance3.0提升对分配突增的容忍度,减少紧急GC触发
-XX:+ZUncommit启用允许释放未使用内存,降低驻留集大小

诊断与监控方法

通过启用详细的GC日志输出,可精准定位暂停来源:

-XX:+PrintGCDetails \
-XX:+PrintGCTimeStamps \
-Xlog:gc*,gc+heap=debug,gc+z=info::file=zgc.log
上述指令将生成包含时间戳、堆状态及ZGC各阶段耗时的日志文件,便于使用工具如zgc-analyzer或GCViewer进行可视化分析。
graph TD A[应用分配大对象] --> B{ZGC是否及时并发处理?} B -->|是| C[暂停时间正常] B -->|否| D[触发转移失败→Full GC] D --> E[暂停时间飙升] E --> F[调整并发线程数或堆大小]

第二章:ZGC日志结构解析与关键指标解读

2.1 ZGC日志的基本格式与生命周期阶段划分

ZGC(Z Garbage Collector)的日志输出遵循统一的结构,便于分析垃圾回收的各个生命周期阶段。每条日志以时间戳开头,随后标明GC事件类型及关键阶段。
日志基本结构示例

[0.123s][info][gc] GC(1) Pause Mark Start 2M->1M(4M) 1.234ms
[0.456s][info][gc] GC(1) Pause Relocate 2M->2M(8M) 2.345ms
上述日志中,0.123s 表示JVM启动后的时间偏移;Pause Mark Start 和 Pause Relocate 是ZGC的核心暂停阶段;2M->1M(4M) 分别表示堆使用量在GC前、后及总容量;末尾为该阶段耗时。
ZGC生命周期关键阶段
  • Pause Mark Start:标记阶段起始,短暂暂停应用线程以初始化标记栈
  • Concurrent Mark:并发执行对象图遍历,不阻塞应用线程
  • Pause Relocate:准备重分配集,决定哪些内存区域将被回收
  • Concurrent Relocate:实际移动对象并更新引用,全程与应用并发运行
这些阶段共同构成ZGC低延迟回收的核心机制,其日志清晰反映各阶段行为与性能特征。

2.2 理解Pause标记与并发阶段的时间分布

在垃圾回收过程中,Pause标记代表了应用线程被暂停的时刻,通常发生在关键的GC阶段如初始标记和重新标记。这些停顿时间直接影响应用的响应性能。
典型GC阶段时间分布
  • 初始标记:短暂暂停,标记根对象;
  • 并发标记:与应用线程并行执行,遍历对象图;
  • 重新标记:再次暂停,完成最终标记;
  • 并发清理:无暂停,回收不可达对象。
代码示例:G1 GC日志中的Pause分析

[GC pause (G1 Evacuation Pause) (young), 0.0042145 secs]
该日志表明一次年轻代的暂停回收,持续时间为4.2毫秒。其中“pause”明确指示线程暂停,而“concurrent”阶段则不会出现此类标记。
时间分布对比表
阶段是否暂停平均耗时
初始标记是1-5ms
并发标记否10-50ms
重新标记是5-20ms
并发清理否可忽略

2.3 Root处理、重定位集构建对暂停的影响分析

在垃圾回收过程中,Root处理是决定对象存活性的关键步骤。它通过扫描线程栈、寄存器和全局变量等根集合,标记所有可达对象。
Root扫描与STW关联
Root扫描通常在“Stop-The-World”(STW)阶段完成,导致应用线程暂停。其耗时直接影响停顿时间:
// 伪代码:根对象遍历
for each root := range roots {
    if object := deref(root); object != nil {
        markObject(object) // 标记根引用对象
    }
}
该过程需确保内存视图一致性,因此必须暂停用户线程。
重定位集构建策略
重定位集用于记录需要移动的对象集合。若在并发阶段构建不完整,将在STW期间补全,延长暂停时间。优化方式包括:
  • 提前在并发标记中收集潜在移动对象
  • 按代际或区域优先级划分重定位顺序
合理设计可显著降低最终转移阶段的停顿开销。

2.4 实践:从日志中提取关键暂停事件并分类统计

在系统稳定性分析中,识别和统计关键暂停事件(如GC停顿、线程阻塞)是性能调优的重要前提。通过对应用日志进行结构化解析,可高效提取相关事件。
日志模式匹配与提取
使用正则表达式匹配典型的暂停日志条目,例如:
(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).*Pause (Young|Full) GC.*duration: (\d+)ms
该表达式捕获时间戳、GC类型和持续时间,便于后续分类处理。
事件分类与统计
将提取的数据按类型归类,并统计频次与总耗时:
事件类型触发次数累计时长(ms)
Young GC142860
Full GC61120
通过聚合分析,可快速定位影响系统延迟的主要因素。

2.5 定位高延迟阶段:Pause Mark Start与Pause Relocate Start对比分析

在ZGC垃圾回收过程中,Pause Mark Start 和 Pause Relocate Start 是两个关键的停顿阶段,其持续时间直接影响应用的延迟表现。
阶段职责解析
  • Pause Mark Start:触发并发标记的起点,完成根集合扫描准备;
  • Pause Relocate Start:启动并发重分配,决定哪些区域需被压缩整理。
性能对比数据
指标Pause Mark Start (μs)Pause Relocate Start (μs)
平均停顿80120
最大停顿150300
典型调优建议
-Xlog:gc+phases=info# 输出各阶段详细耗时
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
通过日志可识别哪一阶段成为延迟瓶颈。通常,Relocate阶段因涉及对象移动规划,停顿更长,需关注堆内存碎片化程度与Region分布。

第三章:常见导致ZGC暂停升高的场景与成因

3.1 堆大小配置不合理引发的元数据扫描延迟

在JVM运行过程中,堆内存的不合理配置会直接影响元数据区(Metaspace)的管理效率,进而导致频繁的元数据扫描与Full GC触发。
常见配置误区
  • 初始堆过小导致频繁扩容
  • 最大堆设置过高,延长GC停顿时间
  • 未合理限制Metaspace大小
JVM启动参数示例

-XX:MetaspaceSize=256m \
-XX:MaxMetaspaceSize=512m \
-Xms1g -Xmx1g \
-XX:+UseG1GC
上述配置通过限定Metaspace上限防止内存溢出,并固定堆大小以减少动态调整带来的开销。其中,-Xms与-Xmx设为相同值可避免堆伸缩引发的暂停,而G1垃圾回收器能更高效处理大堆场景下的元数据扫描任务。

3.2 高频对象分配与引用处理带来的根扫描压力

在现代垃圾回收器中,根扫描是决定停顿时间的关键阶段。当应用频繁创建短期对象并持有大量活跃引用时,会显著增加根集的规模和复杂度。
根集膨胀的典型场景
  • 短生命周期对象在年轻代大量分配,导致GC Roots中局部变量引用激增
  • 缓存未合理控制容量,使老年代长期持有强引用,增大扫描负担
  • 并发线程栈深度较大,每个线程栈帧中的对象引用均需纳入扫描范围
代码示例:高频分配引发的扫描压力

for (int i = 0; i < 10000; i++) {
    Object temp = new byte[1024]; // 每次分配新对象
    threadLocalCache.add(temp);   // 强引用加入线程本地缓存
}
上述代码在循环中持续分配对象并保存强引用,导致根扫描阶段必须遍历整个缓存链表。threadLocalCache作为GC Root的一部分,其引用的对象无法被回收,直接扩大了根集扫描范围,延长STW时间。

3.3 实践:通过日志识别由类卸载或JNI临界区引起的意外停顿

在JVM运行过程中,类卸载和JNI临界区操作可能引发难以察觉的停顿。通过分析GC日志和线程堆栈,可定位此类问题。
启用详细日志输出
为捕获类卸载行为,建议开启以下JVM参数:

-XX:+TraceClassUnloading -Xlog:class+unload=info -XX:+PrintGCDetails
该配置会在类被卸载时输出日志,便于确认是否发生频繁类加载/卸载周期。
识别JNI阻塞
当线程进入JNI临界区时,若本地代码执行时间过长,将导致JVM无法响应。可通过线程转储识别:
  • 查找状态为in native但长时间无进展的线程
  • 结合-Xlog:os+thread=trace追踪线程切换细节
典型日志特征对照表
现象日志特征可能原因
类卸载集中发生Unloading class XXXClassLoader频繁重建
线程长时间停留nativein JNI critical regionJNI代码阻塞或死锁

第四章:基于日志的性能瓶颈定位实战方法

4.1 构建时间序列视图:绘制各暂停阶段的趋势图谱

在分析系统暂停行为时,构建时间序列视图是识别阶段性趋势的关键步骤。通过可视化手段,能够清晰展现各暂停事件在时间轴上的分布与持续时长。
数据准备与结构定义
首先需将原始日志中的暂停事件按时间戳排序,并分类标记为“GC暂停”、“I/O阻塞”或“线程争用”等类型。每条记录包含字段:timestamp、duration_ms 和 type。

import pandas as pd
df = pd.read_csv("pause_events.log")
df['timestamp'] = pd.to_datetime(df['timestamp'])
df.set_index('timestamp', inplace=True)
该代码段完成数据加载与时间索引设置,便于后续按时间窗口聚合。
趋势图谱绘制
使用 Matplotlib 分阶段绘制堆叠面积图,展示不同类型暂停的演变趋势。

df.resample('5min').sum().plot(kind='area', stacked=True)
此方法以5分钟为粒度汇总暂停时长,堆叠显示各类暂停贡献,直观揭示系统稳定性变化。

4.2 利用grep/awk脚本自动化提取与报警关键阈值

在系统监控中,及时识别异常日志并触发告警至关重要。通过结合 `grep` 与 `awk` 脚本,可高效提取关键性能指标并判断是否超出预设阈值。
日志过滤与字段提取
使用 `grep` 定位包含错误或性能数据的日志行,再通过 `awk` 解析具体数值:
# 提取响应时间超过500ms的请求
grep "REQUEST_TIME" app.log | awk '$NF > 500 {print $0; if($NF > 1000) print "ALERT: Latency critical!"}'
上述脚本中,`$NF` 表示每行最后一个字段(即响应时间),当其大于500ms时输出记录,超过1秒则打印告警信息。
阈值分级与动作响应
可设定多级阈值策略,提升告警精准度:
  • 警告级别:700ms < 响应时间 ≤ 1000ms
  • 严重级别:响应时间 > 1000ms
  • 自动触发邮件或写入告警队列

4.3 结合JFR与ZGC日志进行交叉验证分析

在排查Java应用的GC性能问题时,单独依赖ZGC日志或JFR(Java Flight Recorder)数据可能无法全面还原问题场景。通过将两者结合分析,可实现时间轴对齐与事件互证。
时间戳对齐机制
确保JFR与ZGC日志使用相同的时间基准(推荐启用-XX:+UseLargePages和-XX:+UnlockDiagnosticVMOptions -XX:+PrintJNIGCStalls),以便精确匹配GC暂停与应用事件。
关键事件对照表
JFR事件类型ZGC日志标识对应意义
G1GarbageCollectionPause Mark Start标记阶段开始
AllocationRequiringGCGarbage Collection (cycle)因分配触发回收
jfr print --events jdk.GCPhasePause --file=app.jfr
该命令提取JFR中所有GC暂停阶段,输出包括时间戳、持续时间和线程信息,可用于与ZGC日志中的Pause Initiate等事件比对,确认是否存在未记录的停顿源。

4.4 案例驱动:某生产系统ZGC暂停从10ms飙升至50ms的根因排查

某核心支付系统在大促期间突发ZGC暂停时间由稳定10ms骤增至50ms,严重影响交易链路SLA。初步排查JVM堆内存波动正常,GC频率未见突增。
监控数据分析
通过Prometheus抓取ZGC日志发现Pause Roots阶段耗时占比超80%。进一步分析线程根扫描(Thread Roots)耗时异常。

# zgc log snippet
[2024-05-10T12:30:15.123] GC(42) Pause Mark Start 10.2ms
[2024-05-10T12:30:15.124] GC(42) Pause Process Weak References 2.1ms
[2024-05-10T12:30:15.125] GC(42) Pause Roots 42.7ms
上述日志表明“Pause Roots”阶段成为瓶颈,重点锁定线程栈与JNI局部引用处理。
根因定位
使用async-profiler采样发现大量线程阻塞于本地方法回调:
  • 高频调用JNI接口导致JNI局部引用激增
  • ZGC需遍历所有JNI引用作为根集,引发暂停飙升
优化后通过减少JNI调用频次并显式释放局部引用,ZGC暂停恢复至12ms以内。

第五章:总结与优化建议

性能调优实践
在高并发场景下,数据库连接池配置直接影响系统吞吐量。以下为基于 Go 语言的 PostgreSQL 连接池优化示例:

db.SetMaxOpenConns(50)
db.SetMaxIdleConns(10)
db.SetConnMaxLifetime(30 * time.Minute)
合理设置最大打开连接数与空闲连接数,可避免因频繁创建连接导致的资源浪费。
监控指标建议
建立可观测性体系是保障系统稳定的关键。推荐监控以下核心指标:
  • 请求延迟(P99 < 200ms)
  • 错误率(HTTP 5xx < 0.5%)
  • GC 暂停时间(Go 应用应控制在 10ms 内)
  • 数据库慢查询数量(每分钟超过 5 次需告警)
缓存策略优化
采用多级缓存架构可显著降低后端压力。以下为典型缓存层级设计:
层级技术选型典型TTL命中率目标
本地缓存Caffeine / sync.Map60s70%
分布式缓存Redis Cluster300s90%
对于热点数据,建议启用主动刷新机制,避免集中过期引发雪崩。
自动化运维流程

CI/CD 流程中集成性能回归测试:

  1. 代码合并触发自动化压测
  2. 对比基线 QPS 与 P99 延迟
  3. 若性能下降超 15%,阻断发布并通知负责人
垃圾回收之CMS、G1、ZGC对比 ZGC在JDK15达到production-ready,JDK17是第一个开始推出成熟的ZGC的长期支持的ZGC版本。 阅读详情

相关推荐

Computer Networks 和 Computer & Security投稿经验

论文投稿

qq_50604294的博客 9233

新一代垃圾收集器:ZGC深度剖析,到底什么时候用?

支持TB量级的堆。我们生产环境的硬盘还没有上TB呢,这应该可以满足未来十年内,所有JAVA应用的需求了吧。最大GC停顿时间不超10ms。目前一般线上环境运行良好的JAVA应用Minor GC停顿时间在10ms左右,Major GC一般都需要100ms以上(G1可以调节停顿时间,但是如果调的过低的话,反而会适得其反),之所以能做到这一点是因为它的停顿时间主要跟Root扫描有关,而Root数量和堆大小是没有任何关系的。奠定未来GC特性的基础。最糟糕的情况下吞吐量会降低15%。

秃了也弱了 4651

电力抄表协议DL/T645和698.45到底有啥区别?一张图帮你选对协议

本文深入对比了电力抄表协议DL/T645和DL/T698.45的技术差异,从协议架构、报文结构、功能覆盖到实施成本进行全面分析。通过实际案例和数据,揭示698.45协议在通信效率、业务扩展性和长期成本上的优势,并提供清晰的选型决策流程图,帮助工程师根据具体需求选择最适合的电力抄表协议。

weixin_38168696的博客 401

JVM垃圾回收——ZGC垃圾收集器

ZGC(Z Garbage Collector)是一款在jdk11中加入的具有实验性质的低延迟的垃圾收集器,在jdk15中去掉实验的标识,成为具有商用的垃圾收集器。垃圾收集停顿时间控制在10毫秒以内(在jdk16之后停顿时间已经控制到1毫秒以内)的一款低停顿的垃圾收集器。如果非要给ZGC下一个定义的话,ZGC收集器是一款基于Region内存布局的,不设分代(不分老年代、新生代)的,使用了等技术来实现的基于标记-整理算法实现的,以低延迟为首要目标的一款的垃圾收集器。

weixin_39555954的博客 5141

Mamba-YOLO实战:环境配置+模型训练+精度调优全流程指南(附Colab代码)

在目标检测领域,一场由状态空间模型引发的技术革新正在悄然改写行业格局。近期国际顶级学术期刊连续发布的YOLOv5_mamba、FER-YOLO等突破性成果,不仅刷新了检测精度记录,更开创了结构化状态空间模型(SSM)与经典检测框架的创新融合范式。当前该领域涌现的十大标杆性研究,已在以下维度取得突破性进展:√ 遮挡目标识别准确率提升38%√ 小样本场景泛化能力增强2.7倍√ 视频流检测延迟降低至17ms√ 多目标交叉干扰抑制效果达SOTA。

2501_90555291的博客 1582

微信本地数据解密实战:从AES加密原理到EnMicroMsg.db恢复指南

数据加密是保障信息安全的核心技术,其中对称加密算法AES因其高效可靠,被广泛应用于各类本地数据保护场景。其原理是通过特定密钥对数据进行混淆转换,确保未经授权者无法读取原始内容。在移动应用领域,本地数据库加密对于保护用户隐私、防止数据泄露具有重要价值。微信作为国民级应用,对其本地存储的聊天记录数据库(EnMicroMsg.db)采用了基于设备标识和用户UIN生成的AES-256-CBC加密方案。理解这一机制,不仅有助于在合法合规前提下进行个人数据备份与恢复,也为开发者进行客户端安全分析、兼容工具开发提供了基础

weixin_30764883的博客 570

详解ZGC垃圾收集器

从G1垃圾收集器开始,后面的垃圾收集器都不再将堆按照新生代和老年代作为整体进行回收,都采用了局部收集的设计思想。 可能是由于G1作为第一代局部收集的垃圾收集器,所以它继续保留了新生代和老年代的概念,笔者认为从局部收集和分区的内存布局来看,按代收集理论已经没有什么特别存在的必要了。 一、ZGC的设计思路 1.1 ZGC的内存布局 新一代的垃圾收集器ZGC(Z Garbage Collector)就完全抛弃了按代收集理论,它与G1一样将内存划分成各个小的区域的,但与G1有所不同的是,ZGC的各个内存区域称为页面

sermonlizhi的博客 5664

Ansys CFX Pre 中 RGP 表的高级配置与优化策略

本文深入探讨了Ansys CFX Pre中RGP表的高级配置与优化策略,旨在帮助用户将仿真从“能用”提升至“精准好用”。文章重点解析了如何根据具体仿真场景,科学设定温度压力范围、选择流体类型,并针对相变等复杂工况实施网格加密与分离建表等关键优化技术,以显著提升计算精度与稳定性。

weixin_29216957的博客 1180

ZGC深度剖析

1.ZGC简介 ZGC是一款jdk11版本支持下的垃圾回收器,支持TB级别的内存,12306抢票软件一般都是TB级别的内存,STW时间不超过1ms,ZGC的出现是为了抢占外部市场,比如安卓,大数据等。 1.1 ZGC内存布局 ZGC没有分代的概念。一般分为小页面(小于256k的对象分配),中页面(小于4M的对象分配),大页面(大于4M的对象分配)。垃圾回收器回收内存一般先回收小页面对象,中页面和大页面一般不回收。 ZGC支持NUMA模型,UMA是在内存和 ...

qq_21575929的博客 4151

深入理解 ABAP 中的 Fast Data Access:从 @itab 到 FOR ALL ENTRIES 的性能关键路径

ABAP性能优化的关键在于理解Fast Data Access(FDA)机制,它连接了应用服务器的内表与数据库运算。FDA允许将内表数据推送到数据库进行筛选、聚合等操作,是SELECT...FROM@itab语法的基础。开发者需注意:1)该语法可能在内置引擎或数据库执行;2)仅当SQL能力超出ABAP范围时才建议使用;3)需通过CL_ABAP_DBFEATURES检查数据库支持情况。合理使用FDA可优化批量数据处理,但滥用可能导致性能下降。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1270

【教程4>第8章>第44节】本章整体思维导图与学习总结

本教程系列提供FPGA/MATLAB/Simulink学习资源,包含《MATLAB入门100例》、《FPGA入门100例》、《Simulink入门60例》等基础教程,以及《FPGA/MATLAB/Simulink联合开发》进阶教程和《人工智能基础应用研究》专题,适合不同层次的学习者系统掌握相关技术。

FPGA/MATLAB学习教程/源码/项目合作开发 448

JVM工作原理与实战(四十):ZGC原理

JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了ZGC、ZGC核心技术、ZGC的内存划分、ZGC的执行流程、分代ZGC的设计等内容。

Rye的博客 4271

如何使用 SAP ABAP Development Tool 连接 SAP BTP 上的免费 ABAP 编程环境

在云端环境编写 ABAP 代码会遇到一些限制,比如你无法在云端 ABAP 编程环境进行发生在传统 SAPGUI 里的 Dynpro 和 Screen 编程。部分在 SAPGUI 里使用的 List 处理相关的关键字比如 WRITE,还有 CALL TRANSACTION 等代码,也无法在云端使用。 当然如果大家觉得上面提到的这些限制不会影响自己的 ABAP 学习,就可以继续本文的阅读,使用 ABAP Development Tool 登录云端的 ABAP 编程环境。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1517

关于垃圾收集器G1与ZGC

G1(Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多个处理器及大容量内存的机器,以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能的特征。G1将Java堆划分为多个大小相等的独立区域(Region),JVM最多可有2048个Region。 一般Region大小等于堆大小除以2048,如对大小为4096M,则Region大小为2M。-XX:G1HeapRegionSize:手动指定Region大小,推荐不指定,使用默认计算方式。G1保留年轻代和老年代的概念,但不再使用物理隔阂,

weixin_45925485的博客 4810

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

垃圾回收之ZGC

ZGC是一种可伸缩、低延迟、高吞吐量的垃圾回收器,是JDK 11版本中引入的新特性。本文主要介绍ZGC及相关学习笔记。

qq_40776617的博客 1816

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java 垃圾收集器详解:CMS, G1, ZGC

选择合适的垃圾收集器需要综合考虑应用程序的特点和性能需求。如果需要最小化应用程序的停顿时间,可以选择 CMS 或者 ZGC;如果需要平衡吞吐量和停顿时间,则 G1 是一个不错的选择。对于大堆的应用,ZGC 和 Shenandoah 提供了极低的停顿时间,而 Parallel 和 ParNew 更适合需要高吞吐量的应用。未来随着 Java 技术的发展,新的垃圾收集器将会不断出现,以满足更多样化的需求。

四楼没电梯的专栏 2018

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JVM篇——G1、ZGC以及Shenandoah垃圾回收器详细介绍和底层算法展开分析,一篇文档,拿下常见经典的垃圾回收器!!!!!!

一、认识G1G1(Garbage-First)是一款面向服务端应用的垃圾收集器,主要针对配备多核CPU及大容量内存的机器。G1垃圾收集器的目标是满足GC停顿时间的同时,还兼具高吞吐量的性能特征。它主要特点如下:并行与并发:G1在回收期间,可以有多个GC线程同时工作,有效利用多核计算能力。此时用户线程可能会短暂停顿(STW)。G1拥有与应用程序交替执行的能力,部分工作可以和应用程序同时执行,因此,一般来说,不会在整个回收阶段发生完全阻塞应用程序的情况。

我热爱学习,也乐于分享。无论是科技前沿的洞见,还是生活中的小技巧,我都会在这里与你分享。我相信,知识就是力量,而分享则能让这份力量得到更好的传递。 3719

ZGC 垃圾回收过程

ZGC(Z Garbage Collector)是Java平台上的一种垃圾收集器,它是由Oracle开发的,旨在解决大堆的低延迟垃圾收集问题。ZGC是一种并发的分代垃圾收集器,它主要针对具有大内存需求和低停顿时间要求的应用程序。

若明天不见 1484

垃圾回收算法、垃圾回收器CMS、G1、ZGC详解

当前虚拟机的垃圾收集都采用分代收集算法,根据对象存活周期的不同将内存分为几块。一般将Java堆分为新生代、老年代,这样就可根据各代特点选择合适的垃圾收集器。新生代中,每次收集都会有大量对象(99%)死去,所以选择复制算法,只需少量对象的复制成本就可完成每次对象的垃圾回收。老年代的存活几率是比较高的,所以选择“标记-清除”或“标记-整理”算法进行垃圾收集。注意,“标记-清除”和“标记-整理”算法比复制算法慢10倍以上。

earlybird_xiong的博客 3170

ZGC 垃圾回收器

ZGC(The Z Garbage Collector)是JDK 11中推出的一款低延迟垃圾回收器,它的设计目标包括: 【1】停顿时间不超过10ms; 【2】停顿时间不会随着堆的大小,或者活跃对象的大小而增加,影响它的是 GCRoot对象; 【3】支持 8MB~4TB级别的堆(未来支持16TB); 从设计目标来看,ZGC适用于大内存低延迟服务的内存管理和回收。本文主要介绍 ZGC在低延时场景中的应用和卓越表现,文章内容主要分为四部分: 【1】GC之痛:介绍实际业务中遇到的 GC痛点,并分析 CMS收集器和

程序猿进阶 2242

2-1-9、ZGC详解

停顿时间不超过10ms(JDK16已经达到不超过1ms)停顿时间不会随着堆的大小,或者活跃对象的大小而增加支持8MB~4TB级别的堆,JDK15后已经可以支持16TB如果使用ZGC来做Java项目,像对STW敏感的证券系统,游戏的系统都可以去用Java来做(以前都是C或者C++的市场),所以ZGC的出现就是为了抢占其他语言的市场(卷!)

技术,就是不断的深入~ 1779

ZGC原理整理

ZGC原理整理

luck_lsj的博客 1847

一文带你彻底弄懂ZGC

这是一种内存优化技术,通过减小对象引用的大小来减少内存占用和提高性能。在启用压缩指针的情况下,对象引用不再直接存储对象的实际内存地址,而是存储一个相对于某个基地址的偏移量。这允许使用更小的数据类型来存储引用,从而减小其大小。加载屏障是在读取对象引用时自动添加的。在ZGC中,每次应用线程尝试通过染色指针访问对象时,加载屏障都会介入。加载屏障的目的是确保即使在垃圾收集过程中对象被移动,应用线程也能够无缝地访问对象。

yxg520s的博客 1345

【Java虚拟机】简单易懂的ZGC原理分析

然后进入到下一轮垃圾收集时,就会使用M1标志位去标记存活的对象,那么在本轮垃圾收集中存活的对象的M1标志位就会被置为1,那么M1标志位没有被置为1的,就可以认为是垃圾对象,可以被清理,这里就包括了上一轮中存活的M0标志位被置为1的对象。有好处,自然也是有代价的。可以看到,有了染色指针和转发表,ZGC就可以在标记结束之后,就马上进行存活对象的转移了,并且用户线程是不需要停顿的,不需要停止用户线程等待存活对象转移完毕并且修正指针指向的值,也就没有了这部分STW的时间消耗,性能就大大提升了。

weixin_43889578的博客 2584

六、ZGC深度剖析

停顿时间不超过10ms(JDK16已经达到不超过1ms)停顿时间不会随着堆的大小,或者活跃对象的大小而增加;也就是说,几十G堆的停顿时间是10ms以下,几百G甚至上T堆的停顿时间也是10ms以下支持8MB~4TB级别的堆,JDK15后已经可以支持16TB最糟糕的情况下吞吐量会降低15%。这都不是事,停顿时间足够优秀。至于吞吐量,通过扩容分分钟解决。

空杯 1671

一文带你了解ZGC

ZGC、颜色指针、对象重定位、ZGC垃圾回收流程、ZGC何时触发垃圾回收、ZGC参数设置、ZGC调优案例

weixin_44335140的博客 2557
上一篇: 【高级架构师私藏技巧】:Dubbo权重配置如何实现灰度发布?
下一篇: Java 19虚拟线程栈限制揭秘:百万级并发下的内存管理生死线
simcode
博客等级 码龄14年 154粉丝 2026原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值