JVM 调优经验

我给你整理一套面试直接能说、非常真实、不空洞 的 JVM 调优话术,再把你问的内存溢出排查工具 一次性讲清楚,包括你说的那个 Ar 开头的工具(Arthas)

一、JVM 调优经验,面试怎么说最加分?

(你就按这个结构背,面试官最爱听)

1. 先说整体思路(显得你有体系)

我做 JVM 调优一般遵循三步走

  1. 先定位问题:看 GC 频率、GC 停顿时间、内存占用、FullGC 是否频繁。
  2. 再分析原因:是内存泄漏、堆设置不合理、对象生命周期过长、还是代码创建对象太多。
  3. 最后针对性优化:改 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 怎么排查?你直接背这套

  1. 先看 监控/GC日志,确认是堆溢出、元空间溢出还是直接内存溢出。
  2. jmap 或 OOM 自动 dump 拿到堆文件。
  3. MAT/JProfiler 分析占用最大的对象,看引用链。
  4. 结合 Arthas 在线上定位是代码问题、第三方库问题还是缓存问题。
  5. 修复泄漏点,再调整 JVM 参数。

四、极简总结(方便你记忆)

  • 调优思路:看 GC → 找原因 → 改代码 + 调参数
  • Ar 开头工具Arthas(线上实时排查)
  • 堆分析工具:MAT、JProfiler
  • JDK 自带:jps、jstat、jmap、jstack
相关推荐
阿pin1 小时前
Java随笔-GC收集器工作机制
java·开发语言·jvm·gc
自由的裙子3 小时前
How-To: Using the N* Stack, part 4
java·jvm·oracle
阿pin5 小时前
Java随笔-JVM内存模型
java·开发语言·jvm·内存模型
wuminyu1 天前
Java NIO内存管理与零拷贝深度剖析
java·linux·c语言·jvm·c++
zhixingheyi_tian1 天前
JVM 之 GCLocker
java·jvm
标致的钢铁侠1 天前
c# 温故而知新: 线程篇(一)
java·jvm·c#
盐焗鹌鹑蛋1 天前
【C++】多态
java·jvm·c++
折哥的程序人生 · 物流技术专研2 天前
Java面试通关⑯:JVM虚拟机核心全集
jvm·校招·虚拟机·gc垃圾回收·java面试·类加载·调优
ALex_zry2 天前
C++26 constexpr 异常详解:编译期也能 throw/catch
java·jvm·c++
标致的自行车2 天前
Entity Framework之问题收集
jvm·数据库·oracle