我给你整理一套面试直接能说、非常真实、不空洞 的 JVM 调优话术,再把你问的内存溢出排查工具 一次性讲清楚,包括你说的那个 Ar 开头的工具(Arthas)。
一、JVM 调优经验,面试怎么说最加分?
(你就按这个结构背,面试官最爱听)
1. 先说整体思路(显得你有体系)
我做 JVM 调优一般遵循三步走:
- 先定位问题:看 GC 频率、GC 停顿时间、内存占用、FullGC 是否频繁。
- 再分析原因:是内存泄漏、堆设置不合理、对象生命周期过长、还是代码创建对象太多。
- 最后针对性优化:改 JVM 参数、优化代码、调整对象生命周期、优化 GC 算法。
2. 再说你实际做过的事(真实、接地气)
可以这样说:
- 线上遇到过 FullGC 频繁、接口超时、CPU 高 的情况。
- 先通过监控平台查看 GC 日志,发现老年代增长快,频繁 FullGC。
- 用工具 dump 堆内存,分析发现存在内存泄漏,比如线程池未关闭、第三方库缓存没清理、静态集合持有大量对象。
- 然后优化代码,同时调整 JVM 参数:
- 合理设置 Xms / Xmx,避免堆忽大忽小;
- 调整 新生代比例,让短生命周期对象在 YoungGC 就回收;
- 根据业务选择 GC 算法,比如高吞吐用 ParallelGC ,低延迟用 G1 / ZGC。
- 优化后 FullGC 明显减少,接口 RT 稳定,服务不再抖动。
3. 常用 JVM 参数你可以随口说几个(显得专业)
-Xms4g -Xmx4g 堆初始和最大
-Xmn2g 新生代大小
-XX:SurvivorRatio=8 Eden:S0:S1 = 8:1:1
-XX:+UseG1GC 使用 G1
-XX:MaxGCPauseMillis=200 最大停顿时间
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/xxx OOM 自动 dump
-Xloggc:/xxx/gc.log GC日志
二、内存溢出(OOM)常用排查工具
你问的 Ar 开头的就是 Arthas ,我按常用程度给你列全:
1. 线上实时排查神器(你说的 Ar 开头)
🛠️ Arthas(阿尔萨斯)
阿里开源,线上不停机排查
能做:
- 看堆内存、年轻代、老年代使用情况
- 看方法执行耗时、定位慢接口
- 看哪个类占用内存多
- 热更新、查看线程死锁
- 直接看 GC 情况
一句话在面试说:
线上排查 OOM、CPU 高、GC 频繁,我一般先用 Arthas 实时看内存和线程,定位大致方向。
2. 堆 dump 分析工具(最核心)
🛠️ Eclipse MAT(Memory Analyzer Tool)
分析 hprof 堆快照 必备
- 看最大对象
- 看 GC Roots 引用链
- 直接定位内存泄漏点
🛠️ JProfiler
商业工具,功能强,可视化好,适合本地分析。
3. JDK 自带命令工具(必须会)
🛠️ jps
看 Java 进程 ID
🛠️ jstat
看 GC 情况,最常用:
jstat -gc pid 1000 10
看 YGC、FGC 次数、耗时。
🛠️ jmap
导出堆快照
jmap -dump:format=b,file=heap.hprof pid
🛠️ jstack
查看线程栈,排查死锁、死循环
🛠️ jconsole / jvisualvm
JDK 自带 GUI,监控内存、线程、GC。
4. 监控平台(显得你做过高并发项目)
- Prometheus + Grafana
- SkyWalking
- Pinpoint
- Arthas Tunnel
三、面试官问:OOM 怎么排查?你直接背这套
- 先看 监控/GC日志,确认是堆溢出、元空间溢出还是直接内存溢出。
- 用 jmap 或 OOM 自动 dump 拿到堆文件。
- 用 MAT/JProfiler 分析占用最大的对象,看引用链。
- 结合 Arthas 在线上定位是代码问题、第三方库问题还是缓存问题。
- 修复泄漏点,再调整 JVM 参数。
四、极简总结(方便你记忆)
- 调优思路:看 GC → 找原因 → 改代码 + 调参数
- Ar 开头工具 :Arthas(线上实时排查)
- 堆分析工具:MAT、JProfiler
- JDK 自带:jps、jstat、jmap、jstack