JVM提供的参数十分多,并且各种类型的参数可能提供不同的性能

了解JVM运行原理和相熟罕用JVM参数可能帮忙咱们更好的进行调优

本篇文章将介绍JVM参数的分类,以及GC日志、运行时内存区、OOM、垃圾收集器相干的罕用参数

罕用JVM参数

JVM参数能够分为三种类型,别离是以--X-XX结尾的参数

-结尾的参数比较稳定,后续版本根本不变,如-version 查看版本信息

-X结尾的参数比较稳定,后续版本可能扭转,如-Xmx设置初始堆内存大小

-XX结尾的参数不稳固,后续版本会变动,如-XX:MetaspaceSize 设置元空间大小

GC日志相干

通过GC日志可能剖析JVM产生GC时各个数据区的状况

-XX:+PrintGC-verbose:gc 输入简略GC日志信息

-XX:+PrintGCDeatils 输入具体GC日志信息

-XX:+PrintGCTimeStamps-XX:+PrintGCDateStamps 则是在具体输入GC日志信息的根底上减少工夫,前者输入程序运行工夫,后者输入工夫戳

其余参数还有 -Xloggc:d:\gc.log 将GC信息输入到d:\gc.log文件;-XX:PrintHeapAtGC 每次GC前后打印堆信息等

运行时数据区相干

JVM有对各种运行时数据区(栈、堆、办法区、间接内存)的参数,常应用-XX命令,有些命令也可用-X来代替

-XX:ThreadStackSize=100k 设置栈内存大小100k,能够应用 -Xss100k代替

栈是线程公有的,设置太大且创立线程多的场景下,可能会内存不足导致OOM

-XX:InitalHeapSize=100m 设置堆内存初始化为100m,能够应用 -Xms100m代替

-XX:MaxHeapSize=100m 设置最大堆内存为100m,能够应用 -Xmx100m代替

-Xms-Xmx设置成一样的值时,JVM就不须要对堆内存扩容,可能优化一些性能,但占用内存少时可能造成节约

当咱们的开发工具idea比拟卡时,能够用这两个参数将idea堆内存进行调整(idea 也是Java过程)

-Xmn2g 设置年老代最大内存为2g,等同于-XX:NewSize=2g+-XX:MaxNewSize=2g

-XX:+UseAdaptiveSizePolicy 主动抉择各区比例大小(默认开启)

-XX:SurvivorRatio=8 设置survivor:Eden占比为 1:1:8(如果-XX:+UseAdaptiveSizePolicy是开启的,survivor:eden比例会被主动调成为1:1:6)

-XX:NewRatio=2 设置年老代:老年代占比为 1:2

察看GC日志,如果是因为年老代空间不够导致频繁minor GC,能够适当调整年老代与老年代比例

-XX:PretenureSizeThreadshold=2014 设置内存大于此值(byte)的对象作为大对象间接调配到老年代

-XX:MaxTenuringThreshold=15 对象年龄超过15进入老年代

-XX:+PrintTenuringDistribution JVM每次MinorGC后打印出以后应用的Survivor中对象的年龄散布

-XX:TargetSurvivorRatio MinorGC完结后Survivor区域中占用空间的冀望比例

办法区

-XX:MetaspaceSize 元空间初始大小

-XX:MaxMetasoaceSize 元空间最大大小

-XX:+UseCompressedOops 应用压缩对象指针

-XX:+UseCompressedClassPointers 应用压缩类执行

-XX:ComporessedClassSpaceSize 设置ClassMetaspace大小,默认1g

要回收元空间时只能触发FULL GC,频繁触发FULL GC也可能是元空间大小不够

运行时产生大量动静类可能导致元空间被占满从而抛出OOM

面对这两种状况能够适当调整元空间大小

间接内存

-XX:MaxDiectMemorySize 设置间接内存大小,未指定则和最大堆内存统一

OOM相干

-XX:+HeapDumpOutOfMemoryError 产生OOM时生成堆dump文件

-XX:+HeapDumpBeforeFullGC 产生FullGC时生成堆dump文件(OOM前会屡次FullGC也就是可能屡次生成dump文件)

-XX:HeapDumpPath=d:\指定生成堆dump文件门路为d:\ (默认生成的dump文件在我的项目当前目录下)

-XX:OnOutOfMemoryError=/opt/restart.sh 产生OOM时去执行/opt/restart.sh文件

垃圾收集器相干

Serial 串行收集器

-XX:+UseSerialGC 年老代,老年代都应用串行收集器

ParNew 并行收集器

-XX:+UseParNewGC 年老代应用ParNew收集器

JDK14 CMS被移除 没有老年代收集器配合 , 被废除

Parallel 吞吐量优先并行收集器

-XX:+UseParallelGC-XX:+UseParallelOldGC 应用任意一个参数,新生代、老年代就会应用Parallel收集器

-XX:ParallelGCThreads 设置年老代并行收集线程数 (CPU数 < 8 设置与外围数雷同;CPU数 > 8 设置线程数 = 3 + (5 * 外围数) / 8)

-XX:+UseAdaptiveSizePolicy 自适应调节策略

-XX:MaxGCPauseMillis 设置最大STW工夫,单位ms

Parallel 主打高吞吐量优先,该参数具体值最好由-XX:+UseAdaptiveSizePolicy来调配

-XX:GCTimeRatio=N 垃圾收集工夫占比(1/N+1)

用于掂量吞吐量,该值设置越大就与设置最大STW工夫-XX:MaxGCPauseMillis 矛盾,不能同时应用

CMS 并发收集器

-XX:+UseConcMarkSweepGC老年代应用CMS垃圾收集器,新生代应用ParNew收集器

-XX:CMSInitiatingOccupancyFraction设置老年代应用多少空间时开始垃圾回收

如果设置的太高,不够内存调配不能满足并发执行,就会解冻用户线程启动Serial Old收集器,进展工夫就会变长(如果内存增长迟缓能够设置高一些,如果内存增长很快就要设置低一些 默认92%)

-XX:+UseCMSCompactAtFullCollection指定在FULL GC后是否对内存进行压缩整顿

(开启后,通过-XX:CMSFullGCsBeforeCompaction设置执行多少次FULL GC后进行内存压缩整顿

-XX:ParallelCMSThreads 设置CMS线程数量

G1 低提早分代收集器

-XX:+UseG1GC 应用G1收集器

-XX:G1HeapRegionSize设置每个region大小

-XX:MaxGCPauseMillis设置预期进展工夫 (默认200ms,最好不要太小)

-XX:ParallelGCThread设置STW时GC线程数

-XX:ConcGCThreads设置并发标记线程数

-XX:InitiatingHeapOccupancyPercent设置触发老年代GC的堆占用率阈值

应用G1时最好不要应用-XX:NewRatio-Xmn,会影响G1主动调节

总结

查看其余更多JVM相干参数能够参考官网文档: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/ja...

本篇文章介绍罕用JVM参数,次要有GC日志、运行时数据区(栈、堆、元空间、间接内存)、OOM、垃圾收集器相干的参数,无效了解参数能够更好的进行JVM调优

最初(一键三连求求拉~)

本篇文章将被支出JVM专栏,感觉不错感兴趣的同学能够珍藏专栏哟~

本篇文章笔记以及案例被支出 gitee-StudyJava、 github-StudyJava 感兴趣的同学能够stat下继续关注喔\~

有什么问题能够在评论区交换,如果感觉菜菜写的不错,能够点赞、关注、珍藏反对一下\~

关注菜菜,分享更多干货,公众号:菜菜的后端私房菜

本文由博客一文多发平台 OpenWrite 公布!