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

做网站公司如何选百度广告联盟推广链接

做网站公司如何选,百度广告联盟推广链接,山西网站建设推荐咨询,ios网站开发教程目录 一、问题描述 (一)GC 频率与影响 1. GC 频率统计 2. GC 对请求延迟的影响 2.1 Minor GC 影响的请求数 2.2 Major GC 影响的请求数 3. TP90/TP99 的影响 (二)主要问题 1. Minor GC 过于频繁 2. Major GC 触发频率偏…

目录

一、问题描述

(一)GC 频率与影响

1. GC 频率统计

2. GC 对请求延迟的影响

2.1 Minor GC 影响的请求数

2.2 Major GC 影响的请求数

3. TP90/TP99 的影响

(二)主要问题

1. Minor GC 过于频繁

2. Major GC 触发频率偏高

二、分析 GC 机制

(一)Java 内存回收机制概述

(二) 新生代 GC 过程

(三) 复制算法的优势

(四)相关 JVM 关键参数

1. 新生代大小

2. Survivor 区比例

3. 对象晋升阈值

三、GC 日志分析

(一)关键日志信息解析

1. 对象 晋升阈值过低

 2. 老年代占用过高

(二)结论断定

 1. 对象晋升过早

2. Survivor 区利用率偏低

3. 老年代积累速度过快

(三)优化方向定论

 1. 延长 Survivor 存活时间

2. 增大  Survivor 区

 3.监控老年代增长情况

4. 这样修改后的价值

四、优化结果分析

(一)优化前后对比图

(二)直接效果说明优化收益

1. GC 频率和耗时改进

2. Major GC 影响

五、总结


干货分享,感谢您的阅读!

在高并发、低延迟的 Java 系统中,GC(垃圾回收)性能优化往往是提升应用响应速度和稳定性的关键因素之一。本篇文章基于实际案例,深入分析 GC 触发频率、对系统吞吐的影响,并通过 JVM 日志解析发现核心问题,如 Minor GC 过于频繁、对象过早晋升导致 Major GC 触发增多等。最终,我们通过参数优化有效降低 GC 影响,使系统吞吐量和可用性得到显著提升。本文不仅提供了详尽的数据分析,还给出了可操作的优化方案,为 Java 开发者在 GC 调优中提供实战参考。

历史主要基本文章回顾:

涉猎内容具体链接
Java GC 基础知识快速回顾Java GC 基础知识快速回顾-CSDN博客
垃圾回收基本知识内容Java回收垃圾的基本过程与常用算法_java垃圾回收过程-CSDN博客
CMS调优和案例分析CMS垃圾回收器介绍与优化分析案列整理总结_cms 对老年代的回收做了哪些优化设计-CSDN博客
G1调优分析Java Hotspot G1 GC的理解总结_java g1-CSDN博客
ZGC基础和调优案例分析垃圾回收器ZGC应用分析总结-CSDN博客

从ES的JVM配置起步思考JVM常见参数优化

从ES的JVM配置起步思考JVM常见参数优化_es jvm配置-CSDN博客

深入剖析GC问题:如何有效判断与排查

深入剖析GC问题:如何有效判断与排查_排查java堆中大对象触发gc-CSDN博客

动态扩缩容引发的JVM堆内存震荡调优指南

动态扩缩容引发的JVM堆内存震荡:从原理到实践的GC调优指南

显式 GC 的使用:留与去,如何选择?

显式 GC 的使用:留与去,如何选择?

堆外内存 OOM:现象分析与优化方案

堆外内存 OOM:现象分析与优化方案

过早晋升的识别与优化实战

Java垃圾回收的隐性杀手:过早晋升的识别与优化实战

如何选取合适的 NewRatio 值

如何选取合适的 NewRatio 值来优化 JVM 的垃圾回收策略

解决 CMS Old GC 频繁触发

解决 CMS Old GC 频繁触发优化 Java 性能的技术方案

避免 CMS GC退化操作

分析CMS GC退化为单线程串行GC模式的原因与优化

解决单次 CMS Old GC 耗时长问题

单次 CMS Old GC 耗时长问题分析与优化

高效解决MetaSpace OOM 问题

深入剖析 MetaSpace OOM 问题:根因分析与高效解决策略
高频面试题汇总JVM高频基本面试问题整理_jvm面试题-CSDN博客

一、问题描述

(一)GC 频率与影响

1. GC 频率统计

在某高并发低延迟服务中,发现垃圾回收(GC)的触发频率如下:

  • Minor GC:每分钟 100 次(平均每 600ms 触发 1 次)。
  • Major GC:每 4 分钟 触发 1 次(即 240,000ms 触发 1 次)。

2. GC 对请求延迟的影响

系统接口的 平均响应时间50ms,但 GC 期间会额外增加延迟:

  • 单次 Minor GC 耗时25ms
  • 单次 Major GC 耗时200ms

我们接着分析,以 1 分钟为一个基本的量度来计算Minor GC 和 Major GC 影响的请求数

2.1 Minor GC 影响的请求数
  • Minor GC 发生 100 次,每次 GC 持续 25ms。
  • 在 1 分钟(60,000ms)内,GC 持续的总时间为: 100 \times 25 ms = 2500 ms
  • 受影响的请求比例(假设请求均匀分布): 

  • 但由于每次 GC 发生时的时间窗口影响,可能造成 请求堆积,实际影响可能更大。
2.2 Major GC 影响的请求数
  • Major GC 每 4 分钟触发 1 次,持续 200ms。
  • 在 4 分钟内,总处理时间 240,000ms,但 Major GC 占用 200ms

  • 虽然 Major GC 发生频率低,但单次暂停时间长,对高并发系统影响明显。

3. TP90/TP99 的影响

假设 正常情况下,TP99 响应时间约为 100ms(99% 的请求在 100ms 内完成)。GC 影响后

  • 每 100 次 Minor GC,可能导致 TP99 增长至: 100ms + 25ms = 125ms
  • 每次 Major GC 影响更大,但由于发生频率低,TP99 主要受 Minor GC 影响。

(二)主要问题

1. Minor GC 过于频繁

 GC 频率与影响 的分析可以看出,Minor GC 每 600ms 发生一次,对系统造成了 4.17% 的额外负载,并显著增加了 TP90/TP99 响应时间。
其根本原因在于:

  • 新生代(Young Generation)空间较小,导致对象在 Eden 区域很快填满,频繁触发 Minor GC。
  • 对象晋升老年代(Old Generation)过快:通过 GC 日志分析,对象晋升年龄为 2,意味着对象只需要经历 2 次 Minor GC 就会晋升到老年代。这导致老年代空间迅速增长,从而间接增加了 Major GC 的触发频率

2. Major GC 触发频率偏高

虽然 Major GC 发生频率相对较低(每 4 分钟一次),但由于:

  • 晋升到老年代的对象过多,导致老年代空间增长过快;
  • Major GC 触发时暂停时间较长(200ms),影响了系统的高可用性;
  • 老年代回收效率不佳,GC 之后仍有 300M+ 内存被占用,表明老年代对象回收率较低;

这些问题表明,Major GC 频率可能会随着系统负载上升进一步恶化,需要优化老年代的增长速率,减少 Major GC 触发。

初步思考优化重点:减少 Minor GC 触发频率,避免 老年代增长过快导致 Major GC 触发

二、分析 GC 机制

(一)Java 内存回收机制概述

Java 采用 分代回收策略(Generational Garbage Collection),将堆内存分为:

  • 新生代(Young Generation):主要存放短生命周期对象,使用 复制算法(Copying GC)。
  • 老年代(Old Generation):存放长生命周期对象,使用 标记-清除(Mark-Sweep)或标记-整理(Mark-Compact)算法
  • 永久代/元空间(Metaspace):存放类的元信息(JDK 8 之后为元空间)。

其中,新生代又划分为:

  • Eden 区:新创建的对象大部分分配在这里。
  • Survivor 0(S0)、Survivor 1(S1):用于 GC 过程中对象复制与存活管理

(二) 新生代 GC 过程

根据提供的示意图:

新生代 GC(Minor GC)过程如下:

  • T1: 扫描新生代,判断存活对象 --- GC 线程扫描 Eden 和 Survivor 区,标记存活对象。当 Eden 区空间不足时,触发 Minor GC
  • T2: 复制存活对象至 Survivor 区 --- 存活对象会被复制到 S0 或 S1(图中从 Eden 复制到 S0)。经过多次 GC 仍然存活的对象,会在 年龄阈值(如 15)达到时 晋升至 老年代
  • Eden 清空,等待新对象分配。
  • Survivor 之间交换(复制算法)--- 下次 GC 时,S0 存活对象复制到 S1,然后 S0 清空。这种 S0 ⇄ S1 交换 机制,减少了碎片化,提高效率。

(三) 复制算法的优势

  • 避免内存碎片化:对象始终在 Survivor 之间复制,不会产生大量空洞。
  • 提升回收效率:GC 只需要扫描 存活对象,不会遍历整个堆空间。
  • 适用于短生命周期对象:绝大部分对象会在 1~2 次 GC 内被回收,减少老年代压力。

(四)相关 JVM 关键参数

1. 新生代大小

-Xmn512m

设定 新生代大小 为 512MB,可调节 Eden/S0/S1 的比例。

2. Survivor 区比例

-XX:SurvivorRatio=8

默认 Eden:S0:S1 = 8:1:1,可调整比例优化回收。

3. 对象晋升阈值

-XX:MaxTenuringThreshold=15

对象在 Survivor 存活 15 次 GC 后晋升老年代,可避免过早晋升。

三、GC 日志分析

(一)关键日志信息解析

从上图中,我们可以观察到以下几个重要数据点:

1. 对象 晋升阈值过低

Desired survivor size 32210934 bytes, new threshold 2 (max 15)

  • new threshold 2 表示对象在 Survivor 区存活 2 次 GC 后 即晋升到老年代,而最大值 max 15 说明可以调整到 15 次。
  • 这意味着许多 生命周期短的对象 可能 过早晋升 到老年代,导致老年代压力增大。

 2. 老年代占用过高

concurrent mark-sweep generation total 2516608K, used 352573K

  • 老年代总大小为 2516M,当前已使用 352M,相较于前面 152M 的使用量有所增加。
  • 说明GC 后仍有大量对象存活,可能包含短生命周期但未能及时回收的对象

 3. 存活对象年龄分布

age 1: 21460488 bytes, 41% of total age 2: 41898080 bytes, 80% of total

  • 年龄 1(第一次 GC 存活)对象占 41%,而 年龄 2(第二次 GC 存活)对象激增到 80%,说明很多对象在 第二次 GC 后就被晋升到老年代
  • 这进一步印证了 new threshold=2 可能导致对象过早晋升,而这些对象可能仍是短生命周期的临时数据。

(二)结论断定

从日志数据分析,当前 GC 行为存在以下问题:

 1. 对象晋升过早

  • new threshold=2 使对象在 Survivor 区存活 仅 2 次 GC 就晋升,但 max=15 说明可以存活更久。
  • 这导致老年代负担增加,可能会提前触发 Full GC

2. Survivor 区利用率偏低

  • Desired survivor size 32MB,但对象在 age 2 时就晋升,说明 Survivor 没有被充分利用。
  • 适当增加 Survivor 区大小、延长对象存活时间,可以减少无效晋升

3. 老年代积累速度过快

  • GC 后老年代仍然存活 352MB,相较于前面的 152MB 增长较快,说明晋升对象可能是短生命周期的。
  • 这可能导致频繁 CMS GC 或 Full GC,影响应用性能。 

(三)优化方向定论

基于日志分析,优化方向应包括:

 1. 延长 Survivor 存活时间

调整 -XX:MaxTenuringThreshold=5~10,让对象在 Survivor 区存活更久,减少过早晋升。

-XX:MaxTenuringThreshold=10

2. 增大  Survivor 区

-XX:SurvivorRatio=6

 调整 -XX:SurvivorRatio=6~8,让 Survivor 能存放更多对象,避免过快晋升。 

 3.监控老年代增长情况

 通过 jstat -gcutil 观察 GC 频率,并结合 jmap -histo 检查老年代对象的类型,确认是否有短生命周期对象不应被晋升。3.

4. 这样修改后的价值

  •  更加精准的数据支撑:直接从日志中提取 Survivor 存活比例晋升年龄老年代占用 等关键信息,使优化方向更具针对性。
  • 优化建议更具可操作性:结合 -XX:MaxTenuringThreshold-XX:SurvivorRatio 参数,提供具体的优化调整方案。
  • 增强分析逻辑:通过 Survivor 对象分布,直接解释为何老年代增长过快,避免泛泛而谈 GC 频率问题。 

四、优化结果分析

(一)优化前后对比图

 调整前:

调整后:

(二)直接效果说明优化收益

1. GC 频率和耗时改进

  • Minor GC 频率下降 62.5%(优化前 80 次/min,优化后 30 次/min)。
  • 单次 Minor GC 耗时增加 < 1s,但仍在可接受范围内(优化前 2 s,优化后 900 ms)。

2. Major GC 影响

  • Full GC 触发频率下降,老年代压力减少。
  • TP90/TP99 响应时间改善 10ms+,减少因 GC 造成的停顿时间。

五、总结

本文深入分析了 Java GC 频率对系统性能的影响,并通过 JVM 日志找出了关键问题点:

  1. Minor GC 频繁:由于 Eden 区较小,导致 GC 触发频率高,影响系统吞吐量。
  2. 对象过早晋升:Survivor 区未能充分利用,使短生命周期对象进入老年代,增加 Major GC 触发概率。
  3. 老年代增长过快:GC 后仍有大量未回收对象,导致 Full GC 频率上升,影响响应时间。

针对以上问题,我们采用了 增大 Survivor 区、延长对象晋升阈值、优化内存参数 等策略,最终实现了:

  • Minor GC 频率下降 62.5%,减少了 GC 造成的停顿;
  • Major GC 频率降低,TP90/TP99 响应时间优化 10ms+,提升了系统吞吐量;
  • 老年代压力减少,Full GC 触发率显著下降,提高了系统可用性。

本次优化验证了 GC 调优在高并发环境下的重要性,并为后续的 JVM 性能优化提供了参考方向。在未来,我们还可以结合 GC 日志自动分析、内存快照监控、业务数据分层优化 等方式,进一步提升 GC 效率,为 Java 系统稳定性保驾护航。

http://www.dtcms.com/a/580978.html

相关文章:

  • BIM+GIS协同:RVT文件转3DTiles的技术路径与场景落地
  • 中颖AFE芯片:SH367303、SH367306 和 SH367309
  • 数据结构—排序算法篇三
  • 从“医疗大模型”向“医疗智能体”架构与路径分析(白皮书草案-上)
  • LeetCode算法日记 - Day 95: 回文子串
  • DockerCompose与多容器编排
  • AngularJS与SQL的集成使用指南
  • 【ZeroRange WebRTC】TWCC 在 WebRTC 中的角色与工作原理(深入指南)
  • 数据结构常见的八大排序算法
  • 个人怎么做网站app推广引流方法
  • 初识光伏逆变器
  • 一文了解LLM应用架构:从Prompt到Multi-Agent
  • MongoDB 内存管理避坑指南:解决高占用、页错误等核心问题,让数据库性能翻倍
  • 关于DNS中毒攻击的解决方案分享
  • 【C++】数据挖掘算法在软件测试中的应用
  • WebSocket 完全指南:从原理到实战,搭建实时通信桥梁
  • STM32项目分享:智能水产养殖系统
  • 网站开发线框个体营业执照网上年报
  • iPhone苹果手机拍的照片默认是heic如何换成jpg格式
  • 基于微信小程序的旅游攻略分享互动平台设计与实现-项目分享
  • Neo4j Windows桌面版安装及更改默认数据存储位置
  • 智能安防新篇章:EasyGBS助力重塑物业视频管理服务
  • ps2017做网站当阳网站建设电话
  • H5短视频SDK,赋能Web端视频创作革命
  • 如何选择温州本凡科技进行小程序开发服务?
  • 融智兴科技邀您共赴2025中国洗涤展
  • STM32上使用HAL库完美实现驱动MAX98357声卡模块(I2S+DMA+音频环形缓冲区)
  • 【React】打卡笔记,入门学习03:useState、useEffect、useRef、useMemo
  • M|烟花 (1995)
  • 平顶山网站建设2022年黄台片区