JVM 性能调优——HotSpot VM 参数指南

基于 JDK 1.8 版本 HotSpot VM 参数指南。

JVM 参数共分为三类:

  • 标准参数(-),所有的 JVM 实现都必须实现这些参数的功能,而且向后兼容;
  • 非标准参数(-X),默认 JVM 实现这些参数的功能,但是并不保证所有 JVM 实现都满足,且不保证向后兼容;
  • 非 Stable 参数(-XX),此类参数各个 JVM 实现会有所不同,需要慎重使用。

1.JVM参数

表格中 JVM 参数中的所有具体数字仅供说明之用。

1.收集器参数

HotSpot VM 中垃圾收集器的可用组合:

Young GCOld GCJVM 参数说明
SerialSerial Old-XX:+UseSerialGC
Parallel ScavengeSerial Old-XX:+UseParallelGCJDK1.8 默认收集器
Parallel ScavengeParallel Old-XX:+UseParallelOldGC
ParNewSerial Old-XX:+UseParNewGC
SerialCMS-XX:-UseParNewGC -XX:+UseConcMarkSweepGC
ParNewCMS-XX:+UseParNewGC -XX:+UseConcMarkSweepGC
G1G1-XX:+UseG1GCJDK1.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=512mGC 日志文件最大的阈值
-XX:NumberOfGCLogFiles=5GC 日志文件数

更多日志记录的参数:

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=256mJVM 堆初始大小(新生代 + 老年代)建议配置
-Xmx2g 或者 -XX:MaxHeapSize=2gJVM 堆最大大小(新生代 + 老年代)建议配置
-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=2gJVM 堆外内存的最大大小

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=64kTLAB 最小大小

并行处理的参数:

JVM 参数说明建议
-XX:ConcGCThreads=2并发垃圾收集器使用的线程数量
-XX:ParallelGCThreads=20在进行并行GC的时候,可用于GC的线程数
-XX:+ParallelRefProcEnabled并行处理Reference,加快处理速度,缩短耗时
JVM 参数说明建议
-XX:+DisableExplicitGC禁止在运行期显式地调用System.gc(),默认启用
-XX:+ExplicitGCInvokesConcurrentSystem.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=45G1 内部并行循环启动的设置值,表示老年代占用的空间 GC 收集后需要低于 45% 的占用率,默认为 Java Heap 的 45%,这个值主要是为了决定在什么时间启动老年代的并行回收循环,这个循环从初始化并行回收开始,可以避免 full GC 的发生
-XX:G1MixedGCCountTarget=8设置并行循环之后需要有多少个混合 GC 启动,默认值是 8 个
-XX:G1HeapWastePercent=10G1 不会回收的内存大小,默认是堆大小的 5%
-XX:G1ConfidencePercent=50
-XX:MaxGCPauseMills=500G1 停止执行的一个目标值,单位毫秒,默认200,这个值不一定真的会达到。这个参数会通过控制年轻代的大小来实现目标
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值