JVM 优化指南
1. JVM 参数配置
1.1 基础参数配置
设置堆内存大小
-Xms2048m
-Xmx2048m
设置新生代大小
-Xmn1024m
设置元空间大小
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=256m
设置线程栈大小
-Xss512k
1.2 垃圾回收器配置
使用 G1 垃圾回收器
-XX:+UseG1GC
设置期望停顿时间
-XX:MaxGCPauseMillis=200
设置并发线程数
-XX:ConcGCThreads=5
设置标记线程数
-XX:ParallelGCThreads=8
2. 优化建议
2.1 内存优化
-
堆内存设置
- 建议将 -Xms 和 -Xmx 设置为相同值,避免堆内存动态调整
- 堆内存大小建议不超过可用物理内存的 70%
-
新生代设置
- 新生代大小一般设置为堆内存的 1/3 到 1/4
- 根据对象存活率调整新生代大小
-
元空间设置
- 根据应用程序类加载情况适当设置
- 建议设置初始值,避免运行时动态扩展
2.2 垃圾回收优化
-
选择合适的垃圾回收器
- 推荐使用 G1 垃圾回收器
- 对于小内存应用,可以使用 ParNew + CMS
-
GC 日志配置
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:/path/to/gc.log
2.3 线程优化
-
线程池配置
- 根据 CPU 核心数配置线程池大小
- 使用 SpringBoot 提供的线程池配置
-
线程栈大小
- 默认 1M,可根据需求调整
- 建议不要设置过大,以免影响创建线程数量
3. 监控和调优工具
-
JDK 自带工具
- jstat:查看 GC 状态
- jmap:导出堆内存快照
- jstack:查看线程状态
-
第三方工具
- Arthas:阿里开源的 Java 诊断工具
- JProfiler:性能分析工具
- MAT:内存分析工具
4. 常见问题解决方案
4.1 内存泄漏
- 使用 MAT 分析堆内存快照
- 检查长期存活对象
- 排查资源未释放问题
4.2 频繁 Full GC
- 增大堆内存空间
- 优化对象创建和回收
- 检查大对象分配
4.3 性能调优步骤
- 收集性能数据
- 分析 GC 日志
- 调整 JVM 参数
- 验证优化效果
5. 生产环境配置示例
5.1 8G 内存服务器配置
-Xms4096m
-Xmx4096m
-Xmn1536m
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=256m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:/logs/gc.log
5.2 16G 内存服务器配置
-Xms8192m
-Xmx8192m
-Xmn3072m
-XX:MetaspaceSize=512m
-XX:MaxMetaspaceSize=512m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:/logs/gc.log
6. 注意事项
- 在修改 JVM 参数前,先备份当前配置
- 修改参数后需要进行充分测试
- 保持对系统的监控,及时发现问题
- 根据实际情况调整参数,不要盲目照搬
7. 参考资料
- SpringBoot 官方文档
- Java GC 调优指南
- G1 GC 官方文档