全方位 JVM 调优参数详解

全方位 JVM 调优参数详解

JVM 的调优对于 Java 应用的性能至关重要。以下为你详细列举各类 JVM 调优参数,希望能满足你对"所有"参数的需求。

一、内存管理参数

堆内存参数

堆初始大小与最大值

-Xms:设置 JVM 启动时堆内存的初始大小。如 -Xms1g 表示初始堆内存为 1GB。

-Xmx:设置堆内存的最大可分配大小。例如 -Xmx4g ,即堆内存最大可达 4GB。

年轻代参数

-Xmn:设置新生代(Young Generation)的大小。例如 -Xmn512m 表示新生代大小为 512MB。

-XX:NewSize-XX:MaxNewSize:分别单独设置新生代的初始大小和最大大小,功能与 -Xmn 类似,但可分别配置。

-XX:SurvivorRatio:设置 Eden 区与每个 Survivor 区的大小比例,默认值为 8 。例如 -XX:SurvivorRatio=6 ,Eden 区与单个 Survivor 区比例为 6:1。

-XX:TargetSurvivorRatio:设置 Survivor 区的目标使用率,默认值为 50% 。当 Survivor 区的使用率达到该值时,存活对象会被晋升到老年代。

-XX:MaxTenuringThreshold:设置对象在新生代中经历多少次 GC 后晋升到老年代,默认值为 15 。例如 -XX:MaxTenuringThreshold=10

老年代参数

-XX:OldSize-XX:MaxOldSize:分别设置老年代的初始大小和最大大小。

方法区(元空间)参数

-XX:MetaspaceSize:设置元空间的初始大小。例如 -XX:MetaspaceSize=256m

-XX:MaxMetaspaceSize:设置元空间的最大大小。如 -XX:MaxMetaspaceSize=1g

-XX:MinMetaspaceFreeRatio-XX:MaxMetaspaceFreeRatio:分别设置元空间在 GC 后最小和最大空闲比例,默认值分别为 40% 和 70% 。当元空间的空闲比例低于 MinMetaspaceFreeRatio 或高于 MaxMetaspaceFreeRatio 时,会触发相应的 GC 操作。

直接内存参数

-XX:MaxDirectMemorySize:设置直接内存的最大大小。如果不指定,默认与 -Xmx 相同。例如 -XX:MaxDirectMemorySize=512m

堆外内存相关

-XX:NativeMemoryTracking:开启本地内存跟踪功能,可设置为 summary(仅跟踪总体内存使用情况)或 detail(跟踪详细的内存分配信息),如 -XX:NativeMemoryTracking=detail 。但开启此功能会增加一定的性能开销。

二、垃圾回收(GC)相关参数

垃圾回收器通用参数

-XX:+UseSerialGC:启用串行垃圾回收器。

-XX:+UseParallelGC:启用并行垃圾回收器。

-XX:+UseConcMarkSweepGC:启用 CMS 垃圾回收器(JDK 9 及以后废弃)。

-XX:+UseG1GC:启用 G1 垃圾回收器。

串行垃圾回收器参数

-XX:ParallelGCThreads:设置串行 GC 的线程数,默认值为 1(单线程)。

并行垃圾回收器参数

-XX:ParallelGCThreads:设置并行 GC 的工作线程数,默认根据 CPU 核心数自动调整。

-XX:MaxGCPauseMillis:设置并行 GC 期望的最大停顿时间(仅作为参考)。

-XX:GCTimeRatio:设置并行 GC 的吞吐量目标,默认值为 99 ,表示 GC 时间与应用运行时间的比例为 1:99 。

CMS 垃圾回收器参数

-XX:CMSInitiatingOccupancyFraction:设置 CMS 在老年代占用率达到多少时开始回收,默认值为 68% 。

-XX:+UseCMSInitiatingOccupancyOnly:只依据 CMSInitiatingOccupancyFraction 触发 CMS 回收。

-XX:+CMSScavengeBeforeRemark:在 CMS 重新标记前进行一次 Minor GC,减少重新标记时的对象数量。

-XX:+CMSParallelInitialMarkEnabled:开启 CMS 并行初始标记阶段。

-XX:+CMSClassUnloadingEnabled:启用 CMS 对永久代(或元空间)中类的卸载功能。

G1 垃圾回收器参数

-XX:MaxGCPauseMillis:设置 G1 期望的最大 GC 停顿时间。

-XX:InitiatingHeapOccupancyPercent:设置触发并发标记周期的堆占用率阈值,默认值为 45% 。

-XX:ConcGCThreads:设置 G1 并发 GC 线程数。

-XX:G1HeapRegionSize:设置 G1 中每个 Region 的大小,可选值为 1MB、2MB、4MB、8MB、16MB、32MB 等,默认根据堆大小自动选择。

-XX:G1ReservePercent:设置堆中保留空间的百分比,用于降低晋升失败的概率,默认值为 10% 。

ZGC 垃圾回收器参数(JDK 11 及以后)

-XX:+UseZGC:启用 ZGC 垃圾回收器。

-XX:ZCollectionInterval:设置 ZGC 自动触发垃圾回收的时间间隔(单位:秒)。

-XX:ZAllocationSpikeTolerance:设置 ZGC 对内存分配尖峰的容忍度。

Shenandoah 垃圾回收器参数(JDK 12 及以后)

-XX:+UseShenandoahGC:启用 Shenandoah 垃圾回收器。

-XX:ShenandoahGCHeuristics:设置 Shenandoah 的垃圾回收策略,如 adaptivecompact 等。

三、JIT 编译相关参数

-XX:CompileThreshold:设置方法调用次数达到多少后触发 JIT 编译,默认值为 10000 次。

-XX:+TieredCompilation:启用分层编译。

-XX:CICompilerCount:设置 JIT 编译器的线程数量。

-XX:InterpreterProfilePercentage:设置解释器执行时进行热点探测的比例,默认值为 33% 。

-XX:OnStackReplacePercentage:设置栈上替换(OSR)编译的触发比例,默认值为 933 。

四、线程相关参数

-Xss:设置每个线程的栈空间大小。例如 -Xss1m 表示每个线程栈大小为 1MB。

-XX:ThreadStackSize:与 -Xss 功能相同,用于设置线程栈大小。

-XX:ActiveProcessorCount:手动指定 JVM 可使用的处理器数量。

五、性能监控与诊断参数

日志打印相关

-XX:+PrintGCDetails:打印详细的 GC 日志。

-XX:+PrintGCDateStamps:在 GC 日志中添加时间戳。

-XX:+PrintTenuringDistribution:打印对象年龄分布信息。

-XX:+PrintHeapAtGC:在每次 GC 前后打印堆内存使用情况。

-XX:+PrintClassHistogram:在发生 Ctrl+C 中断或 Full GC 时打印类直方图信息。

-XX:+PrintFlagsFinal:打印所有 JVM 参数的最终值。

性能监控工具相关

-XX:+UnlockCommercialFeatures -XX:+FlightRecorder:启用 Java Flight Recorder(JFR),需商业许可(OpenJDK 11 及以后版本对 JFR 进行了开源)。

-XX:StartFlightRecording:设置 JFR 的启动参数,如 -XX:StartFlightRecording=name=myrecording,settings=profile

-Dcom.sun.management.jmxremote:开启 JMX 功能,用于远程监控和管理 JVM。

-Dcom.sun.management.jmxremote.port:指定 JMX 连接的端口号。

-Dcom.sun.management.jmxremote.authenticate:是否启用 JMX 认证。

-Dcom.sun.management.jmxremote.ssl:是否启用 JMX SSL 加密。

其他监控参数

-XX:+PerfDisableSharedMem:禁用性能计数器共享内存,避免因共享内存竞争导致的性能问题。

-XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation:开启 JIT 编译日志记录。

六、其他参数

-XX:+UseLargePages:启用大页内存支持。

-XX:+DisableExplicitGC:禁止显式调用 System.gc() 触发 Full GC。

-XX:+AlwaysPreTouch:在 JVM 启动时将堆内存的所有页都分配到物理内存中。

-XX:+UseNUMA:启用 NUMA 架构优化。

-XX:+UseAdaptiveSizePolicy:启用自适应大小策略,JVM 会根据应用的运行情况自动调整堆内存大小和相关参数。

-XX:ReservedCodeCacheSize:设置 JIT 编译代码缓存的大小,默认值为 48MB 。例如 -XX:ReservedCodeCacheSize=128m

这仍然不是绝对的"所有"参数,JVM 的参数体系非常庞大且复杂,不同版本可能会有新增或调整的参数。但上述列表涵盖了日常调优和性能分析中常见的大部分参数。

相关推荐
流星52112220 小时前
GC 如何判断对象该回收?从可达性分析到回收时机的关键逻辑
java·jvm·笔记·学习·算法
JanelSirry20 小时前
我的应用 Full GC 频繁,怎么优化?
jvm
JH307321 小时前
jvm,tomcat,spring的bean容器,三者的关系
jvm·spring·tomcat
DKPT1 天前
JVM直接内存和堆内存比例如何设置?
java·jvm·笔记·学习·spring
siriuuus1 天前
JVM 垃圾收集器相关知识总结
java·jvm
小满、1 天前
什么是栈?深入理解 JVM 中的栈结构
java·jvm·1024程序员节
百花~2 天前
JVM(Java虚拟机)~
java·开发语言·jvm
每天进步一点点dlb2 天前
JVM中的垃圾回收算法和垃圾回收器
jvm·算法
漫漫不慢.2 天前
蓝桥杯-16955 岁月流转
java·jvm·蓝桥杯
boy快快长大3 天前
【JVM】线上JVM堆内存报警,占用超90%
jvm