[TOC]
附录
¶JVM大图
¶JVM参数
在jvm中有很多的参数可以进行设置,这样可以让JVM在各种环境中都能够高效的运行。绝大部分的参数保持默认即可。
¶参数类型
JVM的参数类型分为三类,分别是:
-
前缀标准参数,如-help
、-version
-X
前缀参数 (非标准参数),如:-Xint
、-Xcomp
-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