文章目录
- [JVM调优 系统性知识体系](#JVM调优 系统性知识体系)
-
- 一、JVM调优基础概述
-
- [1.1 调优核心目标](#1.1 调优核心目标)
- [1.2 调优时机与原则](#1.2 调优时机与原则)
- 二、常用JVM参数分类详解
-
- [2.1 内存配置参数(最基础)](#2.1 内存配置参数(最基础))
- [2.2 GC收集器选择参数](#2.2 GC收集器选择参数)
- [2.3 GC调优参数](#2.3 GC调优参数)
- [2.4 OOM与故障排查参数](#2.4 OOM与故障排查参数)
- 三、JVM调优核心指标体系
-
- [3.1 内存指标](#3.1 内存指标)
- [3.2 GC指标](#3.2 GC指标)
- [3.3 系统指标](#3.3 系统指标)
- 四、OOM问题排查方法论与实战
-
- [4.1 OOM常见类型与原因](#4.1 OOM常见类型与原因)
- [4.2 OOM排查标准流程](#4.2 OOM排查标准流程)
- [4.3 常用OOM排查工具](#4.3 常用OOM排查工具)
- [4.4 内存泄漏常见场景](#4.4 内存泄漏常见场景)
- 五、GC日志分析完整指南
-
- [5.1 GC日志格式解析(G1 GC)](#5.1 GC日志格式解析(G1 GC))
- [5.2 Full GC日志示例(G1 GC)](#5.2 Full GC日志示例(G1 GC))
- [5.3 GC日志分析工具](#5.3 GC日志分析工具)
- [5.4 GC日志常见异常模式](#5.4 GC日志常见异常模式)
- 六、Arthas工具核心功能与实战技巧
-
- [6.1 Arthas简介与安装](#6.1 Arthas简介与安装)
- [6.2 核心命令分类详解](#6.2 核心命令分类详解)
- [6.3 常用实战场景](#6.3 常用实战场景)
- [6.4 Arthas高级技巧](#6.4 Arthas高级技巧)
- 七、JVM调优最佳实践与常见误区
-
- [7.1 通用调优最佳实践](#7.1 通用调优最佳实践)
- [7.2 常见调优误区](#7.2 常见调优误区)
- [7.3 不同业务场景调优策略](#7.3 不同业务场景调优策略)
- JVM调优面试核心考点问答卡片

JVM调优 系统性知识体系
一、JVM调优基础概述
1.1 调优核心目标
- 延迟优先:降低GC停顿时间(STW),提升系统响应速度(如互联网应用、实时系统)
- 吞吐量优先:提高CPU有效利用率,减少GC总耗时(如大数据处理、批处理系统)
- 内存占用优化:控制JVM堆内存大小,避免资源浪费(如容器化部署、微服务)
- 稳定性保障:防止OOM、频繁Full GC、系统崩溃等问题
1.2 调优时机与原则
必须调优的场景:
- 系统出现OOM异常或频繁Full GC
- GC停顿时间过长(超过业务容忍阈值,如>500ms)
- 系统吞吐量明显下降
- 容器环境中内存资源受限
核心原则:
- 先排查业务代码问题,再考虑JVM调优(80%的性能问题源于代码)
- 调优是迭代过程,每次只修改一个参数
- 必须在生产环境相同配置下进行压测验证
- 避免过度调优,追求"够用即可"
二、常用JVM参数分类详解
2.1 内存配置参数(最基础)
| 参数 | 含义 | 推荐值 | 说明 |
|---|---|---|---|
-Xms |
初始堆内存大小 | 与-Xmx相同 | 避免堆内存动态扩展带来的性能损耗 |
-Xmx |
最大堆内存大小 | 物理内存的1/4~1/2 | 容器环境建议设置为容器内存限制的70%~80% |
-Xmn |
新生代大小 | 堆内存的1/3~1/2 | G1收集器不建议显式设置 |
-XX:NewRatio |
老年代与新生代比例 | 2(老年代:新生代=2:1) | 响应快的应用可设为1,让新生代更大 |
-XX:SurvivorRatio |
Eden区与Survivor区比例 | 8(Eden:S0:S1=8:1:1) | |
-XX:MetaspaceSize |
元空间初始大小 | 256M | Java 8+替代永久代 |
-XX:MaxMetaspaceSize |
元空间最大大小 | 512M | 默认无限制,防止内存泄漏 |
-Xss |
每个线程栈大小 | 1M | 递归深度大的应用可适当增大 |
2.2 GC收集器选择参数
JDK 8默认 :Parallel GC(吞吐量优先)
JDK 9+默认:G1 GC(兼顾吞吐量与延迟)
| 收集器 | 启用参数 | 适用场景 |
|---|---|---|
| Serial GC | -XX:+UseSerialGC |
单核CPU、客户端应用 |
| Parallel GC | -XX:+UseParallelGC |
多核CPU、批处理、大数据 |
| CMS GC | -XX:+UseConcMarkSweepGC |
低延迟要求的互联网应用(JDK 9已废弃) |
| G1 GC | -XX:+UseG1GC |
大堆内存(>4G)、低延迟要求 |
| ZGC | -XX:+UseZGC |
超大堆内存(>16G)、亚毫秒级停顿(JDK 11+) |
| Shenandoah GC | -XX:+UseShenandoahGC |
低延迟、与应用线程并发执行(OpenJDK) |
2.3 GC调优参数
通用GC参数:
-XX:+PrintGCDetails:打印详细GC日志-XX:+PrintGCDateStamps:打印GC发生的时间戳-Xloggc:gc.log:将GC日志输出到文件-XX:+UseGCLogFileRotation:启用GC日志滚动-XX:NumberOfGCLogFiles=5:保留5个GC日志文件-XX:GCLogFileSize=100M:每个GC日志文件大小100M
G1 GC专用参数:
-XX:MaxGCPauseMillis=200:目标最大GC停顿时间(默认200ms)-XX:G1HeapRegionSize=16M:每个Region大小(1M~32M,必须是2的幂)-XX:InitiatingHeapOccupancyPercent=45:堆占用率达到45%时启动并发标记-XX:G1NewSizePercent=5:新生代最小占比(默认5%)-XX:G1MaxNewSizePercent=60:新生代最大占比(默认60%)
2.4 OOM与故障排查参数
-XX:+HeapDumpOnOutOfMemoryError:OOM时自动生成堆转储文件-XX:HeapDumpPath=/tmp/heapdump.hprof:堆转储文件路径-XX:+CrashOnOutOfMemoryError:OOM时直接崩溃JVM(便于快速重启)-XX:ErrorFile=/tmp/hs_err_pid%p.log:JVM崩溃日志路径
三、JVM调优核心指标体系
3.1 内存指标
| 指标 | 含义 | 正常范围 | 异常表现 |
|---|---|---|---|
| 堆内存使用率 | 已用堆内存/最大堆内存 | <70% | 持续>80%且无法下降,可能存在内存泄漏 |
| 元空间使用率 | 已用元空间/最大元空间 | <80% | 持续增长可能是类加载泄漏 |
| 新生代晋升速率 | 每秒从新生代晋升到老年代的对象大小 | 视业务而定 | 过高会导致老年代快速填满,频繁Full GC |
| 大对象数量 | 超过Region大小一半的对象 | 越少越好 | 大量大对象会直接进入老年代,触发Full GC |
3.2 GC指标
| 指标 | 含义 | 正常范围(G1 GC) | 异常表现 |
|---|---|---|---|
| Young GC频率 | 每秒Young GC次数 | <1次/秒 | >5次/秒说明新生代过小或对象创建过快 |
| Young GC平均停顿时间 | 每次Young GC的平均耗时 | <50ms | >100ms会影响用户体验 |
| Full GC频率 | 每小时Full GC次数 | <1次/小时 | >1次/10分钟说明老年代不足或存在内存泄漏 |
| Full GC平均停顿时间 | 每次Full GC的平均耗时 | <1秒 | >5秒会导致系统严重卡顿 |
| GC总耗时占比 | GC总时间/系统运行时间 | <5% | >10%说明GC开销过大,需要调优 |
3.3 系统指标
- CPU使用率:正常<70%,GC时会短暂升高
- 系统负载:与CPU核心数相当(如8核CPU负载<8)
- 磁盘IO:GC日志和堆转储文件写入会产生IO
- 网络IO:与业务相关,间接影响JVM性能
四、OOM问题排查方法论与实战
4.1 OOM常见类型与原因
| OOM类型 | 错误信息 | 常见原因 |
|---|---|---|
| 堆内存溢出 | java.lang.OutOfMemoryError: Java heap space |
堆内存过小、内存泄漏、大对象过多 |
| 元空间溢出 | java.lang.OutOfMemoryError: Metaspace |
动态生成类过多、反射过度使用、类加载器泄漏 |
| 栈内存溢出 | java.lang.StackOverflowError |
递归深度过大、方法调用链过长 |
| 直接内存溢出 | java.lang.OutOfMemoryError: Direct buffer memory |
NIO使用不当、Netty堆外内存泄漏 |
| 线程数过多 | java.lang.OutOfMemoryError: unable to create native thread |
创建线程过多、操作系统线程数限制 |
4.2 OOM排查标准流程
- 保留现场 :确保开启了
-XX:+HeapDumpOnOutOfMemoryError参数 - 获取堆转储文件 :从
HeapDumpPath指定路径获取.hprof文件 - 分析堆转储文件:使用MAT、JProfiler、VisualVM等工具
- 定位泄漏点:找出占用内存最多的对象及其引用链
- 修复代码问题:解决内存泄漏、优化对象创建逻辑
- 验证修复效果:进行压测,确认OOM不再发生
4.3 常用OOM排查工具
- MAT(Memory Analyzer Tool):Eclipse出品,功能强大,支持大堆转储文件分析
- JProfiler:商业工具,界面友好,支持实时监控和离线分析
- VisualVM:JDK自带,免费,适合简单分析
- jhat:JDK自带,命令行工具,已过时,不推荐使用
4.4 内存泄漏常见场景
- 静态集合类引用大量对象(如
static List) - 监听器和回调未及时注销
- 数据库连接、IO流未关闭
- 缓存使用不当(如无限期缓存)
- 内部类持有外部类引用
- ThreadLocal使用不当导致内存泄漏
五、GC日志分析完整指南
5.1 GC日志格式解析(G1 GC)
Young GC日志示例:
2026-05-30T10:00:00.123+0800: 123.456: [GC pause (G1 Evacuation Pause) (young), 0.0234567 secs]
[Parallel Time: 20.1 ms, GC Workers: 8]
[GC Worker Start (ms): Min: 123456.1, Avg: 123456.2, Max: 123456.3, Diff: 0.2]
[Ext Root Scanning (ms): Min: 1.2, Avg: 1.3, Max: 1.4, Diff: 0.2, Sum: 10.4]
[Update RS (ms): Min: 0.5, Avg: 0.6, Max: 0.7, Diff: 0.2, Sum: 4.8]
[Scan RS (ms): Min: 0.3, Avg: 0.4, Max: 0.5, Diff: 0.2, Sum: 3.2]
[Code Root Scanning (ms): Min: 0.1, Avg: 0.1, Max: 0.2, Diff: 0.1, Sum: 0.8]
[Object Copy (ms): Min: 17.0, Avg: 17.2, Max: 17.4, Diff: 0.4, Sum: 137.6]
[Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[GC Worker Other (ms): Min: 0.1, Avg: 0.1, Max: 0.1, Diff: 0.0, Sum: 0.8]
[GC Worker Total (ms): Min: 19.9, Avg: 20.0, Max: 20.1, Diff: 0.2, Sum: 160.0]
[GC Worker End (ms): Min: 123476.1, Avg: 123476.2, Max: 123476.3, Diff: 0.2]
[Code Root Fixup: 0.1 ms]
[Code Root Purge: 0.0 ms]
[Clear CT: 0.1 ms]
[Other: 3.1 ms]
[Choose CSet: 0.0 ms]
[Ref Proc: 2.8 ms]
[Ref Enq: 0.1 ms]
[Redirty Cards: 0.1 ms]
[Humongous Register: 0.0 ms]
[Humongous Reclaim: 0.0 ms]
[Free CSet: 0.0 ms]
[Eden: 1024.0M(1024.0M)->0.0B(1024.0M) Survivors: 128.0M->128.0M Heap: 1536.0M(2048.0M)->512.0M(2048.0M)]
[Times: user=0.16 sys=0.01, real=0.02 secs]
关键信息解读:
- GC类型:G1 Evacuation Pause (young)(新生代回收)
- GC耗时:0.0234567秒(23.4567毫秒)
- 内存变化:Eden区从1024M变为0B,堆内存从1536M变为512M
- 用户态时间:0.16秒,内核态时间:0.01秒,实际时间:0.02秒
5.2 Full GC日志示例(G1 GC)
2026-05-30T10:05:00.123+0800: 423.456: [Full GC (Allocation Failure), 1.2345678 secs]
[Eden: 0.0B(1024.0M)->0.0B(1024.0M) Survivors: 0.0B->0.0B Heap: 2048.0M(2048.0M)->512.0M(2048.0M)]
[Metaspace: 256.0M->256.0M(1024.0M)]
[Times: user=8.0 sys=0.1, real=1.23 secs]
关键信息解读:
- Full GC原因:Allocation Failure(分配失败)
- Full GC耗时:1.2345678秒
- 堆内存变化:从2048M变为512M
- 元空间大小:256M,无变化
5.3 GC日志分析工具
- GCEasy:在线GC日志分析工具,生成可视化报告(推荐)
- GCViewer:开源桌面工具,支持多种GC日志格式
- HPjmeter:惠普出品,功能强大,支持大日志文件分析
- Arthas:支持在线查看GC情况和简单分析
5.4 GC日志常见异常模式
- 频繁Young GC:新生代过小、对象创建过快
- 频繁Full GC:老年代不足、内存泄漏、大对象过多
- GC停顿时间过长:堆内存过大、GC线程数不足、大对象过多
- GC耗时占比过高:GC参数配置不当、业务代码创建对象过多
六、Arthas工具核心功能与实战技巧
6.1 Arthas简介与安装
Arthas是Alibaba开源的Java诊断工具,无需重启JVM即可在线排查问题,支持JDK 6+,广泛应用于生产环境问题定位。
安装方式:
bash
# 下载Arthas
curl -O https://arthas.aliyun.com/arthas-boot.jar
# 启动Arthas
java -jar arthas-boot.jar
# 选择要诊断的Java进程
[1]: 12345 com.example.Application
6.2 核心命令分类详解
基础命令:
dashboard:查看JVM实时运行数据(线程、内存、GC)thread:查看线程堆栈信息jvm:查看JVM详细信息sysprop:查看系统属性sysenv:查看系统环境变量
内存与GC相关命令:
heapdump:生成堆转储文件(同jmap -dump)gc:手动触发GCmemory:查看内存使用情况classloader:查看类加载器信息
方法执行监控命令:
watch:监控方法执行情况(入参、返回值、异常)trace:跟踪方法内部调用路径和耗时stack:查看方法的调用堆栈tt:时间隧道,记录方法执行过程并可重放
类与字节码相关命令:
sc:搜索已加载的类sm:搜索类的方法jad:反编译类的源代码redefine:热替换类的字节码dump:dump已加载类的字节码到文件
6.3 常用实战场景
场景1:查看最耗时的线程
bash
# 查看所有线程,按CPU使用率排序
thread -n 5
# 查看指定线程的堆栈
thread 1234
场景2:监控方法执行耗时
bash
# 监控com.example.service.UserService的getUserById方法
watch com.example.service.UserService getUserById "{params, returnObj, throwExp, cost}" -n 10
场景3:跟踪方法调用路径
bash
# 跟踪com.example.service.UserService的getUserById方法的内部调用
trace com.example.service.UserService getUserById
场景4:排查方法调用异常
bash
# 查看com.example.service.UserService的getUserById方法的异常堆栈
watch com.example.service.UserService getUserById "{throwExp}" -e
场景5:热修复线上代码
bash
# 反编译类到文件
jad --source-only com.example.service.UserService > UserService.java
# 修改UserService.java文件
# 编译修改后的文件
mc UserService.java
# 热替换类
redefine -c 1234 com.example.service.UserService
6.4 Arthas高级技巧
- 使用
ognl表达式进行复杂的条件过滤和数据处理 - 使用
batch命令批量执行多个命令 - 使用
tee命令将命令输出保存到文件 - 使用
async命令异步执行耗时操作 - 使用
profiler命令生成火焰图(性能分析利器)
七、JVM调优最佳实践与常见误区
7.1 通用调优最佳实践
-
选择合适的GC收集器:
- 堆内存<4G:Parallel GC或G1 GC
- 堆内存4G~16G:G1 GC
- 堆内存>16G:ZGC或Shenandoah GC
-
合理设置堆内存大小:
- 初始堆内存与最大堆内存设置为相同值
- 老年代大小至少为新生代的1.5倍
- 容器环境预留20%~30%的内存给操作系统和其他进程
-
优化对象创建与销毁:
- 避免频繁创建短生命周期的大对象
- 使用对象池复用重量级对象
- 及时释放不再使用的对象引用
- 避免使用finalize方法
-
GC日志与监控:
- 生产环境必须开启GC日志
- 建立完善的JVM监控体系(Prometheus+Grafana)
- 设置合理的告警阈值
7.2 常见调优误区
- 盲目增大堆内存:堆内存过大会导致GC停顿时间过长
- 过度调优新生代:新生代过大会导致老年代过小,频繁Full GC
- 忽略元空间配置:元空间默认无限制,可能导致内存泄漏
- 只关注Full GC:频繁Young GC同样会影响系统性能
- 不进行压测验证:调优参数必须在压测环境验证后才能上线
- 迷信"万能参数":没有适用于所有场景的JVM参数,必须根据业务特点调优
7.3 不同业务场景调优策略
| 业务场景 | 调优目标 | 推荐参数配置 |
|---|---|---|
| 互联网应用(低延迟) | 降低GC停顿时间 | G1 GC,-XX:MaxGCPauseMillis=200,新生代占比40% |
| 大数据处理(高吞吐量) | 提高CPU利用率 | Parallel GC,新生代占比50%,增大GC线程数 |
| 微服务(资源受限) | 控制内存占用 | G1 GC,堆内存1G~2G,元空间256M |
| 实时系统(超低延迟) | 亚毫秒级停顿 | ZGC,-XX:+UseZGC,堆内存>16G |
JVM调优面试核心考点问答卡片
模块一:JVM调优基础概述
卡片1
问题 :JVM调优的四大核心目标是什么?
答案:
- 延迟优先:降低GC停顿时间(STW),提升系统响应速度
- 吞吐量优先:提高CPU有效利用率,减少GC总耗时
- 内存占用优化:控制JVM堆内存大小,避免资源浪费
- 稳定性保障:防止OOM、频繁Full GC、系统崩溃等问题
卡片2
问题 :哪些场景下必须进行JVM调优?
答案:
- 系统出现OOM异常
- 频繁发生Full GC
- GC停顿时间超过业务容忍阈值(如>500ms)
- 系统吞吐量明显下降
- 容器环境中内存资源受限
卡片3
问题 :JVM调优的三大核心原则是什么?
答案:
- 先排查业务代码问题,再考虑JVM调优(80%的性能问题源于代码)
- 调优是迭代过程,每次只修改一个参数
- 必须在生产环境相同配置下进行压测验证
- 避免过度调优,追求"够用即可"
模块二:常用JVM参数
卡片4
问题 :最基础的内存配置参数有哪些?分别是什么含义?
答案:
-Xms:初始堆内存大小(推荐与-Xmx相同)-Xmx:最大堆内存大小(推荐为物理内存的1/4~1/2)-Xmn:新生代大小(G1收集器不建议显式设置)-XX:MetaspaceSize:元空间初始大小(Java 8+替代永久代)-XX:MaxMetaspaceSize:元空间最大大小(默认无限制)-Xss:每个线程栈大小(默认1M)
卡片5
问题 :不同GC收集器的启用参数和适用场景是什么?
答案:
| 收集器 | 启用参数 | 适用场景 |
|---|---|---|
| Serial GC | -XX:+UseSerialGC |
单核CPU、客户端应用 |
| Parallel GC | -XX:+UseParallelGC |
多核CPU、批处理、大数据 |
| G1 GC | -XX:+UseG1GC |
大堆内存(>4G)、低延迟要求 |
| ZGC | -XX:+UseZGC |
超大堆内存(>16G)、亚毫秒级停顿(JDK 11+) |
卡片6
问题 :G1 GC最重要的专用参数有哪些?
答案:
-XX:MaxGCPauseMillis=200:目标最大GC停顿时间(默认200ms)-XX:G1HeapRegionSize=16M:每个Region大小(1M~32M,必须是2的幂)-XX:InitiatingHeapOccupancyPercent=45:堆占用率达到45%时启动并发标记-XX:G1NewSizePercent=5:新生代最小占比(默认5%)-XX:G1MaxNewSizePercent=60:新生代最大占比(默认60%)
卡片7
问题 :OOM故障排查必备的JVM参数有哪些?
答案:
-XX:+HeapDumpOnOutOfMemoryError:OOM时自动生成堆转储文件-XX:HeapDumpPath=/tmp/heapdump.hprof:堆转储文件路径-XX:+CrashOnOutOfMemoryError:OOM时直接崩溃JVM(便于快速重启)-XX:ErrorFile=/tmp/hs_err_pid%p.log:JVM崩溃日志路径
模块三:JVM调优核心指标
卡片8
问题 :JVM内存调优的核心指标有哪些?正常范围是多少?
答案:
- 堆内存使用率:<70%(持续>80%可能存在内存泄漏)
- 元空间使用率:<80%(持续增长可能是类加载泄漏)
- 新生代晋升速率:视业务而定(过高会导致老年代快速填满)
- 大对象数量:越少越好(大量大对象直接进入老年代)
卡片9
问题 :GC调优的核心指标有哪些?G1 GC的正常范围是多少?
答案:
- Young GC频率:<1次/秒(>5次/秒说明新生代过小)
- Young GC平均停顿时间:<50ms(>100ms影响用户体验)
- Full GC频率:<1次/小时(>1次/10分钟说明老年代不足)
- Full GC平均停顿时间:<1秒(>5秒导致系统严重卡顿)
- GC总耗时占比:<5%(>10%说明GC开销过大)
模块四:OOM问题排查
卡片10
问题 :常见的OOM类型有哪些?对应的错误信息是什么?
答案:
- 堆内存溢出:
java.lang.OutOfMemoryError: Java heap space - 元空间溢出:
java.lang.OutOfMemoryError: Metaspace - 栈内存溢出:
java.lang.StackOverflowError - 直接内存溢出:
java.lang.OutOfMemoryError: Direct buffer memory - 线程数过多:
java.lang.OutOfMemoryError: unable to create native thread
卡片11
问题 :OOM排查的标准流程是什么?
答案:
- 保留现场:确保开启了
-XX:+HeapDumpOnOutOfMemoryError参数 - 获取堆转储文件:从指定路径获取
.hprof文件 - 分析堆转储文件:使用MAT、JProfiler等工具
- 定位泄漏点:找出占用内存最多的对象及其引用链
- 修复代码问题:解决内存泄漏、优化对象创建逻辑
- 验证修复效果:进行压测,确认OOM不再发生
卡片12
问题 :Java中常见的内存泄漏场景有哪些?
答案:
- 静态集合类引用大量对象(如
static List) - 监听器和回调未及时注销
- 数据库连接、IO流未关闭
- 缓存使用不当(如无限期缓存)
- 内部类持有外部类引用
- ThreadLocal使用不当导致内存泄漏
模块五:GC日志分析
卡片13
问题 :G1 GC的Young GC日志中,关键信息有哪些?
答案:
- GC类型:G1 Evacuation Pause (young)
- GC总耗时:如
0.0234567 secs - 内存变化:Eden区、Survivor区、堆内存的前后大小
- 时间统计:user(用户态)、sys(内核态)、real(实际)时间
卡片14
问题 :GC日志中常见的异常模式有哪些?分别说明原因?
答案:
- 频繁Young GC:新生代过小、对象创建过快
- 频繁Full GC:老年代不足、内存泄漏、大对象过多
- GC停顿时间过长:堆内存过大、GC线程数不足、大对象过多
- GC耗时占比过高:GC参数配置不当、业务代码创建对象过多
卡片15
问题 :常用的GC日志分析工具有哪些?
答案:
- GCEasy:在线工具,生成可视化报告(推荐)
- GCViewer:开源桌面工具,支持多种GC日志格式
- HPjmeter:惠普出品,支持大日志文件分析
- Arthas:支持在线查看GC情况和简单分析
模块六:Arthas工具使用
卡片16
问题 :Arthas是什么?有什么优势?
答案 :
Arthas是Alibaba开源的Java诊断工具,无需重启JVM即可在线排查问题,支持JDK 6+,广泛应用于生产环境问题定位。
卡片17
问题 :Arthas查看JVM实时运行数据和线程信息的命令是什么?
答案:
dashboard:查看JVM实时运行数据(线程、内存、GC)thread -n 5:查看CPU使用率最高的5个线程thread 1234:查看指定线程的堆栈信息jvm:查看JVM详细信息
卡片18
问题 :Arthas监控和跟踪方法执行的核心命令有哪些?
答案:
watch:监控方法执行情况(入参、返回值、异常、耗时)trace:跟踪方法内部调用路径和耗时stack:查看方法的调用堆栈tt:时间隧道,记录方法执行过程并可重放
卡片19
问题 :如何使用Arthas进行线上代码热修复?
答案:
- 反编译类:
jad --source-only com.example.UserService > UserService.java - 修改源代码文件
- 编译修改后的文件:
mc UserService.java - 热替换类:
redefine -c 类加载器hash com.example.UserService
模块七:调优最佳实践与误区
卡片20
问题 :不同堆内存大小推荐使用什么GC收集器?
答案:
- 堆内存<4G:Parallel GC或G1 GC
- 堆内存4G~16G:G1 GC
- 堆内存>16G:ZGC或Shenandoah GC
卡片21
问题 :JVM调优的常见误区有哪些?
答案:
- 盲目增大堆内存(堆过大会导致GC停顿时间过长)
- 过度调优新生代(新生代过大会导致老年代过小)
- 忽略元空间配置(元空间默认无限制,可能导致内存泄漏)
- 只关注Full GC(频繁Young GC同样影响性能)
- 不进行压测验证(调优参数必须压测后上线)
- 迷信"万能参数"(没有适用于所有场景的参数)
卡片22
问题 :如何进行一次完整的JVM调优?
答案:
- 明确调优目标(延迟、吞吐量、内存占用)
- 收集系统运行数据(GC日志、监控指标、压测数据)
- 分析问题根源(内存泄漏、GC参数不当、代码问题)
- 制定调优方案(调整内存参数、选择GC收集器、优化代码)
- 实施调优并进行压测验证
- 监控调优效果,迭代优化