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
相关推荐
星梦清河2 小时前
JVM知识点—总结篇
jvm
Engineer邓祥浩3 小时前
JVM学习问题记录(2) jps命令无法识别
jvm·学习
woai33643 小时前
学习JVM-基础篇-Java虚拟机栈&本地方法栈
java·jvm·学习
小陈工4 小时前
Python Web开发入门(三):配置文件管理与环境变量最佳实践
开发语言·jvm·数据库·python·oracle·性能优化·开源
好大哥呀12 小时前
C++ 多态
java·jvm·c++
Sunshine for you19 小时前
使用Flask快速搭建轻量级Web应用
jvm·数据库·python
qwehjk200819 小时前
如何从Python初学者进阶为专家?
jvm·数据库·python
Arthas21721 小时前
Java大厂面试:从Spring到微服务的全面技术考察
java·jvm·spring·微服务·面试·并发
南境十里·墨染春水21 小时前
C++ 笔记 深赋值 浅赋值(面向对象)
开发语言·jvm·c++·笔记