JVM 附录

[TOC]

附录

JVM大图

Java-jvm

JVM参数

在jvm中有很多的参数可以进行设置,这样可以让JVM在各种环境中都能够高效的运行。绝大部分的参数保持默认即可。

参数类型

JVM的参数类型分为三类,分别是:

  1. -前缀标准参数,如-help-version
  2. -X前缀参数 (非标准参数),如: -Xint-Xcomp
  3. -XX:前缀参数(使用率较高),如:-XX:newSize -XX:+UseSerialGC

标准参数

jvm的标准参数,一般都是很稳定的,在未来的JVM版本中不会改变,可以使用java -help检索出所有的标准参数。

zhonghongpeng@bogon classes % java -help                             
用法: java [-options] class [args...]
           (执行类)
   或  java [-options] -jar jarfile [args...]
           (执行 jar 文件)
其中选项包括:
    -d32          使用 32 位数据模型 (如果可用)
    -d64          使用 64 位数据模型 (如果可用)
    -server       选择 "server" VM
                  默认 VM 是 server,
                  因为您是在服务器类计算机上运行。


    -cp <目录和 zip/jar 文件的类搜索路径>
    -classpath <目录和 zip/jar 文件的类搜索路径>
                  用 : 分隔的目录, JAR 档案
                  和 ZIP 档案列表, 用于搜索类文件。
    -D<名称>=<值>
                  设置系统属性
    -verbose:[class|gc|jni]
                  启用详细输出
    -version      输出产品版本并退出
    -version:<值>
                  警告: 此功能已过时, 将在
                  未来发行版中删除。
                  需要指定的版本才能运行
    -showversion  输出产品版本并继续
    -jre-restrict-search | -no-jre-restrict-search
                  警告: 此功能已过时, 将在
                  未来发行版中删除。
                  在版本搜索中包括/排除用户专用 JRE
    -? -help      输出此帮助消息
    -X            输出非标准选项的帮助
    -ea[:...|:]
    -enableassertions[:...|:]
                  按指定的粒度启用断言
    -da[:...|:]
    -disableassertions[:...|:]
                  禁用具有指定粒度的断言
    -esa | -enablesystemassertions
                  启用系统断言
    -dsa | -disablesystemassertions
                  禁用系统断言
    -agentlib:[=<选项>]
                  加载本机代理库 , 例如 -agentlib:hprof
                  另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help
    -agentpath:[=<选项>]
                  按完整路径名加载本机代理库
    -javaagent:[=<选项>]
                  加载 Java 编程语言代理, 请参阅 java.lang.instrument
    -splash:
                  使用指定的图像显示启动屏幕
有关详细信息, 请参阅 http://www.oracle.com/technetwork/java/javase/documentation/index.html。

-X参数

JVM的-X参数是非标准参数,在不同版本的JVM中,参数可能会有所不同,可以通过java -X查看非标准参数。

zhonghongpeng@bogon classes % java -X                                
    -Xmixed           混合模式执行 (默认)
    -Xint             仅解释模式执行
    -Xbootclasspath:<用 : 分隔的目录和 zip/jar 文件>
                      设置搜索路径以引导类和资源
    -Xbootclasspath/a:<用 : 分隔的目录和 zip/jar 文件>
                      附加在引导类路径末尾
    -Xbootclasspath/p:<用 : 分隔的目录和 zip/jar 文件>
                      置于引导类路径之前
    -Xdiag            显示附加诊断消息
    -Xnoclassgc       禁用类垃圾收集
    -Xincgc           启用增量垃圾收集
    -Xloggc:    将 GC 状态记录在文件中 (带时间戳)
    -Xbatch           禁用后台编译
    -Xms        设置初始 Java 堆大小
    -Xmx        设置最大 Java 堆大小
    -Xss        设置 Java 线程堆栈大小
    -Xprof            输出 cpu 配置文件数据
    -Xfuture          启用最严格的检查, 预期将来的默认值
    -Xrs              减少 Java/VM 对操作系统信号的使用 (请参阅文档)
    -Xcheck:jni       对 JNI 函数执行其他检查
    -Xshare:off       不尝试使用共享类数据
    -Xshare:auto      在可能的情况下使用共享类数据 (默认)
    -Xshare:on        要求使用共享类数据, 否则将失败。
    -XshowSettings    显示所有设置并继续
    -XshowSettings:all
                      显示所有设置并继续
    -XshowSettings:vm 显示所有与 vm 相关的设置并继续
    -XshowSettings:properties
                      显示所有属性设置并继续
    -XshowSettings:locale
                      显示所有与区域设置相关的设置并继续

-X 选项是非标准选项, 如有更改, 恕不另行通知。


以下选项为 Mac OS X 特定的选项:
    -XstartOnFirstThread
                      在第一个 (AppKit) 线程上运行 main() 方法
    -Xdock:name=<应用程序名称>"
                      覆盖停靠栏中显示的默认应用程序名称
    -Xdock:icon=<图标文件的路径>
                      覆盖停靠栏中显示的默认图标

-XX参数

-XX参数也是非标准参数,主要用于JVM的调优和debug操作。

-XX参数的使用有2种方式,一种是boolean类型,一种是非boolean类型:

  • boolean类型
    • 格式:-XX:[+-]
    • 如:-XX:+DisableExplicitGC表示禁用手动调用gc操作,也就是说调用System.gc()无效
  • 非boolean类型
    • 格式:-XX:
    • 如:-XX:NewRatio=1 表示新生代和老年代的比值

常用参数参考附录

指定虚拟机以解释模式运行
-Xint
指定虚拟机以编译模式运行
-Xcomp
解释+编译模式运行,默认
-Xmixed

设置系统属性
-D<名称>=<值>

以服务器模式运行
-server
以客户端模式运行
-client

设置栈空间大小
-Xss128k

自旋锁升级前最大次数
-XX:PreBlockSpin

自旋锁开关
-XX:-UseBiasedLocking=false

jvm 启动自旋锁立即激活
-XX:BiasedLockingStartupDelay=0

-XX:MaxMetaspaceSize:设置元空间最大值,默认是-1,即不限制,或者说只受限于本地内存大小。

-XX:MetaspaceSize:指定元空间的初始空间大小,以字节为单位,达到该值就会触发垃圾收集进行类型卸载,同时收集器会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过-XX:MaxMetaspaceSize(如果设置了的话)的情况下,适当提高该值。

-XX:MinMetaspaceFreeRatio:作用是在垃圾收集之后控制最小的元空间剩余容量的百分比,可减少因为元空间不足导致的垃圾收集的频率。类似的还有-XX:Max-MetaspaceFreeRatio,用于控制最大的元空间剩余容量的百分比。

-Xnoclassgc参数进行控制是否允许对方法区内方法信息进行垃圾回收,还可以使用-verbose:class以及-XX:+TraceClass-Loading、-XX:+TraceClassUnLoading查看类加载和卸载信息,其中-verbose:class和-XX:+TraceClassLoading可以在Product版的虚拟机中使用,-XX:+TraceClassUnLoading参数需要FastDebug版的虚拟机支持。

显式开启逃逸分析
-XX:+DoEscapeAnalysis
查看逃逸分析的筛选结果
-XX:+PrintEscapeAnalysis
是否开启栈上分配
-XX:+/-UseTLAB
开启同步省略
-XX:+EliminateLocks
开启标量替换
-XX:+EliminateAllocations
查看替换情况
-XX:+PrintEliminateAllocations
代码执行次数会被JIT优化编译
-XX:CompileThreshold = 10000 
计算因子
-XX:OnStackReplacePercentage = 140
-XX:InterpreterProfilePercentage = 33
客户端下某段循环体中的代码循环次数会被JIT优化编译(回边计数器阈值) = CompileThreshold * OnStackReplacePercentage / 100
服务端下某段循环体中的代码循环次数会被JIT优化编译(回边计数器阈值) = (CompileThreshold * (OnStackReplacePercentage - InterpreterProfilePercentage)) / 100 = 10700
关闭JIT代码运行计数器热度衰减
-XX:-UseCounterDecay
参数设置半衰周期的时间(代码空闲多少秒进行半衰),单位是秒
-XX:CounterHalfLife=
禁止后台线程编译,执行线程阻塞等待编译结果,得到结果后再执行编译得到的本地代码
-XX:-BackgroundCompilation

打印所有的参数默认初始值
-XX:+PrintFlagsInitial
打印所有的参数的实际值,输出赋值操作符有=或:=,分别代表默认值和被修改的值。
-XX:+PrintFlagsFinal
# 在JVM运行期间查看设置参数步骤:
# 1. jps:查看当前运行中的进程id
# 2. jinfo -flag SurvivorRatio 进程id:查看具体JVM进程的指定参数值

初始化堆空间内存(默认为物理内存的1/64)
-Xms128m
最大堆空间内存(默认为物理内存的1/4)
-Xmx128m
设置新生代大小(初始值及最大值)
-Xmn128m
配置新生代与老年代在堆结构的占比
-XX:NewRatio=3
设置新生代中Eden和S0/S1空间的比例
-XX:SurvivorRatio=4
设置新生代垃圾的最大年龄
-XX:MaxTenuringThreshold=15
设置多大的对象直接进入老年代,默认值为0,代表不管多大都是先在Eden中分配内存
-XX:PretenureSizeThreshold=0
输出详细的GC处理日志
-XX:+PrintGCDetails
打印GC简要信息
-XX:+PrintGC、-verbose:gc
设置是否空间分配担保
-XX:HandlePromotionFailure

在退出的时候打印StringTable的信息
-XX:+PrintStringTableStatistics

# 开启G1 string去重,默认是不开启的,需要手动开启。
-XX:+/-UseStringDeduplication
# 打印详细的去重统计信息
-XX:+/-PrintStringDeduplicationStatistics
# 达到这个年龄的 string对象被认为是去重的候选对象
-XX:StringDeduplicationAgeThreshold=

# 开启先检查记忆集卡表是否已经变脏然后再更新卡表
-XX:+UseCondCardMark

# 开启指针压缩。ZGC不可用
-XX: +UseCompressedOops

# 解锁诊断性质的VM参数、打印汇编代码
-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly
 
# 出现 OOME 时生成堆 dump:
-XX:+HeapDumpOnOutOfMemoryError
# 生成堆文件地址: 
-XX:HeapDumpPath=/home/hadoop/dump/
# 使用[Ctrl]+[Break]键让虚拟机生成堆转储快照文件
-XX:+HeapDumpOnCtrlBreak

# 查看安全点日志
-XX:+PrintSafepointStatistics
-XX:PrintSafepointStatisticsCount=1
# 让虚拟机在等到线程进入安全点的时间超过2000毫秒时就认定为超时,这样就会输出迟迟无法进入安全点的线程名称
-XX: +SafepointTimeout
-XX:SafepointTimeoutDelay=2000

# 关闭类加载的链接过程中的验证阶段,这个阶段占据大部分时间
-Xverify:none

# JDK6开启分层编译
-XX:+TieredCompilation

JDK 9前后日志参数变化

JDK9前日志参数 JDK9后配置形式
G1PrintHeapRegions Xlog: gc+region=trace
G1PrintRegionLiveness Info Xlog: gc+liveness=trace
G1Summarize Concmark Xlog: gc+marking=trace
G1SummarizeRSetStats Xlog: gc+remset*=trace
GCLogFileSize, NumberOfGCLogFiles, UseGCLogFileRotation Xlog: gc*:file<file>::filecount=<count>,filesize=file size in kb>
PrintAdaptiveSizePolicy Xlog: gc+ergo*=trace
PrintClassHistogramAfterFullGC Xlog: classhisto*=trace
PrintClassHistogramBeforeFullGC Xlog: classhisto*=trace
PrintGCApplicationConcurrentTime Xlog: safepoint
PrintGCApplicationStoppedTime Xlog: safepoint
PrintGCDateStamps 使用time修饰器
PrintGCTaskTimeStamps Xlog: gc+task=trace
PrintGCtimeStamps 使用 uptime修饰器
PrintHeapAtGC Xlog: gc+heap=debug
PrintHeapAtGCExtended Xlog: gc+heap=trace
PrintJNIGCStalls Xlog: gc+jni=debug
PrintOldPLAB Xlog: gc+plab=trace
PrintParallelOldGCPhaseTimes Xlog: gc+phases=trace
PrintPLAB Xlog: gc+plab=trace
PrintPromotionFailure Xlog: gc+promotion=debug
PrintReferenceGC Xlog: gc+ref=debug
PrintStringDeduplicationStatistics Xlog: gc+stringdedup
PrintTaskqueue Xlog: gc+task+stats=trace
PrintTenuringDistribution Xlog: gc+age=trace
PrintTerminationStats Xlog: gc+task+stats=debug
PrintTLAB Xlog: gc+tlab=trace
TraceAdaptiveGCBoundary Xlog: heap+ergo=debug
TraceDynamicGCThreads Xlog: gc+task=trace
TraceMetadataHumongousAllocation Xlog: gc+metaspace+alloc=debug
G1TraceConcRefinement Xlog: gc+refine=debug
G1TraceEagerReclaimHumongousObjects Xlog: gc+humongous=debug
G1TraceStringSymbolTableScrubbing Xlog: gc+stringtable=trace

垃圾收集器相关参数

参数 描述
UseSerialGC 虚拟机运行在 Client模式下的默认值,打开此开关后.使用 Serial+ Serial Old的收集器组合进行内存回收
UseParNewGC 打开此开关后,使用 Pardew+ Serial Old的收集器组合进行内存回收,在JDK9后不再支持
UseConcMarkSweepGC 打开此开关后,使用 Pardew+CMS+ Serial Old的收集器组合进行内存 回收。Serial Old收集器将作为CMS收集器出现“Concurrent Mode Failure" 失败后的后备收集器使用
UseParallelGC JDK9之前虚拟机运行在 Server模式下的默认值,打开此开关后,使用Parallel Scavenge+ Serial Old( PS Marksweep)的收集器组合进行内存回收
UseParallelOldGC 打开此开关后,使用 Parallel Scavenge+ Parallel Old的收集器组合进行内存回收
SurvivorRatio 新生代中Eden区域与 Survivor区域的容量比值,.默认为8,代表Eden Survivor=8: 1
PretenureSizeThreshold 直接晋升到老年代的对象大小,设置这个参数后,大于这个参数的对象将直接在老年代分配
MaxTenuringThreshold 晋升到老年代的对象年龄。每个对象在坚持过一次 Minor GC之后,年龄就增加1,当超过这个参数值时就进入老年代
UseAdaptiveSizePolicy 动态调整Java堆中各个区域的大小以及进入老年代的年龄
HandlePromotionFailure 是否允许分配担保失败,即老年代的剩余空间不足以应付新生代的整个 Eden和 Survivor区的所有对象都存活的极端情况
ParallelGCThreads 设置并行GC时进行内存回收的线程数
GcTimeRatio GC时间占总时间的比率,默认值为99,即允许1%的GC时间。仅在使用 Parallel Scavenge收集器时生效
MaxGCPauseMillis 设置GC的最大停顿时间。仅在使用 Parallel Scavenge收集器时生效设置
CMSInitiatingOccupancyFraction 设置CMS收集器在老年代空间被使用多少后触发垃圾收集。默认值为 68%,仅在使用CMS收集器时生效
UseCMSCompactAtFullCollection 设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片整理。仅在使用CMS收集器时生效,此参数从JDK9开始废弃
CMSFullGCsBeforeCompaction 设置CMS收集器在进行若干次垃圾收集后再启动一次内存碎片整理。仅在使用CMS收集器时生效,此参数从JDK9开始废弃
UseG1GC 使用G1收集器,这个是JDK9后的 Server模式默认值
G1heapRegionsize=N 设置 Region大小,并非最终值
MaxGCPauseMillis 设置G1收集过程目标时间,默认值是200ms,不是硬性条件
G1NewSizePereent 新生代最小值,默认值是5%
G1MaxNewSizePercent 新生代最大值,默认值是60%
ParallelGCThreads 用户线程冻结期间并行执行的收集器线程数
ConcGCthreads=N 并发标记、并发整理的执行线程数,对不同的收集器,根据其能够并发的阶段,有不同的含义
InitiatingHeapOccupancyPercent 设置触发标记周期的Java堆占用率國值。默认值是45%。这里的java堆占比指的是 non young capacity bytes,包括 old+humongous
UseShenandoahGC 使用 Shenandoah 收集器。这个选项在 Oraclejdk中不被支持,只能在 OPENJDK12或者某些支持 Shenandoah的 Backport发行版本使用。目前仍然要配合-XX:+ UnlockExperimentalVMOptions
ShenandoahGCHeuristics 使用Shenandoah何时启动一次GC过程,其可选值有 adaptive、 static、 compact、 passive、 aggressive
UesZGC 使用ZGC收集器,目前仍然要配合-XX:+ UnlockExperimentalVMOptions使用
UseNUMA 启用NUMA内存分配支持,目前只有 Parallel和ZGC支持,以后G1收 集器可能也会支持该选项

官方网址

https://docs.oracle.com/en/java/javase/11/tools/java.html#GUID-3B1CE181-CD30-4178-9602-230B800D4FAE

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html


   转载规则


《JVM 附录》 阿钟 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录