五千字JVM调优参数记录

Posted 默辨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了五千字JVM调优参数记录相关的知识,希望对你有一定的参考价值。

写在前面:本文全部的细节内容,都能够在《深入理解JVM虚拟机》一书中查看

文章目录




一、JVM配置参数

JVM参数设置样例:-Xms2048M -Xmx2048M -Xmn1024M -Xss512K -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M

1、基础参数

  • -Xss:每个线程的栈大小

  • -Xms:设置堆的初始可用大小,默认物理内存的1/64

  • -Xmx:设置堆的最大可用大小,默认物理内存的1/4

  • -Xmn:新生代大小

  • -XX:NewRatio:默认2表示新生代占年老代的1/2,占整个堆内存的1/3。

  • -XX:SurvivorRatio:默认8表示一个survivor区占用1/8的Eden内存,即1/10的新生代内存。

  • -XX:MaxMetaspaceSize: 设置元空间最大值, 默认是-1, 即不限制, 或者说只受限于本地内存大小。

  • -XX:MetaspaceSize: 指定元空间触发Fullgc的初始阈值(元空间无固定初始大小), 以字节为单位,默认是21M左右,达到该值就会触发full gc进行类型卸载, 同时收集器会对该值进行调整: 如果释放了大量的空间, 就适当降低该值; 如果释放了很少的空间, 那么在不超过-XX:MaxMetaspaceSize(如果设置了的话) 的情况下, 适当提高该值。这个跟早期jdk版本的-XX:PermSize参数意思不一样,-XX:PermSize代表永久代的初始容量。



2、对象流转参数

  • -XX:+UseCompressedOops:启用指针压缩:(默认开启)
  • -XX:-UseCompressedOops:禁止指针压缩

  • -XX:+DoEscapeAnalysis:开启逃逸分析
  • -XX:-DoEscapeAnalysis:关闭逃逸分析
  • -XX:+EliminateAllocations:开启标量替换

  • -XX:+UseAdaptiveSizePolicy:eden区和survivor区8:1:1的比例自适应(默认开启)
  • -XX:-UseAdaptiveSizePolicy:禁止自适应,即只能是8:1:1

  • -XX:PretenureSizeThreshold:直接进入老年代的大对象的大小(单位是字节),这个参数只在 Serial 和ParNew两个收集器下有效。使用样例,-XX:PretenureSizeThreshold=1000000 -XX:+UseSerialGC

  • -XX:MaxTenuringThreshold:对象由年轻代晋升到老年代的年龄阈值

  • -XX:TargetSurvivorRatio:对象动态年龄判断机制时使用,对象的总大小大于这块Survivor区域指定对应的内存比例

  • -XX:-HandlePromotionFailure:是否开始老年代空间分配担保机制(jdk1.8默认设置)



3、垃圾回收器参数

  • -XX:+UseSerialGC:指定年轻代使用 Serial串行垃圾回收器
  • -XX:+UseSerialOldGC:指定老年代使用 Serial串行垃圾回收器
  • -XX:+UseParallelGC:指定年轻代使用 Serial并行垃圾回收器
  • -XX:+UseParallelOldGC:指定老年代使用 Serial并行垃圾回收器
  • -XX:+UseParNewGC:指定年轻代使用 ParNew垃圾回收器
  • -XX:+UseConcMarkSweepGC:指定年轻代使用CMS垃圾回收器
  • -XX:+UseG1GC:指定使用G1垃圾回收器
  • -XX:+UseZGC:指定使用ZGC垃圾回收器



4、CMS参数

  • -XX:+UseCMSCompactAtFullCollection:CMS垃圾回收器使用“标记-清除”算法回收垃圾后,产生大量的垃圾碎片,该参数可以在该参数的基础上,增加一个内存整理的操作,减少内存碎片
  • -XX:ConcGCThreads:并发的GC线程数
  • -XX:CMSFullGCsBeforeCompaction:多少次FullGC之后压缩一次,默认是0,代表每次FullGC后都会压缩一次
  • -XX:CMSInitiatingOccupancyFraction: 当老年代使用达到该比例时会触发FullGC(默认是92,这是百分比)
  • -XX:+UseCMSInitiatingOccupancyOnly:只使用设定的回收阈值(-XX:CMSInitiatingOccupancyFraction设定的值),如果不指定,JVM仅在第一次使用设定值,后续则会自动调整
  • -XX:+CMSScavengeBeforeRemark:在CMS GC前启动一次minor gc,降低CMS GC标记阶段(也会对年轻代一起做标记,如果在minor gc就干掉了很多对垃圾对象,标记阶段就会减少一些标记时间)时的开销,一般CMS的GC耗时 80%都在标记阶段
  • -XX:+CMSParallellnitialMarkEnabled:表示在初始标记的时候多线程执行,缩短STW
  • -XX:+CMSParallelRemarkEnabled:在重新标记的时候多线程执行,缩短STW;



5、G1参数

  • -XX:G1HeapRegionSize:指定G1垃圾回收器每一个Region块的大小(1MB~32MB,且必须是2的N次幂),默认将整堆划分为2048个分区
  • -XX:G1NewSizePercent:G1垃圾回收器中,新生代Region的初始占比(默认整堆5%,值配置整数,默认就是百分比)
  • -XX:G1MaxNewSizePercent:上一步设置的占比最大不能超过当前参数设置的值
  • -XX:MaxGCPauseMillis:基于G1的可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内完成垃圾收集。G1机算当Region的垃圾清理时间达到该值时就开始YoungGC(默认200ms)
  • -XX:ParallelGCThreads:指定GC工作的线程数量
  • -XX:TargetSurvivorRatio:Survivor区的填充容量(默认50%),Survivor区域里的一批对象(年龄1+年龄2+年龄n的多个年龄对象)总和超过了Survivor区域的50%,此时就会把年龄n(含)以上的对象都放入老年代
  • -XX:MaxTenuringThreshold:最大年龄阈值(默认15)
  • -XX:InitiatingHeapOccupancyPercent:老年代占用空间达到整堆内存阈值(默认45%),则执行新生代和老年代的混合收集(MixedGC),比如我们之前说的堆默认有2048个region,如果有接近1000个region都是老年代的region,则可能就要触发MixedGC了
  • -XX:G1MixedGCLiveThresholdPercent:默认85%,region中的存活对象低于这个值时才会回收该region,如果超过这个值,存活对象过多,回收的的意义不大。
  • -XX:G1MixedGCCountTarget:在一次回收过程中指定做几次筛选回收(默认8次),在最后一个筛选回收阶段可以回收一会,然后暂停回收,恢复系统运行,一会再开始回收,这样可以让系统不至于单次停顿时间过长。
  • -XX:G1HeapWastePercent:默认5%,gc过程中空出来的region是否充足阈值,在混合回收的时候,对Region回收都是基于复制算法进行的,都是把要回收的Region里的存活对象放入其他Region,然后这个Region中的垃圾对象全部清理掉,这样的话在回收过程就会不断空出来新的Region,一旦空闲出来的Region数量达到了堆内存的5%,此时就会立即停止混合回收,意味着本次混合回收就结束了。



6、ZGC参数





二、调优参数

更多细节,可参考《深入理解Java虚拟机》第二部分第4章——虚拟机性能监控、故障处理工具

1、jps(虚拟机进程状态工具)

  1. jps:查询应用程序的pid号



2、jmap(Java内存映像工具)

  1. jmap -histo pid #查看历史生成的实例
  2. jmap -histo:live pid #查看当前存活的实例,执行过程中可能会触发一次full gc



3、jstack(Java堆栈跟踪工具)

  1. jstack pid:生成虚拟机当前时刻的线程快照



4、jhap(虚拟机堆转存储快照分析工具)



5、jvisualvm(虚拟机运行监视和故障处理程序)

  1. jvisualvm:打开自带的监控客户端



6、jinfo(Java配置信息工具)

  1. jinfo -flags pid:查询系统配置的参数
  2. jinfo -sysprops pid:查看java系统参数



7、jstat(虚拟机统计信息监视工具)

jstat [-命令选项] [vmid] [间隔时间(毫秒)] [查询次数]

该命令的作用主要分为三类:类加载、垃圾收集、运行期编译状况,这里只列出垃圾收集的作用

1、jstat -gc pid:评估程序内存使用及GC压力整体情况

  • S0C:第一个幸存区的大小,单位KB
  • S1C:第二个幸存区的大小
  • S0U:第一个幸存区的使用大小
  • S1U:第二个幸存区的使用大小
  • EC:伊甸园区的大小
  • EU:伊甸园区的使用大小
  • OC:老年代大小
  • OU:老年代使用大小
  • MC:方法区大小(元空间)
  • MU:方法区使用大小
  • CCSC:压缩类空间大小
  • CCSU:压缩类空间使用大小
  • YGC:年轻代垃圾回收次数
  • YGCT:年轻代垃圾回收消耗时间,单位s
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间,单位s
  • GCT:垃圾回收消耗总时间,单位s

2、jstat -gccapacity pid:堆内存统计

  • NGCMN:新生代最小容量
  • NGCMX:新生代最大容量
  • NGC:当前新生代容量
  • S0C:第一个幸存区大小
  • S1C:第二个幸存区的大小
  • EC:伊甸园区的大小
  • OGCMN:老年代最小容量
  • OGCMX:老年代最大容量
  • OGC:当前老年代大小
  • OC:当前老年代大小
  • MCMN:最小元数据容量
  • MCMX:最大元数据容量
  • MC:当前元数据空间大小
  • CCSMN:最小压缩类空间大小
  • CCSMX:最大压缩类空间大小
  • CCSC:当前压缩类空间大小
  • YGC:年轻代gc次数
  • FGC:老年代GC次数

3、jstat -gcnew pid:新生代垃圾回收统计

  • S0C:第一个幸存区的大小
  • S1C:第二个幸存区的大小
  • S0U:第一个幸存区的使用大小
  • S1U:第二个幸存区的使用大小
  • TT:对象在新生代存活的次数
  • MTT:对象在新生代存活的最大次数
  • DSS:期望的幸存区大小
  • EC:伊甸园区的大小
  • EU:伊甸园区的使用大小
  • YGC:年轻代垃圾回收次数
  • YGCT:年轻代垃圾回收消耗时间

4、jstat -gcnewcapacity pid:新生代内存统计

  • NGCMN:新生代最小容量
  • NGCMX:新生代最大容量
  • NGC:当前新生代容量
  • S0CMX:最大幸存1区大小
  • S0C:当前幸存1区大小
  • S1CMX:最大幸存2区大小
  • S1C:当前幸存2区大小
  • ECMX:最大伊甸园区大小
  • EC:当前伊甸园区大小
  • YGC:年轻代垃圾回收次数
  • FGC:老年代回收次数

5、jstat -gcold pid:老年代垃圾回收统计

  • MC:方法区大小
  • MU:方法区使用大小
  • CCSC:压缩类空间大小
  • CCSU:压缩类空间使用大小
  • OC:老年代大小
  • OU:老年代使用大小
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

6、jstat -gccapacity pid:老年代内存统计

  • OGCMN:老年代最小容量
  • OGCMX:老年代最大容量
  • OGC:当前老年代大小
  • OC:老年代大小
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

7、jstat -gcmetacapacity pid:元数据空间统计

  • MCMN:最小元数据容量
  • MCMX:最大元数据容量
  • MC:当前元数据空间大小
  • CCSMN:最小压缩类空间大小
  • CCSMX:最大压缩类空间大小
  • CCSC:当前压缩类空间大小
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

8、jstat -gcutil pid:已使用空间占总空间的百分比

  • S0:幸存1区当前使用比例
  • S1:幸存2区当前使用比例
  • E:伊甸园区使用比例
  • O:老年代使用比例
  • M:元数据区使用比例
  • CCS:压缩使用比例
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

以上是关于五千字JVM调优参数记录的主要内容,如果未能解决你的问题,请参考以下文章

「JVM」调优参数总结

JVM快速调优手册之六: JVM参数设置及分析

阿里面试100%问到,JVM性能调优篇

jvm调优

常用jvm参数配置

jvm的调优