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
相关推荐
weixin_444012938 小时前
c++如何将std--vector直接DUMP到二进制文件_指针地址直写【附代码】
jvm·数据库·python
woxihuan1234568 小时前
Go语言中--=运算符详解:位右移赋值操作的原理与应用
jvm·数据库·python
m0_690825829 小时前
如何备份被破坏的数据表_强制跳过错误的导出尝试
jvm·数据库·python
m0_733565469 小时前
JavaScript中Reflect-ownKeys获取所有键名的优势
jvm·数据库·python
2301_8159019710 小时前
C#怎么使用协变和逆变 C#泛型中的in和out关键字协变逆变是什么意思怎么用【语法】
jvm·数据库·python
m0_4636722010 小时前
SQL优化SQL关联查询中的排序字段_减少临时空间占用与内存开销
jvm·数据库·python
iuvtsrt10 小时前
存储过程如何处理海量数据的批处理_循环提交与分段LIMIT结合
jvm·数据库·python
yexuhgu10 小时前
SQL如何检查字符串是否存在:INSTR与LOCATE函数使用
jvm·数据库·python
2301_7838486511 小时前
SQL如何用SQL子查询实现关联报表生成_嵌套逻辑关联多表
jvm·数据库·python
2501_9010064711 小时前
Golang怎么用gRPC Gateway_Golang gRPC Gateway教程【经典】
jvm·数据库·python