jvm-参数

jvm-参数

起男 370 2022-12-14

jvm-参数

参数项类型

标准参数

特点:

  • 比较稳定,后续版本基本不好发生变化
  • -开头

选项:运行java或java -help可以看到所有的标准选项

-X参数

特点:

  • 非标准化参数
  • 功能还是比较稳定的,但官方说后续版本可能会变更
  • -X开头

选项:运行java -X命令可以看到所有的选项

-XX参数

特点:

  • 非标准化参数
  • 使用的最多的参数类型
  • 这类选项属于实验性质,不稳定
  • -XX:开头

作用:用于开发和调试jvm

格式:

  • Boolean类型:-XX:[+|-]<option>,开启或禁用option属性
  • key-value类型:-XX:<key>=<value>

可以通过-XX:+PrintFlagsFinal输出所有参数的名称和默认值

常用参数

打印设置的XX选项及值

  • -XX:+PrintCommandLineFlags:可以让程序运行前打印出用户手动设置或者jvm自动设置的XX选项
  • -XX:PrintFlagsInitial:打印出所有XX选项的默认值
  • -XX:PrintFlagsFinal:打印出XX选项在运行程序时生效的值
  • -XX:PrintVMOptions:打印jvm的参数

堆、栈、方法区等内存大小设置

  • -Xss:设置每个线程的栈大小,-XX:ThreadStackSize

  • -Xms:设置jvm初始内存,等价于-XX:InitialHeapSize
  • -Xmx:设置jvm最大内存,-XX:MaxHeapSize
  • -Xmn:设置年轻代大小(官方推荐为:整个堆的3/8)
  • -XX:NewSize:年轻代初始值
  • -XX:MaxNewSize:年轻代最大值
  • -XX:SurvivorRation:设置年轻代中eden区和survivor区的比值,默认8
  • -XX:+UseAdaptiveSizePolicy:自动设置各个区大小比例,默认开启
  • -XX:NewRatio:设置老年代与年轻代的比值,默认2
  • -XX:PretenureSizeThreadshold:设置让大于此阈值的对象直接分配在老年代,单位字节。只对Serial、ParNew收集器有效
  • -XX:MaxTenuringThreshold:新生代每次minorGC后,存活对象年龄+1,当年龄超过这个值时,直接进入老年代,默认15
  • -XX:PrintTenuringDistribution:让jvm在每次minorGC后打印出当前使用的surivor中的对象年龄分布
  • -XX:TargetSurvivorRatio:表示minorGC结束后,survivor区域占用空间的期望比例

永久代

  • -XX:PermSize:设置永久代初始值
  • -XX:MaxPermSize:设置永久代最大值

元空间

  • -XX:MetaspaceSize:设置元空间初始大小
  • -XX:MaxMetaspaceSize:设置元空间最大空间,默认没有限制
  • -XX:+UseCompressedOops:使用压缩对象指针
  • -XX:+UseCompressedClassPointers:使用压缩类指针
  • -XX:CompressedClassSpaceSize:设置klass metaspace的大小,默认1g

直接内存

  • -XX:MaxDirectMemorySize:指定DirectMemory容量,如果没有指定,默认与java堆最大值一样

OOM相关

  • -XX:+HeapDumpOnOutOfMemoryError:在内存出现oom的时候,把heap转储为dump文件
  • -XX+HeapDumpBeforeFullGC:在出现fullGC之前,生成堆dump文件
  • -XX:HeapDumpPath:指定堆dump文件的存储路径
  • -XX:OnOutOfMemoryError:指定一个可行性程序或脚本的路径,当发生oom的时候,去执行这个脚本

垃圾收集器相关

Serial

  • -XX:+UseSerialGC:年轻代使用serial,老年代使用SerialOld

ParNew

  • -XX:+UseParNewGC:指定使用ParNew收集器执行内存回收任务。它表示年轻代使用并行收集器,不影响老年代
  • -XX:ParalleGCThreads:限制线程数量,默认开启和cpu数量相同的线程数

Paralle

  • -XX:+UseParalleGC:指定年轻代使用parallel
  • -XX:+UseParallelOldGC:指定老年代使用parallel old

以上两个参数默认开启一个,另一个也会开启。jdk8默认开启

  • -XX:ParallelGCThreads:设置年轻代并行收集器的线程数
  • -XX:MaxGCPauseMillis:设置垃圾收集器最大停顿时间(stw)。单位毫秒
  • -XX:GCTimeRatio:垃圾收集时间占总时间的比例。用于衡量吞吐量的大小。默认99,表示垃圾收集时间不超过1%
  • -XX:+UseAdaptiveSizePolicy:自适应条件策略

CMS

  • -XX:+UseConcMarkSweepGC:指定老年代使用cms,并年轻代使用ParNew
  • -XX:CMSInitiatingOccupanyFraction:设置堆内存使用率的阈值,一旦到达阈值开始进行垃圾回收
  • -XX:+UseCMSCompactAtFullCollection:用于指定在执行完full gc后对内存空间进行压缩整理,以避免产生内存碎片。不过因为压缩整理无法并发执行,所以停顿时间会更长
  • -XX:CMSFullGCsBeforeCompaction:设置在执行多次fullGC后对内存空间进行压缩整理
  • -XX:ParalleCMSThreads:设置cms的线程数量

G1

  • -XX:+UseG1GC:使用g1收集器
  • -XX:G1HeapRegionSize:设置每个region的大小,值是2的幂,范围1mb到32mb之间。默认是堆内存的1/2000
  • -XX:MaxGCPauseMillis:设置期望达到的gc停顿时间指标(不保证达到),默认100ms
  • -XX:ParallelGCthreads:设置stw时gc线程数。最多为8
  • -XX:ConcGCthreads:设置并发标记的线程数
  • -XX:InitiatingHeapOccupancyPercent:设置触发并发gc周期的java堆占用率阈值。超过此值,就触发gc。默认45
  • -XX:G1NewSizePercent:新生代占用整个堆内存的最小百分比,默认5%
  • -XX:G1MaxNewSizePercent:新生代占用整个堆内存的最大百分比,默认60%
  • -XX:G1ReservePercent:保留内存区域,防止幸存者to区溢出

GC日志相关

  • -verbose:gc:输出gc日志信息,默认输出到标准输出
  • -XX:+PrintGC:等同于-verbose:gc,表示打开简化的gc日志
  • -XX:+PrintGCDetails:在发生垃圾回收时打印内存回收详细的日志,并在进程退出时输出当前内存各区域分配情况
  • -XX:+PrintGCTimeStamps:输出gc发生的时间戳
  • -XX:+PrintGCDateStamps:输出gc发生的时间戳(日期的形式)
  • -XX:+PrintHeapAtGC:每一次GC前和后,都打印堆信息
  • -Xloggc:<file>:把gc日志写入到一个文件中去,而不是打印到标准输出

其他

  • -XX:+DisableExplicitGC:禁止hotspot执行System.gc(),默认禁用
  • -XX:+ReservedCodeCacheSize:指定代码缓存的大小
  • -XX:+UseCodeCacheFlushing:使用该参数让jvm放弃一些被编译的代码,避免代码缓存被占满时jvm切换到interpreted-only的情况
  • -XX:+DoEscapeAnalysis:开启逃逸分析
  • -XX:+UseLargePages:开启使用大页面
  • -XX:+UseTLAB:使用tlab,默认打开
  • -XX:+PrintTLAB:打印tlab使用情况
  • -XX:+TLABSize:设置tlab大小