Skip to content

JVM 调优基础

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