JVM 调优介绍

JVM 调优介绍 JVMJava Virtual Machine的调优是一个重要的性能优化过程目标是提升应用的响应速度、吞吐量、稳定性以及资源利用率。下面是一个系统性的 JVM 调优指南从整体策略到具体参数设置。 目标响应时间优化减少 GC 停顿提升用户体验。吞吐量优化提高单位时间内完成的任务数。内存占用优化避免 OOM、内存泄漏等问题。稳定性优化提升系统运行的鲁棒性和可预期性。 前提准备应用对性能的目标和需求如响应时间优先 or 吞吐量优先JVM版本信息8/11/17/21不同版本垃圾收集器策略不同监控工具数据如 GC日志、CPU、内存、线程等压测工具JMeter、wrk、Apache Bench 等日志记录工具建议加上-Xlog:gc*或-XX:PrintGCDetails⚙️ 常用 JVM 参数堆内存设置-Xms512m# 初始堆大小-Xmx2048m# 最大堆大小年轻代与老年代分配-XX:NewRatio2# 新生代和老年代比例 (1:2)-XX:SurvivorRatio8# Eden 和 Survivor 区比例 (Eden:Survivor 8:1:1)垃圾收集器选择# G1 收集器JDK8~17推荐-XX:UseG1GC# CMS 收集器已废弃不推荐新项目使用-XX:UseConcMarkSweepGC# ZGCJDK11低延迟-XX:UseZGC# Shenandoah GCJDK12-XX:UseShenandoahGCGC日志输出-Xlog:gc*:filegc.log:time,uptime,level,tags 典型调优思路 1. 启动调优根据机器内存设置合适的-Xms和-Xmx避免频繁扩容选择合适的 GC如 G1♻️ 2. GC 调优监控 Full GC 频率调节堆大小或晋升策略优化对象生命周期减少过早晋升到老年代避免大对象频繁分配可能直接进老年代造成GC压力 3. 内存泄漏排查使用jmap -histo/MAT工具查看堆中哪些对象未释放利用Arthas查看热点对象 4. 线程与CPU问题排查使用topps -mp pid -o THREAD,tid,time查看CPU占用线程jstack打印线程堆栈排查死锁、阻塞代码优化减少对象创建尽量复用对象避免频繁创建短命对象。使用合适的数据结构选择合适的集合类例如 ArrayList vs LinkedList并根据需求选择合适的实现。避免内存泄漏定期检查代码中是否存在内存泄漏例如未清理的缓存、静态集合中的对象引用等。设置线程数在多线程应用中合理配置线程数可以提高性能。设置最大线程数取决于应用和服务器的具体情况。-XX:ParallelGCThreads4 # 设置并行 GC 线程数✅ 实战建议先定位再调优盲目调 JVM 参数是大忌一定要配合 GC 日志和监控。不同场景用不同 GC响应优先ZGC / Shenandoah吞吐优先G1 / ParallelGC测试验证调优效果改参数后跑压测对比 GC、响应时间等数据。关注元空间MetaSpace大小-XX:MaxMetaspaceSize