JVM 调优基础
JVM 内存模型
Section titled “JVM 内存模型”运行时数据区
Section titled “运行时数据区”┌─────────────────────────────────────────────────────┐│ JVM 运行时数据区 │├─────────────┬─────────────┬─────────────────────────┤│ 堆 (Heap) │ 方法区 │ 线程私有区域 ││ │ (Metaspace) ├───────────┬─────────────┤│ 新生代 │ │ 虚拟机栈 │ 本地方法栈 ││ 老年代 │ │ │ ││ │ ├───────────┴─────────────┤│ │ │ 程序计数器 │└─────────────┴─────────────┴─────────────────────────┘- 新生代: Eden + Survivor0 + Survivor1
- 老年代: 存放长期存活对象
- 元空间: 存放类信息、常量、静态变量
常用 JVM 参数
Section titled “常用 JVM 参数”# 堆内存-Xms512m # 初始堆大小-Xmx2g # 最大堆大小-Xmn256m # 新生代大小
# 元空间-XX:MetaspaceSize=128m-XX:MaxMetaspaceSize=256m
# 线程栈-Xss256k# JDK 8 默认-XX:+UseParallelGC
# G1 收集器 (推荐)-XX:+UseG1GC-XX:MaxGCPauseMillis=200
# ZGC (JDK 15+)-XX:+UseZGC# JDK 8-XX:+PrintGCDetails-XX:+PrintGCDateStamps-Xloggc:gc.log
# JDK 9+-Xlog:gc*:file=gc.log:time,uptime,level,tags垃圾收集算法
Section titled “垃圾收集算法”- 新生代: 复制算法,效率高
- 老年代: 标记-整理算法,避免碎片
对象晋升规则
Section titled “对象晋升规则”- Eden 区满 → 触发 Minor GC
- 对象年龄达到阈值 → 晋升老年代
- 大对象直接进入老年代
1. 分析 GC 日志
Section titled “1. 分析 GC 日志”# 使用 GCViewer 或 GCEasy 分析# 关注指标:# - GC 频率# - GC 停顿时间# - 内存回收效率2. 常见问题
Section titled “2. 常见问题”| 问题 | 现象 | 解决方案 |
|---|---|---|
| 频繁 Full GC | CPU 飙升 | 增大堆内存,优化对象生命周期 |
| 内存泄漏 | 老年代持续增长 | 分析堆转储,定位泄漏点 |
| 停顿过长 | 响应超时 | 使用 G1/ZGC,调整停顿目标 |
3. 调优原则
Section titled “3. 调优原则”- 新生代大小一般为堆的 1/3 到 1/4
- 避免设置过小的堆内存
- 生产环境 Xms 和 Xmx 设置相同
- 优先优化代码,再调整 JVM 参数
- jstat: 查看 GC 统计信息
- jmap: 生成堆转储文件
- jvisualvm: 可视化监控
- Arthas: 在线诊断工具