ai 生成的解决思路感觉已经很全面了
JVM 调优四大方向【终极速查版】
一、监控工具(发现 JVM 问题)
1️⃣ 必会 JDK 工具
工具 作用
jps 查看 JVM 进程
jstat GC 情况、是否频繁 Full GC
jmap 堆内存、对象分布、OOM
jstack 线程状态、死锁、CPU 飙高
👉 典型命令
jps -l
jstat -gc PID 1000
jmap -histo PID | head
jstack PID
2️⃣ 可视化 / 线上工具
JConsole / VisualVM(基础)
Arthas ⭐(生产强烈推荐)
dashboard
thread -n 5
heapdump
watch
二、Linux 命令(定位系统瓶颈)
1️⃣ CPU
top
top -H -p PID
高 CPU → 找线程 → jstack 定位代码
2️⃣ 内存
free -m
vmstat 1
关注:
available
swap 是否频繁
3️⃣ IO / 磁盘
iostat -x 1
df -h
4️⃣ 网络
netstat -anp | grep java
ss -ant
三、JVM 参数设置(治标但必须)
1️⃣ 堆内存(最重要)
-Xms4g
-Xmx4g
-Xmn1g
原则:
Xms = Xmx
年轻代 ≈ 堆的 1/3 ~ 1/4
2️⃣ GC 选择
GC 场景
Parallel 吞吐量优先
CMS 低停顿(已过时)
G1 ⭐ 大堆、低停顿
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
3️⃣ GC 日志 & OOM
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:/logs/gc.log
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/logs
4️⃣ 常见现象 → 参数思路
现象 方向
Minor GC 频繁 Eden 太小
Full GC 频繁 Old 区不足 / 内存泄漏
停顿时间长 G1 + 降低大对象
OOM 查代码,不是先加内存
四、代码优化(根本解决 ⭐⭐⭐)
1️⃣ 减少对象创建
// ❌
new String("abc");
// ✅
"abc";
2️⃣ 集合预估容量
new ArrayList<>(1000);
new HashMap<>(1024);
3️⃣ 避免大对象
大 List
大 byte[]
大 JSON 字符串
👉 用 分页 / 流式处理
4️⃣ 资源及时释放
try (InputStream in = ...) {
}
5️⃣ 防止内存泄漏(高频考点)
static 集合
ThreadLocal
Listener 未移除
threadLocal.remove();
五、JVM 调优标准流程(面试必杀)
现象
↓
监控工具(jstat / jstack / jmap)
↓
Linux 命令确认资源
↓
JVM 参数调整
↓
代码层根因修复
↓
验证(GC / RT / CPU)
六、面试一句话总结(直接背)
JVM 调优不是盲目改参数,而是通过监控工具和 Linux 命令定位问题,结合 JVM 参数和代码优化,从根本上提升系统性能和稳定性。
七