news 2026/9/24 6:08:18

贝壳一面:年轻代回收频率太高,如何定位?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
贝壳一面:年轻代回收频率太高,如何定位?

JVM年轻代(Young Generation)回收频率过高可能导致应用性能下降、GC 开销过大,进而影响系统吞吐量。

要找出导致高频 GC 的具体原因,一般需要按照以下步骤进行分析和优化。

现象分析

年轻代 GC 过于频繁的常见表现:

  • 应用吞吐量下降,CPU 使用率升高
  • Full GC 次数增加,可能因为晋升失败
  • Young GC 频繁触发,应用线程被频繁打断

监控 JVM GC 情况

通过 JVM 选项打开 GC 日志

可以通过GC 日志观察 GC 频率:

ruby

体验AI代码助手

代码解读

复制代码

# JDK 8 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log ​ # JDK 9+ -Xlog:gc*:file=gc.log:time,uptime,level,tags

然后执行:

bash

体验AI代码助手

代码解读

复制代码

tail -f gc.log

示例 GC 日志:

scss

体验AI代码助手

代码解读

复制代码

[GC (Allocation Failure) [PSYoungGen: 256M->64M(512M)] 512M->320M(1024M), 0.015s]

  • PSYoungGen: 256M->64M(512M)→ 年轻代 GC,清理后剩 64M
  • 0.015s→ GC 耗时 15ms
  • Allocation Failure→ 由于分配失败触发 GC

如果PSYoungGen频繁触发,则表示年轻代回收频率过高!

通过jstat监控 GC

使用jstat观察年轻代的分配速率 & GC 频率

xml

体验AI代码助手

代码解读

复制代码

jstat -gc <pid> 1000

示例输出:

yaml

体验AI代码助手

代码解读

复制代码

S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 512.0 512.0 0.0 256.0 4096.0 1024.0 8192.0 4096.0 1024.0 512.0 512.0 256.0 14567 512.32 123 32.89 545.21

YGC(Young GC 次数):短时间内增长过快 → 年轻代 GC 频率高

EU(Eden Usage):年轻代 Eden 区域使用情况

OC(Old Capacity)OU(Old Usage)

  • 如果OU持续上升,可能意味着对象在新生代存活时间过长,导致晋升到老年代(可能触发 Full GC)

使用VisualVM监控 GC

  1. 启动VisualVM
  2. 连接 Java 进程
  3. 选择监视(Monitor)-> GC 统计
  4. 观察Eden&Survivor区的变化

如果 Eden 区持续增长,并且 YGC 次数飙升,则说明年轻代 GC 过于频繁。

定位问题代码

使用jmap分析对象占用

bash

体验AI代码助手

代码解读

复制代码

jmap -histo:live <pid> | head -20

示例输出:

yaml

体验AI代码助手

代码解读

复制代码

#num #instances #bytes class name ---------------------------------------------- 1: 150000 9600000 [C 2: 50000 4800000 java.lang.String 3: 40000 3200000 java.util.HashMap$Node 4: 30000 2800000 java.lang.Integer ...

如果StringHashMap$Node短生命周期对象占比过高,可能是过多短暂对象触发年轻代 GC。

采样分析短生命周期对象

使用jprofilerAsync-Profiler进行对象分配分析:

bash

体验AI代码助手

代码解读

复制代码

# 运行 Async-Profiler 采样 30 秒 ./profiler.sh -d 30 -f heap.svg <pid>

找到 GC 频繁回收的热点代码,如ListMap频繁创建后立即释放。

解决方案

调整 Eden 区大小

如果 Eden 空间过小,会导致对象分配失败后触发 GC

可以适当增大:

ini

体验AI代码助手

代码解读

复制代码

-XX:NewRatio=2 # 年轻代占堆内存的 1/3 -XX:SurvivorRatio=6 # Eden : Survivor = 6:1

减少 GC 触发频率,提高对象存活率。

预分配对象,减少短命对象

短生命周期对象会快速进入 Eden,导致频繁 GC:

ini

体验AI代码助手

代码解读

复制代码

// 优化前(大量创建临时对象) for (int i = 0; i < 10000; i++) { String s = new String("hello"); // 每次都会创建新的 String }

优化后,使用 String Pool 或对象重用

ini

体验AI代码助手

代码解读

复制代码

for (int i = 0; i < 10000; i++) { String s = "hello"; // 直接引用字符串常量池 }

使用对象池(Object Pool)

如果高频创建对象,如ThreadConnection,可以使用对象池

ini

体验AI代码助手

代码解读

复制代码

// 使用线程池代替频繁创建线程 ExecutorService executor = Executors.newFixedThreadPool(10);

避免频繁创建销毁对象,降低 GC 压力。

避免SoftReference/WeakReference过多

如果SoftReferenceWeakReference太多,可能导致频繁 GC 回收:

csharp

体验AI代码助手

代码解读

复制代码

SoftReference<byte[]> ref = new SoftReference<>(new byte[1024 * 1024]);

尽量避免短时间大量创建SoftReference,避免触发 GC。

降低 Survivor 区溢出

当 Survivor 区过小,新生代对象过快晋升到老年代,可能会导致Full GC 过多

ini

体验AI代码助手

代码解读

复制代码

-XX:SurvivorRatio=8 # Eden:Survivor = 8:1

让对象在 Survivor 区存活更久,减少老年代晋升压力。

总结

优化方向方案
监控 GC 频率-XX:+PrintGCDetails/jstat -gc <pid>
分析对象分配jmap -histo/Async-Profiler
调整 Eden 大小-XX:NewRatio=2
减少临时对象使用对象池、缓存,避免new String()
减少 Survivor 溢出-XX:SurvivorRatio=8,减少对象晋升老年代
优化SoftReference避免过多软引用

作者:程序员飞鱼
链接:https://juejin.cn/post/7546906716850290727
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/21 18:18:34

Java 小白面试记:从Spring Boot到大数据处理

文章内容 场景&#xff1a; 在一家知名的互联网大厂&#xff0c;Java小白程序员超好吃正在接受面试。面试官以严肃的态度开始了提问。 第一轮提问&#xff1a;Web框架与微服务 面试官&#xff1a;请你谈谈在Spring Boot中如何实现一个简单的RESTful API&#xff1f; 超好吃&…

作者头像 李华
网站建设 2026/9/20 15:41:51

**手机写小说软件哪家靠谱2025推荐,适配不同创作场景的实

手机写小说软件哪家靠谱2025推荐&#xff0c;适配不同创作场景的实战指南在2025年&#xff0c;移动端创作已成为内容创作者的常态。据《2025中国网络文学发展报告》显示&#xff0c;超过68%的网文作者会使用手机进行碎片化创作或灵感记录&#xff0c;但其中52%的用户面临工具功…

作者头像 李华
网站建设 2026/9/23 15:08:22

Open-AutoGLM沉思模式打不开?20年经验专家教你7个关键步骤精准触发

第一章&#xff1a;Open-AutoGLM沉思模式的技术背景与核心价值在大模型驱动的智能系统演进中&#xff0c;传统推理模式面临响应僵化、逻辑链断裂等挑战。Open-AutoGLM沉思模式应运而生&#xff0c;旨在通过模拟人类“深思—验证—修正”的认知过程&#xff0c;提升模型在复杂任…

作者头像 李华
网站建设 2026/9/20 15:37:38

Open-AutoGLM能在家用电脑部署吗:5步完成本地化部署实测指南

第一章&#xff1a;Open-AutoGLM开源部署操作电脑可以吗Open-AutoGLM 是一个基于 AutoGLM 架构的开源项目&#xff0c;旨在为本地化大模型推理与微提供轻量化部署方案。得益于其模块化设计和对消费级硬件的优化&#xff0c;用户完全可以在普通个人电脑上完成项目的部署与运行。…

作者头像 李华
网站建设 2026/9/20 15:42:09

【Open-AutoGLM数据安全深度剖析】:揭秘AI大模型潜在风险与防护策略

第一章&#xff1a;Open-AutoGLM有没有数据安全问题数据本地化与传输加密机制 Open-AutoGLM 作为开源的自动化代码生成模型&#xff0c;其核心优势之一是支持本地部署。用户可在私有环境中运行模型&#xff0c;避免敏感代码上传至第三方服务器。所有输入输出数据均保留在本地&a…

作者头像 李华
网站建设 2026/9/20 15:50:23

TPAMI‘25 | 首个多轮、开放视角视频问答基准,系统分类9大幻觉任务

基准WildVideo针对多模态模型在视频问答中的「幻觉」问题&#xff0c;首次系统定义了9类幻觉任务&#xff0c;构建了涵盖双重视角、支持中英双语的大规模高质量视频对话数据集&#xff0c;采用多轮开放问答形式&#xff0c;贴近真实交互场景&#xff0c;全面评估模型能力。近年…

作者头像 李华