0%

JVM参数

JVM参数

-X参数选项 非标准选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 使用java -X可以看到-X参数选项有哪些参数
java -X
-Xmixed 混合模式执行(默认)
-Xint 仅解释模式执行
-Xbootclasspath:<用 : 分隔的目录和 zip/jar 文件>
设置引导类和资源的搜索路径
-Xbootclasspath/a:<用 : 分隔的目录和 zip/jar 文件>
附加在引导类路径末尾
-Xbootclasspath/p:<用 : 分隔的目录和 zip/jar 文件>
置于引导类路径之前
-Xdiag 显示附加诊断消息
-Xnoclassgc 禁用类垃圾收集
-Xincgc 启用增量垃圾收集
-Xloggc:<file> 将 GC 状态记录在文件中(带时间戳)
-Xbatch 禁用后台编译
-Xms<size> 设置初始 Java 堆大小,等价于-XX:InitialHeapSize
-Xmx<size> 设置最大 Java 堆大小,等价于-XX:MaxHeapSize
-Xss<size> 设置 Java 线程堆栈大小,等价于-XX:ThreadStackSize
-Xprof 输出 cpu 分析数据
-Xfuture 启用最严格的检查,预计会成为将来的默认值
-Xrs 减少 Java/VM 对操作系统信号的使用(请参阅文档)
-Xcheck:jni 对 JNI 函数执行其他检查
-Xshare:off 不尝试使用共享类数据
-Xshare:auto 在可能的情况下使用共享类数据(默认)
-Xshare:on 要求使用共享类数据,否则将失败。
-XshowSettings 显示所有设置并继续
-XshowSettings:system
(仅限 Linux)显示系统或容器
配置并继续
-XshowSettings:all
显示所有设置并继续
-XshowSettings:vm 显示所有与 vm 相关的设置并继续
-XshowSettings:properties
显示所有属性设置并继续
-XshowSettings:locale
显示所有与区域设置相关的设置并继续

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


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

-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 方法内联,默认开启

欢迎关注我的其它发布渠道