全方位-JVM-调优参数详解
全方位 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 的垃圾回收策略,如
adaptive
、
compact
等。
三、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 的参数体系非常庞大且复杂,不同版本可能会有新增或调整的参数。但上述列表涵盖了日常调优和性能分析中常见的大部分参数。