基于 JDK 1.8 版本 HotSpot VM 参数指南。
JVM 参数共分为三类:
- 标准参数(-),所有的 JVM 实现都必须实现这些参数的功能,而且向后兼容;
- 非标准参数(-X),默认 JVM 实现这些参数的功能,但是并不保证所有 JVM 实现都满足,且不保证向后兼容;
- 非 Stable 参数(-XX),此类参数各个 JVM 实现会有所不同,需要慎重使用。
1.JVM参数
表格中 JVM 参数中的所有具体数字仅供说明之用。
1.收集器参数
HotSpot VM 中垃圾收集器的可用组合:
Young GC | Old GC | JVM 参数 | 说明 |
---|---|---|---|
Serial | Serial Old | -XX:+UseSerialGC | |
Parallel Scavenge | Serial Old | -XX:+UseParallelGC | JDK1.8 默认收集器 |
Parallel Scavenge | Parallel Old | -XX:+UseParallelOldGC | |
ParNew | Serial Old | -XX:+UseParNewGC | |
Serial | CMS | -XX:-UseParNewGC -XX:+UseConcMarkSweepGC | |
ParNew | CMS | -XX:+UseParNewGC -XX:+UseConcMarkSweepGC | |
G1 | G1 | -XX:+UseG1GC | JDK1.9 默认收集器 |
查看默认收集器是什么可以通过 java -XX:+PrintCommandLineFlags -version 命令进行查看。
2.日志参数
GC 日志详细信息的参数:
JVM 参数 | 说明 | 建议 |
---|---|---|
-verbose:gc 或者 -XX:+PrintGC | 打印 GC 日志 | 建议配置 |
-XX:+PrintGCDetails | 开启详细 GC 日志模式 | 建议配置 |
-XX:+PrintGCTimeStamps | 打印 GC 的时间戳,以基准时间的形式 | |
-XX:+PrintGCDateStamps | 打印 GC 的时间戳,以日期的形式 | 建议配置 |
-XX:+PrintReferenceGC | 打印各种引用的处理时间 | 建议配置 |
-XX:+PrintJNIGCStalls | 打印进入临界区的线程信息 | |
-XX:+PrintGCCause | 打印 GC 原因 | 建议配置 |
-XX:+PrintAdaptiveSizePolicy | ||
-XX:+PrintPromotionFailure | 打印新生代对象晋升老生代失败的附加信息 | 建议配置 |
-XX:+PrintGCApplicationStoppedTime | 打印垃圾回收期间程序暂停的时间 | |
-XX:+PrintGCApplicationConcurrentTime | 打印每次垃圾回收前,程序未中断的执行时间 |
GC 日志滚动记录的参数:
JVM 参数 | 说明 | 建议 |
---|---|---|
-Xloggc:< filename> | 将 GC 日志输出到文件而不是控制台 | |
-XX:+UseGCLogFileRotation | 启用 GC 日志滚动 | |
-XX:GCLogFileSize=512m | GC 日志文件最大的阈值 | |
-XX:NumberOfGCLogFiles=5 | GC 日志文件数 |
更多日志记录的参数:
JVM 参数 | 说明 | 建议 |
---|---|---|
-XX:+PrintTenuringDistribution | 在每次年轻代 GC 时,输出幸存区中对象的年龄分布 | |
-XX:+PrintTLAB | 打印 TLAB 相关分配信息 | |
-XX:+PrintPLAB | 打印幸存者 PLAB 详情 | |
-XX:+PrintOldPLAB | 打印老年代 PLAB 详情 | |
-XX:+PrintGCTaskTimeStamps | 为每个独立的 GC 线程打印时间戳 | |
-XX:+PrintHeapAtGC | 每一次 GC 后,都打印堆信息 | |
-XX:+PrintHeapAtSIGBREAK | 在信号上打印堆详细信息 | |
-XX:+PrintClassHistogramAfterFullGC | 在 full GC 之后打印类柱状图 | |
-XX:+PrintClassHistogramBeforeFullGC | 在 full GC 之前打印类柱状图 |
3.内存调整参数
JVM 参数 | 说明 | 建议 |
---|---|---|
-Xms256m 或者 -XX:InitialHeapSize=256m | JVM 堆初始大小(新生代 + 老年代) | 建议配置 |
-Xmx2g 或者 -XX:MaxHeapSize=2g | JVM 堆最大大小(新生代 + 老年代) | 建议配置 |
-XX:NewSize=64m -XX:MaxNewSize=64m | 年轻代的初始大小和最大大小(Eden 区 + 两个 Survivor 区) | 建议配置 |
-XX:NewRatio=2 | 年轻代(Eden 区 + 两个 Survivor 区)和老年代的比值,默认 2,即年轻代:老年代 = 1:2,即年轻代占堆的 1/3 | |
-XX:SurvivorRatio=8 | 设置 Eden 区和一个 Survivor 区的比值,默认 8,即 8:1,一个 Survivor 占年轻代的 1/10 | |
-XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1g | 元数据空间的初始大小和最大大小 | |
-Xss256k 或者 -XX:ThreadStackSize=256 | 线程堆栈大小,单位字节 | |
-XX:CompressedClassSpaceSize=1g | 类指针压缩空间大小(仅 64 位版本的 JVM) | |
-XX:InitialCodeCacheSize=256m -XX:ReservedCodeCacheSize=512m | Code Cache 的初始大小和最大大小 | |
-XX:MaxDirectMemorySize=2g | JVM 堆外内存的最大大小 |
4.年轻代参数
年轻代的参数:
JVM 参数 | 说明 | 建议 |
---|---|---|
-XX:InitialTenuringThreshold=8 | 设置初始的对象在年轻代中最大存活次数 | |
-XX:MaxTenuringThreshold=15 | 对象从年轻代晋升到老生代经过GC次数的最大阈值,默认15 | |
-XX:PretenureSizeThreshold=2m | 设置多大的对象直接进入老年代 | |
-XX:+AlwaysTenure | 表示没有幸存区,所有对象在第一次 GC 时,会晋升到老年代。没有合理的场景使用这个参数 | |
-XX:+NeverTenure | 对象永远不会晋升到老年代 |
线程本地分配的参数:
JVM 参数 | 说明 | 建议 |
---|---|---|
-XX:+UseTLAB | 开启 TLAB,默认是开启的 | |
-XX:+ResizeTLAB | 表示自动调整 TLABRefillWasteFraction 阈值 | |
-XX:TLABSize=1m | 线程的 TLAB 初始大小 | |
-XX:MinTLABSize=64k | TLAB 最小大小 |
并行处理的参数:
JVM 参数 | 说明 | 建议 |
---|---|---|
-XX:ConcGCThreads=2 | 并发垃圾收集器使用的线程数量 | |
-XX:ParallelGCThreads=20 | 在进行并行GC的时候,可用于GC的线程数 | |
-XX:+ParallelRefProcEnabled | 并行处理Reference,加快处理速度,缩短耗时 |
JVM 参数 | 说明 | 建议 |
---|---|---|
-XX:+DisableExplicitGC | 禁止在运行期显式地调用System.gc(),默认启用 | |
-XX:+ExplicitGCInvokesConcurrent | System.gc() 是正常 full GC,会 STW,打开此参数后,在做 System.gc() 时会做 background 模式 CMS GC,即并行 full GC,可提高 full GC效率,注意,该参数在允许 systemGC 且使用 CMS GC 时有效 | |
-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses | 保证当有系统 GC 调用时,永久代也被包括进 CMS 垃圾回收的范围内 | |
-XX:SoftRefLRUPolicyMSPerMB=1000 | 基于空闲堆大小的软引用 TTL 计算因子,默认1000,单位毫秒 | |
-XX:OnOutOfMemoryError=“kill -9%p” | 内存不足时执行的命令,例如在 Linux 上执行 “kill -9%p”,在 Windows 上执行 “taskkill /F /PID %p” |
5.CMS参数
CMS 初始化参数:
JVM 参数 | 说明 | 建议 |
---|---|---|
-XX:+UseCMSInitiatingOccupancyOnly | 使用设定的回收阈值 (下面指定的70%) 开始 CMS 收集,如果不指定,JVM 仅在第一次使用设定值,后续则自动调整 | |
-XX:CMSInitiatingOccupancyFraction=70 | 使用 CMS 作为垃圾回收使用 70% 后开始 CMS 收集 | |
-XX:CMSBootstrapOccupancy=50 | ||
-XX:CMSTriggerRatio=70 | ||
-XX:CMSTriggerInterval=60000 |
CMS “Stop-the-World” 停顿参数:
JVM 参数 | 说明 | 建议 |
---|---|---|
-XX:CMSWaitDuration=30000 | ||
-XX:+CMSScavengeBeforeRemark | 在 CMS GC 前启动一次 young GC | |
-XX:+CMSScheduleRemarkEdenSizeThreshold | 设置 Eden 区大小,低于此值时不启动重新标记阶段 | |
-XX:CMSScheduleRemarkEdenPenetration=20 | 设置启动重新标记阶段时 Eden 区的空间占用率 | |
-XX:CMSScheduleRemarkSamplingRatio=4 |
CMS 并发参数:
JVM 参数 | 说明 | 建议 |
---|---|---|
-XX:+CMSParallelInitialMarkEnabled | 开启初始标记过程中的并行化 | |
-XX:+CMSParallelRemarkEnabled | 开启并行 remark | |
-XX:+CMSParallelSurvivorRemarkEnabled | 开启幸存者区并行 remark | |
-XX:+CMSConcurrentMTEnabled | 开启 CMS 并发阶段以多线程执行 |
CMS 诊断参数:
JVM 参数 | 说明 | 建议 |
---|---|---|
-XX:PrintCMSStatistics=1 | ||
-XX:+PrintCMSInitiationStatistics | ||
-XX:+CMSDumpAtPromotionFailure | ||
-XX:+CMSPrintChunksInDump | ||
-XX:+CMSPrintObjectsInDump |
其他 CMS 参数:
JVM 参数 | 说明 | 建议 |
---|---|---|
-XX:+CMSClassUnloadingEnabled | 如果启用了这个参数,垃圾回收会清理永久代,移除不再使用的 classes | |
-XX:+CMSIncrementalMode | 开启 CMS 收集器的增量模式 | |
-XX:+CMSOldPLABMin=16 -XX:+CMSOldPLABMax=1024 |
-XX:+UseCMSInitiatingOccupancyOnly、-XX:CMSInitiatingOccupancyFraction=70、-XX:CMSTriggerInterval=60000、-XX:CMSWaitDuration=30000、-XX:+CMSScavengeBeforeRemark 这几个参数禁用了一些启发式方法,使用的时候需要仔细验证。
6.G1参数
JVM 参数 | 说明 | 建议 |
---|---|---|
-XX:G1HeapRegionSize=32m | 设置每个 Region 的大小,需要为 1、2、4、8、16、32 其一一个,默认是堆内存的 1/2000 | |
-XX:G1ReservePercent=10 | 这个值是为了保留一些空间用于年代之间的提升,默认值是堆空间的 10%,注意这个空间保留后就不会用在年轻代了 | |
-XX:InitiatingHeapOccupancyPercent=45 | G1 内部并行循环启动的设置值,表示老年代占用的空间 GC 收集后需要低于 45% 的占用率,默认为 Java Heap 的 45%,这个值主要是为了决定在什么时间启动老年代的并行回收循环,这个循环从初始化并行回收开始,可以避免 full GC 的发生 | |
-XX:G1MixedGCCountTarget=8 | 设置并行循环之后需要有多少个混合 GC 启动,默认值是 8 个 | |
-XX:G1HeapWastePercent=10 | G1 不会回收的内存大小,默认是堆大小的 5% | |
-XX:G1ConfidencePercent=50 | ||
-XX:MaxGCPauseMills=500 | G1 停止执行的一个目标值,单位毫秒,默认200,这个值不一定真的会达到。这个参数会通过控制年轻代的大小来实现目标 |