温馨提示: 使用-XX:+PrintFlagsFinal 打印所有以-XX格式的参数,总共差不多700多个,:=表示是被修改过的意思,所有的参数都是在-VM环境设置

1.java -X/-XX基本参数

-X 格式的参数

  • -Xint     设置只用执行解释器执行
  • -Xmixed 设置混合执行器(解释器+JIT编译器(热点代码缓存))
  • -Xms10m 设置最小堆内存大小,默认物理内存的1/64,通常和-Xmx10m值设置成一样
  • -Xmx10m 设置最大堆内存大小,默认物理内存的1/4
  • -Xss10m 设置栈内存大小
     

-XX 格式bool类型参数

  • -XX:+UseParallelGC 启用并行垃圾收集器
  • -XX:+UseG1GC 启用G1垃圾收集器
  • -XX:+UseAdaptiveSizePolicy 自动选择年轻代区大小和相应的Survivor区比例
  • -XX:+PrintFlagsFinal 打印所有的-XX参数大约700多个

 
-XX 格式等值类型参数

  • -XX:NewSize=1024m 设置新生代初始值1024m
  • -XX:MaxGCPauseMillis=500 设置GC停顿时间500ms
  • -XX:GCTimeRatio=19 设置吞吐量
  • -XX:NewRatio=2 设置新老年代比例1:2 ,若指定具体新生代内存大小,老年代=总内存-新生代,比例失效
  • -XX:HeapDumpPath=路径/a.hprof 导出dump文件
  • -XX:SurvivorRatio=8 设置Eden和from,to的三者比例 8:1:1,实际是6:1:1

 

2.JVM设置相关参数

  • -XX:+PrintCommandLineFlags 在程序启动前打印用户手动设置或者JVM自动设置的XX选项
  • -XX:+PrintFlagsInitial 打印所有的-XX格式的参数
  • -XX:+PrintFlagsFinal 打印XX选项在运行生效的值
  • -XX:+PrintVMOptions 打印JVM参数

 

3.栈、堆、方法区相关参数

  • -Xss1024m设置栈内存大小(通常不用设置,不发生GC)

  • -Xms3550m 设置堆最小内存
  • -Xmx3550 设置堆最大内存
  • -Xmn2g 设置新生代内存为2G(若设置了-Xms/Xmx会把剩余的内存分给老年代)
  • -XX:NewSize=1024m 设置新生代初始值1024m
  • -XX:MaxNewSize=2048 设置新生代最大值2048m(NewSizeMaxNewSize可以用-Xmn2g直接代替)
  • -XX:NewRatio=2 设置新老年代比例1:2 ,若指定具体新生代内存大小,老年代=总内存-新生代,比例失效
  • -XX:SurvivorRatio=8 设置新生代中Eden和0,1区比例8:1:1,显示赋值SurvivorRatio值为8,否则不生效
  • -XX:-UseAdaptiveSizePolicy设置Eden和0,1区比例(默认开启,实际情况是6:1:1)
  • -XX:+PretenureSizeThreadshold=1024 让大于该阈值的对象直接老年代分配(单位/byte),只对SerialParNew收集器有效
  • -XX:MaxTenuringThreshoold=15 设置值为15,新生代每次MinorGc后,还存活对象年龄计数+1,如果大于15就晋升为老年代
  • -XX:+PrintTenuringDistribution 设置JVM在每次MinorGC后打印出当前Survivor区中对象的年龄分布
  • -XX:TargetSurvivorRatio设置MinorGC结束后Survivor区域中占用空间的期望比例

方法区(永久代/元空间)

  • -XX:PermSize=256m 设置永久代最小值256m
  • -XX:MaxPermSize=256m设置永久代最大值256m
  • -XX:MetaspaceSize=1024m 设置元空间最小值1024m
  • -XX:MaxMetaspaceSzie=1024m 设置元空间最大值1024m
  • -XX:+UseCompressedOops 压缩对象指针
  • -XX:UseCompressedClassPointers 压缩类指针

 

4.直接内存日志打印

  • -XX:MaxDirectMemroySize 指定DirectMemroy容量,若未指定,默认和java堆最大值一样
  • -XX:+PrintGCDetails 打印出运行时程序的GC回收日志信息

 

5.OOM相关参数

  • -XX:+HeapDumpOnOutOfMemoryError 在发生OOM时,把Heap转存(Dump)到文件便于分析
  • -XX:+HeapDumpBeforeFullGC 在发生FullGC之前,生成Heap转存文件(存在多次FullGC产生多个文件)
  • -XX:HeapDumpPath=<Path> 指定heap转存文件的路径
  • -XX:OnOutOfMemoryError 设置一个可行性程序或者脚本程序,发生OOM时,执行这个脚本(手动执行GC指令)

 

6.垃圾收集器

Serial/Old GC收集器

  • -XX:+PrintCommandLineFlags 可以查询当前JVM使用的垃圾收集器
  • -XX:+UseSerialGC 设置单线程或者Client端使用的串行收集器,单线程收集效率很高
  • -XX:+UseSeialOldGC-XX:+UseSerialGC激活出来的对应老年代串行收集器
     

ParNew/Parallel/Old GC收集器

  • -XX:+UseParNew 使用并行收集器
  • -XX:ParallelGCThreads=n 限制ParNew的线程数,默认线程数小于8时,线程数和CPU数等值,超过8,按照计算公式=3+[5*CPU_Count]/8
  • -XX:+UseParallenGC 使用并行收集器
  • -XX:ParallelGCThreads 限定收集器线程数,一般和CPU相同避免过多线程数影响垃圾收集性能
  • -XX:MaxGCPauseMillis 设置GC最大停顿时间(STW的时间/ms)
  • 为了尽可能把停顿时间控制在MaxGCPauseMills以内,收集器在工作时会自动调整Java堆大小或者其他一些参数
  • 对于用户来说,停顿时间越短体验越好,但是在服务器端,我们注重高并发,整体的吞吐量,所以Parallel适合服务器端,进行控制
  • -XX:GCTimeRatio 设置收集时间占总时间的比例=1/(N+1),用于衡量吞吐量大小
  • 取值范围(0,100),默认值99,也就是垃圾回收器时间不超过1%
  • 与之前-XX:MaxGCPauseMillis参数有一顿矛盾,暂停时间越长,Radio参数就容易超过设定的比例
  • -XX:+UseAdaptiveSizePolicy 设置ParallelScavenge收集器的自适应调节,默认是开启状态
     

CMS收集器(JDK9已过时,JDK14完全删除)

  • -XX:UseConMarkSweepGC 开启CMS并发收集器,开启参数后自动配合 -XX:+UseParNewGC会打开,就是=ParNew(新生代)+CMS(老年代)+Serial Old组合(也就是混合收集),不能和Parallel搭配,Parallel有自己的搭配Parallel old GC,他们两是不同体系的垃圾收集器
  • -XX:CMSInitiatingOccupanyFraction 设置堆内存使用率的阈值,达到阈值,便会开始进行回收
  • JDK5及以前版本默认值为68,即当老年代的空间使用率达到68%时,会进行一次CMS回收,JDK6及以上默认92%
  • 如果内存增长缓慢,则可以设置一个稍大的值,大的阈值可以有效降低CMS的触发频率,减少老年代的回收次数可以明显提高应用程序的性能,反之,如果应用程序
  • 内存使用率增长很快,则应该降低这个阈值,以避免频繁触发老年代串行收集器,因此通过该选项便可以有效降低FullGC的执行次数
  • -XX:UseCMSCompactAtFullCollection 用于指定在执行完FullGC之后用于对内存空间进行压缩整理,避免内存碎片化,不过由于进行压缩整理内存碎片时,无法并行执行,因此带来的问题就是停顿时间变长
  • -XX:CMSFulllGCBeforeCompaction 指定在设置多少次FullGC之后进行内存碎片化进行压缩整理
  • -XX:ParallelCMSThreads 设置CMS线程数,CMS默认启动线程数=(ParallelGCThreads+3)/4ParallelCMSThreads 是年轻代收集器的线程数,当CPU资源紧张时,受到CMS收集器线程数的影响,应用程序性能明显降低
  • -XX:ConcGCThreads 设置并发垃圾收集器的线程数,默认是基于ParallelGCThreads计算出来的

 
G1收集器(业务驱动低延迟保证一定吞吐量)

  • -XX:+UseG1GC 使用G1垃圾回收器(不建议再去设置-Xmn,-XX:NewRatio可能会影响到我们的MaxGCPauseMillis)
  • -XX:G1HeapRegioonSize 设置每个Region的大小,值是2的幂,范围是1m-32m之间,目标是根据最小的java堆大小划分出来的2048个区域,默认是堆内存的1/2000
  • -XX:MaxGCPauseMillis 设置GC停顿时间(尽力在可控制的时间,达到高吞吐量),默认值200ms
  • -XX:ParallelGCThreads 设置STW的GC线程数,最多为8
  • -XX:ConcGCThreads 设置并发标记的线程数,将n设置为并行垃圾收集器(ParallelGCThreads)的1/4左右
  • -XX:G1ReservePercent=10 保留内存区域,防止to space(Survivor中的to区)溢出

 

7.输出日志文件

  • -Xloggc:<path> 输出gc日志文件然后使用工具打开分析
     

8.其他参数

  • -XX:ReservedCodeCacheSize=<n> 设置代码缓存的大小
  • -XX:InitialCodeCacheSize=<n> 设置代码缓存的大小(JIT执行的热点代码缓存),同上参数
  • -XX:+DoEsacpeAnalysis 开启逃逸分析(实例对象内存在栈中分配而不是堆,说法不一)
  • -XX:+UseBiasedLocking 开启偏向锁(对象header中的偏向锁ID)
  • -XX:+UseLargePages 开启使用大页面
  • -XX:+UseTLAB 开启TLAB,默认打开(当我们多个线程同时访问Eden区数据,为了保证数据安全性,我们得需要为Eden枷锁,但是这样效率低,所以给每个线程都分配一个缓存存储各自线程的锁,线程之间不影响,提高吞吐量,也保证了数据的安全性)
  • -XX:+PrintTLAB 打印TLAB的使用情况
  • -XX:TLABSize 设置TLAB的大小