JVM 调优是一项系统工程,涉及版本选择、垃圾收集器配置、内存区域划分、代码层面优化等多个维度。本文梳理出六大核心调优方向,助你构建高性能 Java 应用。
将 JDK 升级至最新长期支持版本(如 JDK 17/21)是性能提升的“捷径”。从 JDK 1.4 到 1.6,HotSpot VM 在 JIT 编译、逃逸分析、锁优化、GC 算法等方面均有重大突破。若受限于遗留系统无法大版本升级,至少应应用当前版本的最新补丁版本。
在硬件允许的前提下,强烈建议使用 64-bit JVM。它突破了 32-bit 进程 4GB 内存限制,能充分利用大内存服务器资源,特别适合堆内存需求超过 4GB 的大型应用。
GC 期间的“Stop-the-World”直接影响应用响应延迟。JDK 5+ 提供多款收集器,需根据业务特性选型:
注意:切换收集器后通常需适当增大堆内存(如 -Xmx),以容纳并发标记阶段的额外对象存活。
这是调优中最考验经验的环节,无通用“黄金数值”,需结合 jstat、jconsole、VisualVM 等工具实测调整。常用参数:
-Xms / -Xmx:堆初始/最大值,建议设为同值避免动态扩缩容开销-XX:NewRatio:老年代/新生代比例,增大该值可减少 Young GC 频率,但会延长 Old GC 耗时-XX:MaxNewSize / -XX:SurvivorRatio:扩大新生代及 Survivor 区(建议新生代占堆 30%-40%),让更多短命对象在 Young GC 中回收,降低晋升老年代速率-XX:MaxPermSize (JDK 7-) / -XX:MaxMetaspaceSize (JDK 8+):元空间/永久代上限,防止 OutOfMemoryError: Metaspace类对象、JSP 编译产生的 Class 均存放于永久代/元空间,Full GC 对其回收能力有限。若动态生成大量类(如 JSP、Groovy、CGLIB、JDK 动态代理),易触发 OOM。对策:
-XX:MaxMetaspaceSize-Xnoclassgc 禁用类卸载-Dsun.rmi.dgc.client.gcInterval 与 -Dsun.rmi.dgc.server.gcIntervalSystem.gc():显式触发 Full GC,破坏 JVM 自适应调节finalize():增加 GC 负担,改用 java.lang.ref.Cleaner 或 PhantomReference生产环境建议开启 GC 日志:-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xlog:gc*:file=/var/log/gc.log:time,uptime,level,tags。配合 jstat -gcutil、Arthas、Async Profiler 定期分析 GC 耗时、频率、晋升速率,建立性能基线。