JVM参数
-X参数选项 非标准选项
1 | 使用java -X可以看到-X参数选项有哪些参数 |
-d64
加载64位HotSpot VM
-XX参数选项 非标准化
有两种类型,分为Boolean类型和KV类型
- Boolean类型
-XX:+<option>
启用-XX:-<option>
禁用 - KV类型
-XX:<option>=<value>
常用JVM参数选项
打印设置的XX选项及值
-XX:+PrintCommandLineFlags
在程序运行前打印出用户手动设置或者JVM自动设置的XX选项-XX:+PrintFlagsInitial
表示打印出所有XX选项的默认值-XX:+PrintFlagsFinal
表示打印出XX选项在运行程序时生效的值-XX:+PrintVMOptions
打印JVM参数(只显示设置的JVM参数)
堆、栈、方法区的内存大小设置
堆设置
-Xms512m
JVM初始堆内存,等价于-XX:InitialHeapSize-Xmx512m
JVM最大堆内存,等价于-XX:MaxHeapSize-Xmn256m
年轻代大小(推荐为堆大小的3/8),初始值和最大值都是该值,等价于-XX:NewSize=256m
和-XX:MaxNewSize=256m
-XX:NewSize=128m
年轻代初始值-XX:MaxNewSize=128m
年轻代最大值-XX:SurvivorRatio=8
年轻代中Eden区与一个Survivor区的比值,默认8,由于-XX:+UseAdaptiveSizePolicy
是默认打开的,所以需要显式设置才会生效,一般不需要设置,等于eden/from = eden/to-XX:+UseAdaptiveSizePolicy
动态调整java堆中各个区域的大小以及进入老年代的年龄,此时-XX:NewRatio
和-XX:SurvivorRatio
会失效,JDK8默认开启-XX:NewRatio=2
老年代与年轻代的比值,默认2-XX:PretenureSizeThreadshold=1024
让大于此阈值的对象直接分配在老年代,单位为字节,只对Serial/ParNew收集器有效-XX:MaxTenuringThreshold=15
新生代每次MinorGC后,还存活的对象年龄+1,当对象的年龄大于该值时则进入老年代,默认15-XX:+PrintTenuringDistribution
使JVM每次MinorGC后打印出当前使用的Survivor中对象的年龄分布-XX:TargetSurvivorRatio
MinorGC结束后Survivor区域中占用空间的期望比例
栈设置
-Xss128k
每个线程的栈大小,等价于-XX:ThreadStackSize,该值设置过大,会导致可使用的线程数变少。如果出现栈溢出,需要查看是否为递归过深的问题,如果必须递归这么多次,可适当调整该配置
方法区
jdk8之前使用永久代,jdk8使用元空间
永久代(jdk7)
-XX:PermSize=256m
永久代初始值-XX:MaxPermSize=256m
永久代最大值
元空间(jdk8)
-XX:MetaspaceSize
初始空间大小-XX:MaxMetaspaceSize
最大空间,默认没有限制,是机器的物理内存大小-XX:+UseCompressedOops
开启压缩对象指针,可以改善性能,将64位指针转换为相当于Java32位-XX:+UseCompressedClassPointers
压缩类指针-XX:CompressedClassSpaceSize
设置Klass Metaspace大小,默认1G
直接内存
-XX:MaxDirectMemorySize
指定DirectMemory容量,若未指定,则默认与java堆最大值一致,直接内存独立于JVM的堆内存
原生内存
-XX:NativeMemoryTracking=off|summary|detail
进行原生内存跟踪,默认是off关闭状态,如果使用summary(概要模式)或detail(详情模式),则可以使用jcmd process_id VM.native_memory summary|detail来查看信息-XX:+PrintNMTStatistics
默认是false,若开启会在程序退出时打印原生内存分配信息
OOM相关选项
-XX:+HeapDumpOnOutOfMemoryError
在内存出现OOM的时候,把Heap转存Dump到文件中-XX:+HeapDumpBeforeFullGC
在出现FullGC之前,生成Heap转储文件-XX:+HeapDumpAfterFullGC
在出现FullGC之后,生成Heap转储文件-XX:HeapDumpPath
heap转储文件存储路径-XX:OnOutOfMemoryError
指定一个可执行文件路径,当发生OOM时,执行该脚本
垃圾收集器相关选项
Serial收集器
在client模式下新生代使用Serial收集器,老年代使用Serial Old收集器
-XX:UseSerialGC
使用Serial收集器,Serial+Serial Old组合
ParNew收集器
-XX:+UseParNewGC
使用ParNew+Serial Old组合-XX:ParallelGCThreads
限制GC线程数量,可以有多少线程进程垃圾回收,默认是开启和CPU数据相同的线程数
Parallel收集器
-XX:+UseParallelGC
指定新生代使用Parallel Scavenge收集器,此时老年代会自动指定为Parallel Old收集器,jdk8默认开启-XX:+UseParallelOldGC
指定老年代使用Parallel Old收集器,此时新生代会自动指定为Parallel Scavenge收集器-XX:ParallelGCThreads
年轻代并行收集器的线程数,CPU数量小于8时默认是开启和CPU数据相同的线程数,当CPU数量大于8时,ParallelGCThreads的值等于3+(5*CPU)/8-XX:MaxGCPauseMillis
设置垃圾回收器最大停顿时间(STW时间),单位毫秒,谨慎配置-XX:GCTimeRatio
吞吐量,垃圾收集时间占总时间的比例(= 1/(N+1)),吞吐量就是(1-1/(N+1))取值范围(0,100),默认99-XX:+UseAdaptiveSizePolicy
自适应调节策略
CMS收集器
-XX:+UseConcMarkSweepGC
指定使用CMS收集器,开启时-XX:+UseParNewGC
也会自动开启,新生代使用ParNew,老年代使用CMS+Serial Old组合,Serial Old作为CMS收集器出现Concurrent Mode Failure失败后的后备收集器使用-XX:CMSInitialtingOccupanyFraction
堆内存的阈值,一旦达到该阈值,开始回收,默认92%,通过该选项可以有效降低Full GC的次数-XX:+UseCMSCompactAtFullCollection
在执行完Full GC后对内存空间进行压缩整理,避免内存碎片的产生,不过会导致STW时间变长-XX:CMSFullGCsBeforeCompaction
执行多少次Full GC后对内存空间进行整理-XX:PapallelCMSThreads
CMS的线程数量,默认是(PapallelCMSThreads+3)/4-XX:+CMSClassUnloadingEnabled
允许对类元数据区进行回收-XX:CMSInitiatingPermOccupancyFraction
当永久区占用率达到这一百分比时,启动CMS回收(需要保证-XX:+CMSClassUnloadingEnabled开启)-XX:UseCMSInitiatingOccupancyOnly
表示只有在达到阈值的时候才进行CMS回收
G1收集器
-XX:+UseG1GC
使用G1收集器-XX:G1HeapRegionSize
设置每个Region的大小,值是2的幂,范围1M到32M之间,默认是堆内存的1/2000-XX:MaxGCPauseMills
最大GC停顿时间指标,默认200ms-XX:GCPauseIntervalMillis
设置停顿间隔时间-XX:ParallelGCThread
STW时GC线程数的值,默认为8-XX:ConcGCThreads
并发标记的线程数,推荐设置为ParallelGCThread的1/4左右-XX:InitiatingHeapOccupancyParcent
触发并发GC周期的java堆占用率阈值,超过则触发GC,默认45-XX:G1NewSizePercent
新生代占用整个堆内存的最小百分比,默认5%-XX:G1MaxNewSizePercent
新生代占用整个堆内存的最大百分比,默认60%-XX:G1ReservePercent
保留内存区域,防止Survivor的to区溢出
GC日志相关选项
-verbose:gc
输出gc日志信息-XX:+PrintGC
打印简化的GC日志,等价于-verbose:gc
-XX:+PrintGCDetails
在发生垃圾回收时打印内存回收详细的日志,并在进程退出时输出当前内存区域分配情况-XX:+PrintGCTimeStamps
输出GC发生时的时间戳,需要与-XX:+PrintGCDetails
搭配使用-XX:+PrintGCDateStamps
输出GC发生时的时间戳,日期格式,需要与-XX:+PrintGCDetails
搭配使用-XX:+PrintHeapAtGC
每一次GC前后都打印堆信息-XX:+PrintGCApplicationStoppedTime
打印应用由于GC而产生的停顿时间-XX:+PrintReferenceGC
跟踪软引用、弱引用、虚引用和Finallize队列-Xloggc:<file>
把GC日志写入到一个文件中,方便进行离线分析,这里把文件名写成时间格式,如gc-%t.log,生成的日志名称就会使gc-2023-08-21_10-20-20.log-XX:+UseGCLogFileRotation
开启日志文件的分割,开启之后默认的文件数目为0,表示不做任何限制,默认的日志文件大小为0,也不做任何限制-XX:GCLogfileSize=N
日志文件大小,超过触发分割-XX:NumberOfGCLogfiles=N
最多分割几个文件,超过之后从头开始起-XX:+PrintTenuringDistribution
在GC时输出打印Survivor区中对象的年龄分布,默认是false-XX:+PrintTLAB
在进行新生代垃圾收集时,GC日志中就会打印每个线程的TLAB使用情况以及JVM整体的TLAB使用情况,如果发现有大量的对象分配发生在TLAB之外,需要考虑对TLAB进行调整
其他
-XX:+DisableExplicitGC
禁止hotspot显示执行System.gc()-XX:+ExplicitGCInvokesConcurrent
使用并发方式处理显示GC-XX:ReservedCodeCacheSize=<n>[g|m|k]
指定代码缓存的最大值大小-XX:InitialCodeCacheSize=<n>[g|m|k]
指定代码缓存的初始值大小-XX:+UseCodeCacheFlushing
让jvm放弃一些被编译的代码,避免代码缓存被占满时JVM切换到interpreted-only的情况-XX:+DoEscapeAnalysis
开启逃逸分析-XX:+UseBiasedLocking
开启偏向锁-XX:+UseLargePages
开启使用大页面-XX:+UseTLAB
使用TLAB,默认打开-XX:+PrintTLAB
打印TLAB的使用情况-XX:MinTLABSize=N
设置TLAB最小值-XX:TLABSize
设置TLAB大小,初始值-XX:+ResizeTLAB
自动调节TLAB大小
跟踪类信息
-verbose:class
可以跟踪类的加载和卸载-XX:+TraceClassLoading
可以显示类的加载信息,输出结果与-verbose:class
一样,但是不展示卸载信息-XX:+TraceClassUnloading
可以显示类的卸载信息,输出结果与-verbose:class
一样,但是不展示加载信息-XX:+PrintClassHistogram
显示类信息柱状图
编译相关
-XX:+PrintCompilation
如果开启,每次编译一个方法时,JVM会打印一行被编译的内容信息-XX:+Inline
方法内联,默认开启