JVM 参数

空间

通用

参数 常用 说明 备注
-Xms<size><unit> Heap 初始化的大小
-Xmx<size><unit> Heap 最大值
-Xmn<size><unit> 新生代的大小 G1 GC 下建议不设置该参数
-Xss<size><unit> 线程栈的大小,默认 1M
-XX:MaxDirectMemorySize=<size><unit> 设置 NIO 的直接缓存最大容量
-XX:SurvivorRatio=<size> Eden 和 Survior(from和to) 大小比例,默认是 8
-XX:AutoBoxCacheMax=<size> 设置自动装箱池缓存大小 server模式专有
-XX:+UseAdaptiveGCBoundary 动态化使用资源
-XX:+UseAdaptiveSizePolicy 动态调整各个代区的内存大小,每次 minor gc 后会重新计算 eden,from 和 to 的大小
-XX:NewSize=<size><unit> 设置新生代的初始大小
-XX:MaxNewSize=<size><unit> 设置新生代的最大值
-XX:NewRatio=<size> 设置新生代和老年代的比例
-Dsun.reflect.noInflation=<boolean> 反射时是否使用代理类 默认 false
-Dsun.reflect.inflationThreshold=<size> 反射时生成代理类调用的次数,之后使用 JNI 字节码调用 默认 15
-XX:MaxRAM=<size> 设置最大内存参数
-XX:MinRAMFraction=<size> 设置最大内存除数,默认为 4,即堆空间内 MaxRAM 的四分之一
-XX:ErgoHeapSizeLimit=<size> 限制堆内存上限

Java8之前

参数 常用 说明 备注
-XX:PermSize 方法区的初始化大小 java8 后废弃
-XX:MaxPermSize 方法区的最大值 java8 后废弃

Java8之后

参数 常用 说明 备注
-XX:MetaspaceSize=<size><unit> 元空间的初始化大小 java8 后新增
-XX:MaxMetaspaceSize=<size><unit> 元空间的最大值 java8 后新增,初始大小是 21M

Java9之后

参数 常用 说明 备注
-XX:G1HeapRegionSize=<size><unit> 设置每个区域块大小 1M-32M 之间,必须是2的幂
-XX:G1NewSizePercent=<size> 设置年轻代大小占堆的最小值百分比 默认值是 Java 堆的 5%
-XX:G1MaxNewSizePercent=<size> 设置年轻代大小占堆的最大值百分比 默认值是 Java 堆的 60%

性能

通用

参数 常用 说明 备注
-server 虚拟机会以 server 模式运行,该模式与 C2 编译器共同运行,更注重编译的质量,启动速度慢,但是运行效率高,适合用在服务器环境下,针对生产环境进行了优化
-XX:+AlwaysPreTouch JVM 启动时就会先访问所有分配给它的内存,让操作系统把内存真正的分配给JVM
-XX:+UseTLAB 通过快速对象分配模式在 TLAB(Thread-local allocation buffers)中进行分配对象 以避免大量的线程通信所导致的性能下降
-XX:TLABSize=<size> 设置 TLAB 的初始化大小
-XX:-ResizeTLAB 禁用自动调整 TLAB
-XX:+UseLargePages 使用最大值内存页 需要 Linux kernel >= 4.7
-XX:+UseTransparentHugePages 对大对象分配使用大内存页分配 需要 Linux kernel >= 4.7
-XX:+UseNUMA 对象分配优先使用 NUMA 本地内存
-XX:+PerfDisableSharedMem GC 日志指向 /dev/shm,避免 IO 造成的 JVM 停顿
-XX:-OmitStackTraceInFastThrow 强制要求 JVM 始终抛出含堆栈的异常
-XX:+ShowHiddenFrames 展示虚拟机隐藏的栈信息
-XX:ObjectAlignmentInBytes=<size> 设置 java 对象的内存对齐,默认是 8 字节,指定的值必须是 2 的幂次,且必须在 8 和 256 之间
-XX:+PageAlignDirectMemory 设置堆外内存使用内存对齐
-XX:+UseCompressedOops 在 64 位环境下,压缩对象头
-XX:+UseFastAccessorMethods 原始类型的快速优化
-XX:+UseFastEmptyMethods 空方法优化
-XX:+UseFastJNIAccessors 引用类或 int 的成员方法优化
-XX:LargePageSizeInBytes=<size><unit> Heap 中内存页的最大值,参数必须是 2 的幂,不可设置过大
-XX:-UseBiasedLocking 禁用偏向锁 在存在大量锁对象的创建并高度并发的环境下禁用偏向锁能够带来一定的性能优化
-XX:BiasedLockingStartupDelay=<size> 延迟(秒钟)启用偏向锁
-XXtlaSize:min=<size><unit>,preferred=<size><unit> 调整 TLA,每个线程私有的空间的默认最小大小和默认首选大小
-XX:+AlwaysAtomicAccesses 实现对所有 Access 的原子性保证
-XX:+EliminateAllocations 开启标量替换
-XX:+DoEscapeAnalysis 进行逃逸分析之后,创建的可分解的对象都将由栈上分配 标量替换,栈上分配,受限于栈的空间大小
-XX:+PrintEscapeAnalysis 查看逃逸分析结果
-XX:+EliminateLocks 分析并且消除无线程竞争下的锁 同步消除,必须开启 -XX:+DoEscapeAnalysis 和 -server 模式
-XX:+PrintEliminateAllocations 查看标量的替换情况
-XX:LiveNodeCountInliningCutoff=<size> max number of live nodes in a method
-XX:+PositiveIdentityHash 只允许分配正数的哈希值

JIT

参数 常用 说明 备注
-XX:+EnableJVMCI 使用 Graal java10
-XX:+UseJVMCICompiler 启动 Graal JIT编译器 java10
-XX:+TieredCompilation 启用分层编译策略,根据编译器编译、优化的规模与耗时,划分出不同的编译层次 java8 默认开启
-XX:TieredStopAtLevel=<size> 设置 JIT 编译的最高层级
-XX:+UseCodeCacheFlushing 当代码缓存被填满时让 JVM 放弃一些编译代码
-XX:InitialCodeCacheSize=<size> 设置初始代码缓存的大小
-XX:ReservedCodeCacheSize=<size><unit> 设置代码缓存的最大值
-XX:CompileThreshold=<size> 当某个方法被调用 + 循环次数累计超过该值时,触发标准的 JIT 编译
-XX:InterpreterBackwardBranchLimit=<size> 当某个方法被调用 + 循环次数累计超过该值时,触发 OSR 形式的 JIT 编译
-XX:HugeMethodLimit=<size> JIT 编译字节码大小超过 size 字节的方法就是巨型方法
-XX:+DontCompileHugeMethods 不编译巨型方法
-XX:-UseCounterDecay 禁止 JIT 调用计数器衰减
-XX:+CompileCommand=command,method[,option] 定制编译需求,比如过滤某个方法不做 JIT 编译
-XX:+InlineSynchronizedMethods 对同步方法进行内联
-XX:MaxInlineLevel=<size> 在进行方法内联前,方法的最多嵌套调用次数 默认为 9
-XX:MaxInlineSize=<size> 内联方法的最大字节码大小 默认为 35
-XX:FreqInlineSize=<size> 内联 频繁执行 的方法的最大字节码大小 默认为 325
-XX:MaxTrivialSize=<size> 归属于不重要的方法的最大字节码大小 默认为 6
-XX:MinInliningThreshold=<size> 方法被内联的最小调用次数 默认为 250
-XX:MaxRecursiveInlineLevel=<size> 对方法的递归调用做内联优化 默认为 1
-XX:Tier1MaxInlineSize=<size> 1层内联方法的最大字节码大小 默认为 8
-XX:Tier1FreqInlineSize=<size> 1层内联 频繁执行 的方法的最大字节码大小 默认为 35
-XX:LiveNodeCountInliningCutoff=<size> 方法内最大存活的 JIT IR 节点数量 默认为 20000

Docker

参数 常用 说明 备注
-XX:ActiveProcessorCount=<size> 指定 jvm 使用 cpu 个数
-XX:+UseContainerSupport 支持容器化功能,默认开启
-XX:+UseCGroupMemoryLimitForHeap 开启 CGroup Namespace jdk10 后废弃

GC

通用

参数 常用 说明 备注
-XX:+UseCompressedClassPointers 开启压缩类指针 64 位平台上默认打开
-XX:+UseParNewGC 设置年轻代为多线程收集 可以和 CMS GC 一起使用
-XX:+ParallelRefProcEnabled 并行的处理对象标记过程
-XX:ParallelGCThreads=<size> 指定并行处理 GC 的线程数 默认 GC 线程数为 CPU 的数量
-XX:ParGCCardsPerStrideChunk=<size> 设置每个线程每次扫描的 Card 数量 CardTable 用来标记老年代的某一块内存区域中的对象是否持有新生代对象的引用,卡表的数量取决于老年代的大小和每张卡对应的内存大小
-XX:MinHeapFreeRatio=<size> 指定堆内存在使用率以下进行收缩
-XX:+DisableExplicitGC 禁止代码中显示调用 GC CMS 下可使用 -XX:+ExplicitGCInvokesConcurrent 替换
-XX:+GCLockerInvokesConcurrent 并发的执行 GC Lock
-XX:ConcGCThreads=<size> 设置并行GC的线程数 设置为并行垃圾回收线程数 (ParallelGCThreads) 的 1/4 左右
-XX:MaxTenuringThreshold=<size> 设置新生代经过多少次YGC晋升到老生代
-XX:PretenureSizeThreshold=<size> 晋升老年代对象年龄 无默认值,Paralle Scavenge收集器无法识别
-XX:CompressedClassSpaceSize=<size><unit> 设置指针压缩空间大小
-XX:+OptimizeStringConcat 字符串concat优化 默认开启
-XX:+UseParallelGC 选择垃圾收集器为并行收集器 不能和 CMS GC 一起使用,系统吨吐量优先
-XX:GCTimeRatio=<size> 设置吞吐量大小
-XX:SoftRefLRUPolicyMSPerMB=<size> 设置每兆空间中软引用的生命周期 (多少毫秒后清除)
-Xnoclassgc 不对 Class 元数据进行 GC

CMS

参数 常用 说明 备注
-XX:+UseConcMarkSweepGC 启用 CMS 低停顿垃圾收集器
-XX:+CMSParallelRemarkEnabled 开启并行标记
-XX:+ExplicitGCInvokesConcurrent 命令JVM无论什么时候调用系统 GC,都执行 CMS GC,而不是 Full GC
-XX:+ExplicitGCInvokesConcurrent
AndUnloadsClasses
保证当有系统 GC 调用时,永久代也被包括进 CMS 垃圾回收的范围内
-XX:+CMSConcurrentMTEnabled 并发的 CMS 阶段将以多线程执行 默认开启
-XX:+CMSParallelInitialMarkEnabled 开启初始标记过程中的并行化
-XX:ParallelCMSThreads=<size> 设定 CMS 的线程数量
-XX:CMSInitiatingOccupancyFraction=<size> 指定 CMS 老年代在对内存占用率达到多少百分比的时候开始GC
-XX:CMSInitiatingPermOccupancyFraction=<size> 指定 CMS 永久代在对内存占用率达到多少百分比的时候开始GC
-XX:+UseCMSInitiatingOccupancyOnly 只使用 CMSInitiatingOccupancyFraction 设置的回收阈值,否则交由 JVM 动态调整
-XX:CMSTriggerRatio 当 CMSInitiatingOccupancyFraction 错误时的生成策略
-XX:+CMSScavengeBeforeRemark 重新标记之前对年轻代做一次 Minor GC
-XX:+CMSClassUnloadingEnabled CMS GC 时对永久代进行垃圾回收(类卸载) 在 Full GC 时会扫描 MetaSpace/PermGen
-XX:CMSFullGCsBeforeCompaction=<size> 指定进行多少次Full GC之后,执行内存空间整理
-XX:UseCMSCompactAtFullCollection 在 Full GC 的时候,对年老代的压缩 可能会影响性能,但是可以消除碎片

G1

参数 常用 说明 备注
-XX:+UseG1GC 使用G1垃圾回收器
-XX:InitiatingHeapOccupancyPercent=<size> 设置触发并发标记周期时的堆内存占用率阈值. G1之类的垃圾收集器用它来触发并发GC周期,基于整个堆的使用率,而不只是某一代内存的使用比 值为 0 则表示一直执行 GC 循环,默认值为 45
-XX:+G1UseAdaptiveIHOP 开启自适应并发标记控制
-XX:G1ConcRefinementThreads=<size> 设置 Remenbered Set 的工作线程数目
-XX:MaxGCPauseMillis=<size> 设置每次年轻代垃圾回收的最长时间
-XX:+UseStringDeduplication 使用字符串去重机制 G1 收集器下生效
-XX:G1MixedGCLiveThresholdPercent=<size> 设置启动混合垃圾回收周期的老年代占用率阈值 默认占用率为 65%
-XX:G1HeapWastePercent=<size> 设置允许浪费的堆百分比,如果触发回收百分比小于该百分比,JVM 则不会启动混合垃圾回收周期 默认值是 10%
-XX:G1MixedGCCountTarget=<size> 设置标记周期完成后,执行混合垃圾回收老年代的目标次数 默认值是 8
-XX:G1OldCSetRegionThresholdPercent=<size> 设置混合垃圾回收期间要回收的最大旧区域数 默认值是 Java 堆的 10%
-XX:G1ReservePercent=<size> 设置作为预留存活区在 heap 中的百分比 默认值是 10%
-XX:+G1SummarizeConcMark
-XX:+G1PrintHeapRegions 打印 G1 收集器收集的区域
-XX:+G1SummarizeRSetStats 打印标记过程引用信息(Print RSet processing information)
-XX:G1SummarizeRSetStatsPeriod=<size> 指定 GC 周期频率报告
-XX:-G1EagerReclaimHumongousObjects 禁用 G1 优先尝试回收大对象
-XX:+G1TraceEagerReclaimHumongousObjects G1 在每个 Young GG 周期都会回收消亡的 Humongous 对象 默认开启
-XX:+G1ConcRegionFreeingVerbose Debug JVM

ZGC

参数 常用 说明 备注
-XX:+UseZGC 启动 ZGC 垃圾回收器 java11,非正式版本需开启 -XX:+UnlockExperimentalVMOptions 解锁参数

https://wiki.openjdk.java.net/display/zgc/Main

Shenandoah GC

参数 常用 说明 备注
-XX:+UseShenandoahGC 启动 Shenandoah 垃圾回收器 jdk12,非正式版本需开启 -XX:+UnlockExperimentalVMOptions 解锁参数
-XX:ShenandoahInitFreeThreshold=<size> 设置触发垃圾回收的初始阈值
-XX:ShenandoahMinFreeThreshold=<size> 无条件触发垃圾回收的最小空间阀值
-XX:ShenandoahAllocSpikeFactor=<size> 设置预留堆空间百分比
-XX:ShenandoahGarbageThreshold=<size> 设置一个 Region 被视为 可回收 的垃圾对象所需百分比
-XX:ShenandoahFreeThreshold=<size> 设置启动垃圾回收的空闲堆空间百分比
-XX:ShenandoahAllocationThreshold=<size> 设置上一次垃圾回收周期的分配内存百分比
-XX:+ShenandoahPacing 根据垃圾回收效率分配应用程序的线程与可用空间
-XX:ShenandoahPacingMaxDelay=<size><unit> 在最大延迟时间之前,将不干预应用程序的分配
-XX:+ShenandoahDegeneratedGC 当程序遇到分配失败时,Shenandoah 将会暂停应用线程,直到完成后续垃圾回收工作
-XX:+ShenandoahVerify 检测垃圾回收异常
-XX:+ShenandoahGCHeuristics=[ passive | aggressive ] 暂停应用线程执行垃圾回收 或 执行紧凑的垃圾回收并疏散所有非空 Region
-XX:+ShenandoahVerifyOptoBarriers 验证 C2 模式

https://wiki.openjdk.java.net/display/shenandoah/Main

日志

Java9之后

jvm日志使用 -Xlog[<what>][:[<output>][:[<decorators>][:<output-options>]]] 记录 可以使用 java -Xlog:help 查看帮助文档

  • 案例

-Xlog:disable -Xlog:gc+liveness=info,rt*=off:file=../logs/gc_%t.log:time,uptimemillis,pid:filecount=5,filesize=1024 先关闭所有日志,打开 gc 和存活对象的日志,关闭包含 rt 的日志级别,输出日志至文件,额外包含时间、耗时、进程 id,以 5 个 1M 的文件循环保存历史日志文件。

参考: http://www.cnblogs.com/IcanFixIt/p/7259712.html https://juejin.im/post/5a981f056fb9a028bf04bec4 https://blog.gceasy.io/2017/10/17/43-gc-logging-flags-removed-in-java-9/

通用

参数 常用 说明 备注
-Xloggc=<file> 日志文件 例如 -Xloggc=/data/application/logs/gc.log
-XX:+verbosegc 打印每次GC的消息
-XX:+PrintGC 打印每次GC的消息
-XX:+PrintGCCause 打印 GC 的原因
-XX:+PrintGCDetails 打印GC日志详情 建议开启
-XX:+PrintGCTimeStamps 输出GC的时间戳 以基准时间的形式
-XX:+PrintGCDateStamps 输出GC的时间戳 以日期的形式,如 2013-05-04T21:53:59.234+0800
-XX:ErrorFile=<file> 当 JVM 出现致命错误时,生成错误文件,包括了导致 jvm crash 的重要信息
-XX:+PrintGCApplicationStoppedTime 打印 JVM 的停顿时间
-XX:+PrintGCApplicationConcurrentTime 打印 JVM 在两次停顿之间的正常运行时间
-XX:+HeapDumpOnOutOfMemoryError 遇到 OutOfMemoryError 时拍摄一个堆转储快照,并将其保存在一个文件中。
-XX:+HeapDumpBeforeFullGC 遇到 Full GC 前拍摄一个堆转储快照,并将其保存在一个文件中。
-XX:+HeapDumpAfterFullGC 遇到 Full GC 后拍摄一个堆转储快照,并将其保存在一个文件中。
-XX:HeapDumpPath=<file> 指定导出堆的存放路径
-XX:-OmitStackTraceInFastThrow 要求 JVM 始终抛出含堆栈的异常
-XX:+UseGCLogFileRotation 开启日志文件的循环
-XX:NumberOfGCLogfiles=<size> 配置日志循环文件个数
-XX:GCLogfileSize=<size><unit> 指定日志文件大小
-XX:NativeMemoryTracking=[off | summary | detail] 查看 JVM 本地方法使用情况

jcmd VM.native_memory [summary &##124; detail &##124; baseline &##124; summary.diff &##124; detail.diff &##124; shutdown] [scale= KB &##124; MB &##124; GB]

-XX:+PrintNMTStatistics 在 JVM 退出时打印 NMT 报告
-verbose:class 在程序运行的时候有多少类被加载 verbose:class 来监视 java -verbose:class
-verbose:gc 在虚拟机发生内存回收时在输出设备显示信息
-verbose:jni 输出 native 方法调用的相关情况
-XX:+PrintHeapAtGC 在进行 GC 的前后打印出堆的信息
-XX:+PrintFlagsInitial 显示所有可设置参数及默认值
-XX:+PrintFlagsFinal 显示可以获取到所有设置后参数及值
-XX:+UnlockDiagnosticVMOptions 解锁对 JVM 进行诊断的选项参数
-XX:+PrintCommandLineFlags 显示出 JVM 初始化完毕后所有跟最初的默认值不同的参数及它们的值
-XX:+PrintTenuringDistribution 打印内存模型各代信息
-XX:+DisplayVMOutput 打印 JVM 输出
-XX:+LogVMOutput 记录 JVM 输出到日志
-XX:+PrintJNIGCStalls 打印进入临界区 (JVM 传向 JNI) 的线程信息
-XX:+PrintFLSStatistics=<size> GC 前后输出内存的统计信息 size > 1 时还会输出 IndexedFreeLists 统计信息
-XX:+PrintSafepointStatistics 输出 safepoint 的统计信息
-XX:+PrintSafepointStatisticsCount=<size> 输出 safepoint 的统计次数
-XX:+PrintAdaptiveSizePolicy 打印自适应收集的大小
-XX:+PrintReferenceGC 跟踪系统内的软引用,弱引用,虚引用和 finallize 队列
-XX:+PrintClassHistogram 打印出实例的数量以及空间大小

JIT

参数 常用 说明 备注
-XX:+PrintInlining 打印内联优化的方法
-XX:+PrintCompilation 简单的输出一些关于从字节码转化成本地代码的编译过程
-XX:+LogCompilation 输出 JIT 的编译信息
-XX:+PrintAssembly 通过使用外部的 disassembler.so 库打印汇编的字节码和 native 方法来辅助分析 需要和-XX:UnlockDiagnosticVMOptions一起使用
-XX:+TraceClassLoading 动态跟踪类的加载
-XX:+TraceClassUnloading 动态跟踪类的卸载
-XX:+PrintInterpreter 打印解释过程中生成的汇编指令 exclude,跳过编译指定的方法; compileonly,只编译指定的方法; inline/dontinline,设置是否内联指定方法; print,打印生成的汇编代码
-XX:+PrintAssembly 打印JIT编译过程中生成的汇编指令 无法使用该参数可以用 -XX:+PrintOptoAssembly 来代替

G1

参数 常用 说明 备注
-XX:G1LogLevel=fine, finer, finest 日志包含信息以及每个工作线程的信息
-XX:+PrintStringDeduplicationStatistics 打印字符串去重的影响

其他

参数 常用 说明 备注
-Dcom.sun.management.jmxremote=<boolean> 是否支持远程 JMX 监控
-Dcom.sun.management.jmxremote.port=<port> 指定远程监控端口号,随机分配 RMI 端口号
-Dcom.sun.management.jmxremote.ssl=<boolean> 是否对连接开启 SSL 加密
-Dcom.sun.management.jmxremote.authenticate=<boolean> 是否需要开启用户认证
-Dcom.sun.management.jmxremote.rmi.port=<port> 指定 RMI 与远程监控端口号
-Djava.rmi.server.hostname=<host> 指定 RMI 服务的对应主机名
-Djava.net.preferIPv4Stack=true 优先使用 IPv4
-Djava.security.egd=file:/dev/./urandom 使用非阻塞的随机数与熵池策略
-Djava.util.concurrent.ForkJoinPool.common.parallelism=<size> 修改 ForkJoinPool 的默认线程数
-XX:+UnlockExperimentalVMOptions 解锁 JVM 实验性参数
-XX:+UnlockCommercialFeatures 解锁 JVM 商业特性
-XX:+LogCommercialFeatures 对商业特性进行日志记录
-XX:+FlightRecorder 开启 JFR 监控
-XX:FlightRecorderOptions=<parameter>=<value> 设置 JFR 监控参数
-XX:OnError=command 设置当发生不可恢复的错误时执行的命令
-XX:OnOutOfMemoryError=command 设置当发生内存溢出错误时执行的命令
-XX:+AggressiveOpts 使用预设的优化參數
-Djava.awt.headless=true 使用计算能力模拟外设功能 例如创建图片