本文主要是介绍HotSpot 虚拟机主要参数列表及启动参数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
官方 vmoptions
1. 参数使用方式
- -XX:+<option> 开启 option 参数
- -XX:-<option> 关闭 option 参数
- -XX:<option>=<value> 将option参数的值设置为 value
2. 虚拟机参数介绍
2.1. 内存管理参数
参数 | 默认值 | 使用介绍 |
---|---|---|
DisableExplicitGC | 默认关闭 | 忽略来自 System.gc() 方法触发的垃圾收集 |
ExplicitGCInvokesConcurrent | 默认关闭 | 当收到 System.gc() 方法提交的垃圾收集申请时, 使用 CMS 收集器进行收集 |
UseSerialGC | Client 模式的虚拟默认开启, 其他模式关闭 | 虚拟机运行在 Client 模式下的默认值, 打开此开关后, 使用 Serial+Serial Old 的收集器组合进行内存回收 |
UseParNewGC | 默认关闭 | 打开此开关后, 使用 ParNew+Serial Old 的收集器组合进行内存回收 |
UseConcMarkSweepGC | 默认关闭 | 打开此开关后, 使用 parNew+CMS+Serial Old的收集器组合进行内存回收。 如果 CMS 收集器出现 Concurrent Mode Failure, 则 Serial Old 收集器将作为后备收集器 |
UseParallelGC | Server 模式的虚拟机默认开启, 其他模式关闭 | 虚拟机运行在 Server 模式下的默认值, 打开此开关后, 使用 Parallel Scavenge + Serial Old 的收集器组合进行内存回收 |
UseParallelOldGC | 默认关闭 | 打开此开关后, 使用 Parallel Scavenge + Parallel Old 的收集器组合进行内存回收 |
SurvivorRatio | 默认为8 | 新生代中 Eden 区域和 Survivor 区域的容量比值 |
PretenureSizeThreshold | 无默认值 | 直接晋升到老年代的对象大小, 设置这个参数后, 大于这个参数的对象将直接在老年代分配 |
MaxTenuringThreshold | 默认值为15 | 晋升到老年代的对象年龄。 每个对象在坚持过一次 Minor GC 后, 年龄就增加1, 当超过这个参数值时就进入老年代 |
UseAdaptiveSizePolicy | 默认开启 | 动态调整 Java 堆中各个区域的大小及进入老年代的年龄 |
HandlePromotionFailure | JDK1.5及之前版本默认关闭, JDK1.6默认开启 | 是否允许分配担保失败, 即老年代的剩余空间不足以应付新生代的整个 Eden 和 Survivor 区的所有对象都存活的极端情况 |
ParallelGCThreads | 小等于8个CPU时默认值为CPU的数量值, 大于8个时比CPU数量值小 | 设置并行GC 时进行内存回收的线程数 |
GCTimeRatio | 默认值为99 | GC 时间占总时间的比率, 默认为99, 即允许 1% 的GC时间, 仅在使用 Parallel Scavenge 收集器时生效 |
MaxGCPauseMillis | 无默认值 | 设置 GC 的最大停顿时间, 仅在使用 Parallel Scanvenge 收集器时生效 |
CMSInitiatingOccupancyFraction | 默认值为68 | 设置 CMS 收集器在老年代空间被使用多少后触发垃圾收集, 仅在使用 CMS 收集器时生效 |
UseCMSCompactAtFullCollection | 默认开启 | 设置 CMS 收集器在完成垃圾收集后是否要进行一次内存碎片整理, 仅在使用 CMS 收集器时生效 |
CMSFullGCsBeforeCompaction | 无默认值 | 设置 CMS 在进行若干次垃圾收集后再启动一次内存碎片整理。 仅在使用 CMS 收集器时生效 |
ScavengeBeforeFullGC | 默认开启 | 在 Full GC 发生之前触发一次 Minor GC |
UseGCOverheadLimit | 默认开启 | 禁止 GC 过程无限制的执行, 如果过于频繁, 就直接抛出 OOM 异常 |
UseTLAB | Server 模式默认开启 | 优先在本地线程缓冲区中分配对象, 避免分配内存时的锁定过程 |
MaxHeapFreeRatio | 默认值为70 | 当 Xmx 值比 Xms 值大时, 堆可以动态收缩和扩展, 这个参数控制当堆空闲大于指定比率时自动收缩 |
MinHeapFreeRatio | 默认值为40 | 当 Xmx 值比 Xms 值大时, 堆可以动态收缩和扩展, 这个参数控制当堆空闲大于指定比率时自动扩展 |
MaxPermSize | 大部分情况下默认值为64M | 永久代的最大值 |
2.2. 调试参数
参数 | 默认值 | 使用介绍 |
---|---|---|
HeapDumpOnOutMemoryError | 默认关闭 | 在发生内存溢出异常时是否生成堆转储快照,关闭则不生成 |
OnOutOfMemoryError | 无默认值 | 当虚拟机抛出内存溢出异常时, 执行指定的指令 |
OnError | 无默认值 | 当虚拟机抛出 ERROR 异常时, 执行指定的指令 |
PrintClassHistogram | 默认关闭 | 使用 [ctrl]-[break] 快捷键输出类统计状态, 相当于 jmap -histo 的功能 |
PrintConcurrentLocks | 默认关闭 | 打印 J.U.C 中锁的状态 |
PrintCommandLineFlags | 默认关闭 | 打印启动虚拟机时输入的非稳定参数 |
PrintCompilation | 默认关闭 | 打印方法即时编译信息 |
PrintGC | 默认关闭 | 打印 GC 信息 |
PrintGCDetails | 默认关闭 | 打印 GC 详细信息 |
PrintGCTimeStamps | 默认关闭 | 打印 GC 停顿耗时 |
PrintTenuringDistribution | 默认关闭 | 打印 GC 后新生代各个年龄对象的大小 |
TraceClassLoading | 默认关闭 | 打印类加载信息 |
TraceClassUnloading | 默认关闭 | 打印类卸载信息 |
PrintInlining | 默认关闭 | 打印方法的内联信息 |
PrintCFGToFile | 默认关闭 | 将 CFG 图信息输出到文件, 只有 DEBUG 版虚拟机才支持此参数 |
PrintIdealGraphFile | 默认关闭 | 将 Ideal 图信息输出到文件, 只有 DEBUG 版虚拟机才支持此参数 |
UnlockDiagnosticVMOptions | 默认关闭 | 让虚拟机进入诊断模式, 一些参数(如 PrintAssembly) 需要在诊断模式中才能使用 |
PrintAssembly | 默认关闭 | 打印即时编译后的二进制信息 |
2.3. 性能参数
参数 | 默认值 | 使用介绍 |
---|---|---|
AggressiveOpts | JDK1.6 默认开启, JDK1.5 默认关闭 | 使用激进的优化特性, 这些特性一般是具备正面和负面双重影响的, 需要根据具体应用特点分析才能判定是否对性能有好处 |
UseLargePages | 默认开启 | 如果可能, 使用大内存分页, 这项特性需要操作系统的支持 |
LargePageSizeInBytes | 默认为4M | 使用指定大小的内存分页, 这项特性需要操作系统的支持 |
StringCache | 默认开启 | 是否使用字符串缓存, 开启则使用 |
2.4. 类型加载参数
参数 | 默认值 | 使用介绍 |
---|---|---|
UseSplitVerifier | 默认开启 | 使用依赖 StackMapTable 信息的类型检查代替数据流分析, 以加快字节码校验速度 |
FailOverToOldVerifier | 默认开启 | 当类型校验失败时, 是否允许回到老的类型推导校验方式进行校验, 如果开启则允许 |
RelaxAccessControlCheck | 默认关闭 | 在校验阶段放松对类型访问性的限制 |
2.5. 多线程相关参数
参数 | 默认值 | 使用介绍 |
---|---|---|
UseSpinning | JDK1.6默认开启, JDK1.5默认关闭 | 开启自旋锁以避免线程频繁挂起和唤醒 |
PreBlockSpin | 默认值为10 | 使用自旋锁时默认的自旋次数 |
UseThreadPriorities | 默认开启 | 使用本地线程优先级 |
UseBiasedLocking | 默认开启 | 是否使用偏向锁, 如果开启则使用 |
UseFastAccessorMethods | 默认开启 | 当频繁反射使用某个方法时, 生成字节码来加快反射的执行速度 |
2.6. 即时编译参数
参数 | 默认值 | 使用介绍 |
---|---|---|
CompileThreshold | Client模式下默认值为1500, Server模式下为10000 | 触发方法即时编译的阈值 |
OnStackReplacePercentage | Client模式下默认值为933, Server模式下为140 | OSR 比率, 它是 OSR 即时编译阈值计算公式的一个参数, 用于代替 BackEdgeThreshold参数控制回边计算器的实际溢出阈值 |
ReservedCodeCacheSize | 大部分情况下默认值为32M | 即时编译器编译的代码缓存的最大值 |
2.7 辅助信息
参数 | 使用介绍 | 输出 |
---|---|---|
-XX:+PrintGC | 输出形式: [GC 118250K->113543K(130112K), 0.0094143 secs] [Full GC 121376K->10414K(130112K), 0.0650971 secs] | |
-XX:+PrintGCDetails | 输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs] | |
-XX:+PrintGCTimeStamps | ||
-XX:+PrintGC:PrintGCTimeStamps | 可与-XX:+PrintGC -XX:+PrintGCDetails混合使用 输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs] | |
-XX:+PrintGCApplicationStoppedTime | 打印垃圾回收期间程序暂停的时间.可与上面混合使用 | 输出形式:Total time for which application threads were stopped: 0.0468229 seconds |
-XX:+PrintGCApplicationConcurrentTime | 打印每次垃圾回收前,程序未中断的执行时间.可与上面混合使用 | 输出形式:Application time: 0.5291524 seconds |
-XX:+PrintHeapAtGC | 打印GC前后的详细堆栈信息 | |
-Xloggc:filename | 把相关日志信息记录到文件以便分析. 与上面几个配合使用 | |
-XX:+PrintClassHistogram | garbage collects before printing the histogram. | |
-XX:+PrintTLAB | 查看TLAB空间的使用情况 | |
XX:+PrintTenuringDistribution | 查看每次minor GC后新的存活周期的阈值 | Desired survivor size 1048576 bytes, new threshold 7 (max 15) new threshold 7即标识新的存活周期的阈值为7。 |
3. JVM参数使用
# 当抛出 OOM 时进行 HeapDump, 会在项目根目录下生成 java_pidXXX.hprof 文件
java -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError -jar demo.jar# 当抛出 OOM 时进行 HeapDump, 会在 /home 下生成 answer.hprof 文件
java -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/answer.hprof -jar demo.jar# 打印 GC 详细信息
java -XX:+PrintGCDetails -jar demo.jar# 设置了系统默认时区[user.timezone], ZoneId.systemDefault()
nohup java -server -Xms1024M -Xmx1024M -Duser.timezone=GMT+08 -XX:+HeapDumpOnOutOfMemoryError -Xloggc:./jvm/gc.log -XX:HeapDumpPath=./jvm/answer.hprof -XX:+PrintGCDetails -XX:ErrorFile=./jvm/bsf-error.log -XX:+PrintHeapAtGC -XX:+PrintGCApplicationStoppedTime -jar demo-1.0-SNAPSHOT.jar &# -XX:+TraceClassLoading 加载类的详细信息(输出类是从哪个文件加载进来的)# %p变量表示当前jvm的pid,用%t表示jvm的启动时间戳. eg: -Xloggc:./logs/gc-%t.log
-Xms1024M -Xmx1024M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -Xloggc:./gc/app_`date +%Y%m%d`.log -XX:HeapDumpPath=./gc/app-dump_`date +%Y%m%d`.hprof -XX:ErrorFile=./gc/app-error_`date +%Y%m%d`.log -Duser.timezone=GMT+08 -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError
# 速记法
# Xms: memory size: 初始堆大小
# Xmx: memory max: 最大堆大小
# Xmn: memory new: 设置新生代的内存大小
# Xss: stack size: 每个线程的堆栈的大小
4. JVM的Client模式与Server模式
概述
JVM有两种运行模式Server与Client。两种模式的区别在于,Client模式启动速度较快,Server模式启动较慢;但是启动进入稳定期长期运行之后Server模式的程序运行速度比Client要快很多。这是因为Server模式启动的JVM采用的是重量级的虚拟机,对程序采用了更多的优化;而Client模式启动的JVM采用的是轻量级的虚拟机。所以Server启动慢,但稳定后速度比Client远远要快。
当前是Client or Server?
使用 Java -version命令就能显示出当前虚拟机处于哪种模式。
# Server VM
$ java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
模式配置文件
- 32位虚拟机: ${JAVA_HOME}/jre/lib/i386/jvm.cfg
- 64位虚拟机: ${JAVA_HOME}/jre/lib/amd64/jvm.cfg
模式切换
如果要切换启动模式,首先要确认JDK支持哪一种或两种模式。查看JAVA_HOME/jre/bin目录下是否存在client或server目录。32位的JDK一般都支持server和client两种模式。64位的虚拟机好像只支持server模式,没有client目录
切换模式只需要将client和server的声明语句互换位置即可
这篇关于HotSpot 虚拟机主要参数列表及启动参数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!