JVM参数速查
文章目录
- 一、JVM运行时数据区参数列表
- 1.1、通用参数
- 1.2、堆空间常用参数
- 1.3、Java栈参数
- 1.4、元数据空间参数
- 1.5、直接内存参数
- 1.6、调试通用参数
- 1.7、GC调试通用参数
- 二、新生代垃圾收集器参数列表
- 2.1、Serial收集器参数
- 2.2、ParNew收集器参数
- 2.3、ParallelScavenge收集器参数
- 三、年老代垃圾收集器参数列表
- 3.1、SerialOld收集器参数
- 3.2、ParallelOld收集器参数
- 3.3、CMS收集器参数
- 四、整堆分区垃圾收集器参数列表
- 4.1、G1收集器参数
- 4.2、ZGC收集器参数
- 4.3、ShenandoahGC收集器参数
- 配置参考
在JVM的所有参数中,总体会被分为几种类型:标准参数(Standard)、非标准参数(Non-Standard)、高级运行时选项以及不建议使用(可能会被遗弃的)四大类,其中:
- 标准参数:开头直接为参数名,例如:
-server、-client
等。 - 非标准参数:
-X
开头,例如:-Xdebug、-XBatch
等。 - 高级选项:
-XX:
开头,例如:-XX:+UseG1GC、-XX:-UseG1GC
等,其中+
号代表开启,-
号代表关闭。
上述简单介绍清楚JVM参数中,不同开头的参数代表的含义后,接下来开始罗列JVM中的参数列表。
当然,也可以根据其他维度定义为行为参数、性能调优参数、调试参数这类的。
一、JVM运行时数据区参数列表
虚拟机的运行时数据区中,堆空间无疑是最重要的,除堆空间之外,虚拟机栈/本地方法栈(HotSpot中二合一)、元数据空间、本地内存等区域也有对应的参数,接下来依次列出。
1.1、通用参数
-
-client
:以客户端模式启动JVM。 -
-server
:以服务器模式启动JVM。 -
-agentlib
:装载本地lib
库。 -
-agentpath
: 按全路径装载本地库。 -
-classpath
:声明jvm搜索目录名、jar、zip文档名,之间用分号;分隔。 -
-D property=value
:设置系统[属性名/值]对。 -
应用程序运行时可通过
System.getProperty("property")
获取。 -
-enableassertions
:设置JVM是否启动断言机制,默认关闭(1.4开始支持的)。 -
后续跟
-esa
代表开启,跟-dsa
代表关闭。 -
-jar
:指定以jar
包的形式执行一个应用程序。 -
-javaagent:jarpath
:指定JVM
启动时装入java语言设备代理。 -
-verbose
:这个参数比较有趣,可以用于输出JVM一些信息,如下: -
结尾跟
:class
:输出JVM类加载相关信息,JVM找不到类时可以用于排查。 -
结尾跟
:gc
:输出每次GC相关的简略信息。 -
结尾跟
:jni
:输出native
方法调用的相关状况,可以用于诊断jni
调用错误。 -
-version
:输出当前机器Java环境版本信息。 -
-version:release
:指定当前机器以某个特定的版本执行。 -
-version:"1.5.0_04 1.5*&1.5.1_02+"
:以1.5或比1.5更高的版本执行。 -
-help
:输出Java所有标准参数及其描述。 -
-X
: 输出非标准的参数列表及其描述。 -
-Xint
:设置JVM以纯解释器模式执行。 -
-Xcomp
:完全采用即时编译器模式执行程序。 -
-Xmixed
:采用解释器+JIT即时编译器的混合模式共同执行。 -
-Xbatch
:禁止JVM后台编译,将编译过程放到前台任务执行。 -
-Xbootclasspath
:让Bootstrap
从指定目录下加载库、jar、zip
包。 -
结尾跟
/a:path
:将指定路径的全部文件追加到默认bootstrap
路径中。 -
结尾跟
/p:path
:让JVM优先于bootstrap
默认路径加载指定路径的文件。 -
-Xcheck:jni
: 对JNI函数进行附加检查,校验传递给JNI函数参数的合法性。 -
-Xfuture
:让JVM
对类文件执行严格模式检查(默认不使用)。 -
-Xnoclassgc
:关闭针对class
的gc(开启后类不会被卸载/会导致OOM)。 -
-Xincgc
: 开启增量gc,会减少停顿,但会导致吞吐量下降。 -
-Xprof
:跟踪正运行的程序,适合于开发环境调试。 -
-Xrs
:减小JVM对操做系统信号(signals
)的使用。 -
-XX:DisableExplicitGC
:禁止程序内部调用System.gc()
触发GC。 -
-XX:MaxFDLimit
:文件描述符的最大数量限制。 -
-XX:UseThreadPriorities
:启用本地线程优先级。 -
-XX:UnlockExperimentalVMOptions
:开启未知参数识别机制。 -
-XX:PrintFlagsInitial
:输出当前程序的参数默认值。
1.2、堆空间常用参数
-Xms
:JVM启动时堆空间大小。-Xmx
:堆空间的最大大小。-XX:NewSize=n
/-Xmn
:分配年轻代的空间大小。-XX:NewRatio=n
:设置年轻代和年老代的比值。-XX:SurvivorRatio
:设置新生代中Eden
区和Survivor
区的大小比值。- XX:TargetsurvivorRatio
:设置Survivor
区的目标使用率,默认为50%
。-XX:MaxTenuringThreshold
:设置年老代对象的晋升年龄。-XX:PretenureSizeThreshold
:指定直接进入年老代大对象的阈值。-XX:MaxHeapFreeRatio
:GC后允许堆中空闲内存占的最大比例。-XX:MinHeapFreeRatio
:GC后允许堆中空闲内存占的最小比例。-XX:MaxNewSize
:设置新生代内存的最大的可分配大小。-XX:UseLargePages
:开启大页面内存技术(大内存下使用)。-XX:LargePageSizeInBytes
:设置Java堆空间的大页面尺寸。-XX:HandlePromotionFailire
:是否开启空间分代担保机制。-XX:HeapDumpOnOutOfMemoryError
:堆空间首次发生OOM时输出dump
日志。-XX:HeapDumpPath
:和上面的参数配套使用,指定输出的位置。-XX:HeapDumpBeforeFullGC
:在FullGC
前dump
。-XX:HeapDumpAfterFullGC
:在FullGC
后dump
。-XX:OnOutOfMemoryError
:当JVM首次发生OOM时,可以执行制定脚本。-XX:+UseGCOverheadLimit
:在抛出OOM前限制JVM耗费在GC上的时间比例。-XX:UseAdaptiveSizePolicy
:是否开启自适应堆比例调整机制(并行GC器)。-XX:MaxGCPauseMillis
:设置每次新生代垃圾回收的期望最大停顿时间。-XX:UseCompressedOops
:是否开启对象指针压缩机制。-XX:CompressedClassSpaceSize
:是否开启类指针压缩机制。-XX:UseTLAB
:是否开启TLAB分配机制。-XX:TLABWasteTargetPercent
:指定TLAB
与整个Eden
区的占比。-XX:TLABSize
:显示指定TLAB区域的大小。-XX:ResizeTLAB
:是否开启JVM自适应的TLAB大小自调整机制。-XX:BiasedLockingStartupDelay
:设置sync
匿名偏向锁的延迟启动时间。-XX:PreBlockSpin
:指定Sync
自旋锁次数(1.6被弃用,引入自适应自旋)。-XX:PermSize
:设置非堆空间初始大小(1.7后被弃用,改为元空间)。-XX:MaxPermSize
:设置非堆空间最大大小(1.7后被弃用,改为元空间)。-XX:AlwaysPreTouch
:是否开启物理内存分配替换虚拟内存分配。
1.3、Java栈参数
-Xss
:设置虚拟机栈的默认大小。-XX:ThreadStackSize
:设置线程栈默认大小。-XX:+DoEscapeAnalysis
:是否开启逃逸分析机制。-XX:PrintEscapeAnaysis
:输出逃逸分析信息。-XX:EliminateAllocations
:是否开启标量替换机制。-XX:EliminateLocks
:是否开启同步消除机制。-XX:PrintEliminateAllocations
:输出标量替换信息。
1.4、元数据空间参数
-XX:MetaspaceSize
:指定元数据空间的初始大小。-XX:MaxMetaspaceSize
:指定元数据空间的最大大小。-XX:MinMetaspaceFreeRatio
:FullGC后,允许元空间空闲内存的最小比例。-XX:MaxMetaspaceFreeRatio
:FullGC后,允许元空间空闲内存的最大比例。-XX:MinMetaspaceExpansion
:元空间内存不足时,设置增量内存的最小大小。-XX:MaxMetaspaceExpansion
:元空间内存不足时,设置增量内存的最大大小。-XX:CompileThreshold
:方法调用计数器编译触发阈值设置。-XX:ReservedCodeCacheSize
:热点代码缓存区的最大大小。-XX:InitialCodeCacheSize
:设置热点代码缓存区的初始大小。-XX:+UseCodeCacheFlushing
:热点代码空间已满时,取消部分冷代码的编译。-XX:UseCounterDecay
:是否开启热度衰减机制。-XX:CounterHalfLifeTime
:调整半衰周期的时间,单位为秒。-XX:PrintCompilation
:当方法被编译时输出相关信息。XX:BackgroundCompilation
:禁止JVM后台编译,将编译任务在前台执行。-XX:CITime
:JVM关闭时,输出各种编译的统计信息。-XX:TraceClassLoading
:跟踪类加载信息。-XX:TraceClassLoadingPreorder
:跟踪所有被使用的类加载信息。-XX:TraceClassUnloading
:跟踪类卸载信息。-XX:TraceLoaderConstraints
:跟踪类加载器相关信息。-XX:TraceClassResolution
:跟踪常量池信息。
1.5、直接内存参数
-XX:DirectMemorySize
:设置直接内存的初始空间值(不设置默认与Xmx
参数值相同)。-XX:MaxDirectMemorySize
:设置直接内存的最大空间值。
1.6、调试通用参数
-XX:+PrintVMOptions
:输出当前运行程序的显式启动参数。-XX:+PrintCommandLineFlags
:输出传递给虚拟机的显式和隐式参数。-XX:+PrintFlagsInitial
:查看所有的参数的默认初始值。-XX:+PrintFlagsFinal
:输出所有的系统参数的最终值。-XX:PrintTLAB
:输出TLAB分配相关的信息-XX:CITime
:输出JIT即时编译的耗时。-XX:ErrorFile
:保存错误日志或者数据到文件中。-XX:OnError=”;”
:出现致命错误时执行自定义的指定脚本。
1.7、GC调试通用参数
-XX:+PrintGC
/-verbose:gc
:输出GC的简略日志。-XX:+PrintGCDetails
:输出GC发生时的详细日志。-XX:+PrintGCTimeStamps
:输出GC发生的时间。-XX:+PrintGCApplicationConcurrentTime
:输出应用程序的执行时间。-XX:+PrintGCApplicationStoppedTime
:输出应用由于GC而产生的停顿时间。-Xloggc
:将输出的GC日志转储到指定目录中。-XX:+PrintReferenceGC
:跟踪并输出软/弱/虚引用和Finallize
队列信息。-XX:+PrintHeapAtGC
:每次GC前后打印堆信息。-XX:PrintGCCause
:输出导致本次GC触发的原因。
二、新生代垃圾收集器参数列表
上述阶段中,将一些JVM通用参数、JVM运行时数据区参数以及部分调试参数进行了简单整理,接下来看看GC相关的一些参数。
2.1、Serial收集器参数
-XX:UseSerialGC
:是否启用Serial
作为新生代收集器。
2.2、ParNew收集器参数
-XX:UseParNewGC
:是否启用ParNew
作为新生代收集器。
2.3、ParallelScavenge收集器参数
-XX:UseParallelGC
:是否启用ParallelScavenge
作为新生代收集器。-XX:MaxGCPauseMillis
:设置GC发生时允许的最大停顿时间。-XX:GCTimeRatio
:精准控制GC发生时的吞吐量占比。-XX:UseAdaptiveSizePolicy
:是否开启JVM自适应的GC调节策略。-XX:ParallelGCThreads
:指定GC工作时的并行线程数(默认为CPU核数)。
三、年老代垃圾收集器参数列表
3.1、SerialOld收集器参数
-XX:UseSerialGC
:是否启用SerialOld
作为年老代收集器。
3.2、ParallelOld收集器参数
-XX:UseParallelOldGC
:是否启用ParallelOld
作为年老代收集器。
3.3、CMS收集器参数
-XX:UseConcMarkSweepGC
:是否启用CMS
作为年老代收集器。-XX:UseCMSInitiatingoccupancyonlyn
:指定触发CMS回收的阈值。-XX:CMSInitIatingOccupancyFaction
:指定空间占用达到多少比例时触发MSC
工作。-XX:+UseCMSInitiatingOccupancyOnly
:强制设定的回收阈值,达到即触发GC。-XX:UseCMSCompactAtFullCollection
:内存碎片化严重时是否开启MSC
工作。-XX:CMSFullGCsBeforeCompaction
:设置间隔多少次FullGC
触发一次MSC
工作,默认0
。-XX:ParallelCMSThreads
:指定CMS执行GC工作时的并发线程数。-XX:CMSClassUnloadingEnabled
:是否开启类元数据卸载(回收)机制。-XX:CMSInitiatingPermOccupancyFraction
:指定元空间GC的触发比例。-XX:GCTimeRatio
:指定GC停顿时间与用户线程工作时间的占比。-XX:MaxGCPauseMillis
:指定一次GC允许发生的最大停顿时间。-XX:CMSIncrementalMode
:是否启用增量回收模式(1.8中被废弃,1.9中移除)。-XX:CMSScavengeBeforeRemark
:是否在重新标记阶段前触发一次新生代GC。-XX:CMSMaxAbortablePrecleanTime
:默认为5s
,表示AbortablePreclean
阶段的最大时间。-XX:CMSScheduleRemarkEdenPenetration
:指定Eden
区使用比例超过N%
时,就结束预清理阶段进入remark
阶段。-XX:CMSParallellnitialMarkEnabled
:在初始阶段是否采用多线程执行。-XX:CMSParallelRemarkEnabled
:在重新标记阶段是否采用多线程执行。-XX:CMSClassUnloadingEnabled
:在正常GC阶段中清除过期的class
数据,不等到FullGC
时再清除。
四、整堆分区垃圾收集器参数列表
4.1、G1收集器参数
-
-XX:+UseG1GC
:让JVM使用G1收集器。 -
-XX:ConcGCThreads
:指定并发GC工作阶段的并发线程数量。 -
-XX:ParallelGCThreads
:指定STW阶段,GC工作的并行线程数。 -
-XX:MaxGCPauseMillis
:期望的目标停顿时间(默认200ms
)。 -
-XX:GCPauseIntervalMillis
:GC的间隔时间。 -
-XX:G1HeapRegionSize
:指定单个分区大小(1~32MB
,且必须是2的N次幂)。 -
-XX:G1NewSizePercent
:新生代初始空间占比(默认整堆的5%
)。 -
-XX:G1MaxNewSizePercent
:新生代最大空间占比。 -
GCTimeRatio
:GC停顿的时间占比(G1会根据此值调整堆空间)。 -
-XX:TargetSurvivorRatio
:G1中空间分配担保的触发比例。 -
当
Survivor
空间达到填充容量阈值时(默认50%
),将对象转入年老代。 -
-XX:MaxTenuringThreshold
:新生代空间对象的晋升年龄阈值(默认15
)。 -
-XX:InitiatingHeapOccupancyPercent
:年老代空间触发MixedGC
的阈值。 -
-XX:GCPauseIntervalMillis
:设置停顿间隔时间(作用于G1-回收阶段)。 -
-XX:ExplicitGCInvokesconcurrent
:对显示调用触发的GC是否启用并发回收。 -
-XX:G1ReservePercent
:预留年老代的空闲Region
数,为分代担保做准备,默认10
。 -
默认为整堆
45%
,年老代空间使用比例达到该阈值时触发混合GC。 -
-XX:G1MixedGCLiveThresholdPercent
:单个Region
触发GC的垃圾占比阈值。 -
默认为
85%
,单个分区中垃圾对象达到该阈值时才可被选作目标区域回收。 -
-XX:G1MixedGCCountTarget
:指定回收阶段时,分为几次筛选回收。 -
默认8次,在G1最后的筛选回收阶段可以回收一段时间,然后暂停回收,恢复系统运行,过一会儿再回收,这样做可以让系统不至于单次停顿时间过长。
-
-XX:G1HeapWastePercent
:GC回收停止的空闲Region
阈值(默认5%
)。 -
回收阶段是基于复制算法来完成的,回收一个分区时会将该区内的所有存活对象移入到另外一个区域,然后统一清除该分区,这样最终就会出现一个空的
Region
,而当空闲的Region
数量达到5%
时,G1会结束本次MixedGC
。 -
-XX:G1OldCSetRegionThresholdPercent
:每轮MixedGC
回收分区的最大比例,默认10%
。 -
-XX:SoftRefLRUPolicyMSPerMB
:指定每兆空间中软引用的存活时间,默认为1000ms
。 -
-XX:G1UseAdaptiveIHOP
:是否开启G1-IHOP
分析预测机制(默认开启)。 -
-XX:ParallelRefProcEnabled
:是否启用并发引用处理机制(默认关闭)。 -
-XX:G1RSetUpdatingPauseTimePercent
:降低处理Rset
记忆集时的停顿时间。 -
-XX:G1RSetRegionEntries
:降低RSet
粗化的程度。 -
-XX:G1SummarizeRSetStatsPeriod
:诊断参数,可以查看Rset
的周期频率报告。
4.2、ZGC收集器参数
-XX:UnlockExperimentalVMOptions
:是否解锁JVM隐藏的额外参数(实验参数)。-XX:UseZGC
:是否启用ZGC
作为JVM整堆的垃圾收集器。-XX:ZCollectionInterval
:定期触发一次GC(默认不开启,单位:秒)。-XX:ZProactive
:设置ZGC主动触发GC的阈值(默认开启)。
4.3、ShenandoahGC收集器参数
-XX:UseShenandoahGC
:是否启用ShenandoahGC
作为JVM整堆的垃圾收集器。
配置参考
8GB 的服务器
- 为操作系统预留 2GB 内存,保障操作系统运行流畅,将剩余的 6GB 内存分配给应用程序
- 通过
-XX:MaxDirectMemorySize-2g
设置:将 2GB(应用程序可用内存的1/3)内存预留给直接内存(可用的最大堆外内存)- Java 堆的大小:将 3GB 分配给 Java 堆:
-Xm3g -Xmx3g
- 确定新生代和老年代的大小:由于没有特殊的大对象和过多长生命周期的对象,所以可以将堆内存的
1/3
分配给新生代,也就是-XX:NewSize=1g
,将其他剩余的 2GB 内存分配给老年代。 Survivor 区和 Eden 区的配置可以采用官网建议的值,不做特殊设置- 确定元空间区:应用程序及其依赖的 JAR 包不大,所以可通过
XX:MetaspaceSize=128m
设置元空间大小为 128MB- 配置 GC:最后设置垃圾回收器、OOM 异常数据转储路径和 GC 日志。使用
-XX:+UserConcMarkSweepGC
可设置老年代使用 CMS 垃圾回收器,新生代使用默认的 ParNew 垃圾回收器。使用-XX:+UseG1GC
可设置使用 G1 垃圾回收器
java -server
-XX:MaxDirectMemorySize=2g # 直接内存的大小为 2GB
-Xms3g -Xmx3g # Java 堆内存的大小为 3GB
-XX:NewSize=1g # 新生代的大小为 1GB
-XX:MetaspaceSize=128m # 元空间为 128MB
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC # 新生代使用 ParNewGC,老年代使用 CMS
-xx:+HeapDumponCutOfMemoryError # 在发生 OOM 时打印日志
-XX:HeapDumpPath=dump.log # OOM 日志存储地址
-XX:+PrintGC # 输出 GC 日志
-XX:+PrintGCDetails # 输出 GC 的详细日志
-XX:+PrintGCDatestamps # 输出 GC 的时间戳
-XX:+PrintHeapAtGC # JVM 在执行 GC 操作的前后打印堆的信息
-Xlogge:../gc/gc.log # GC日志的输出地址
-jar start.jar