我正在参与「启航方案」

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日志信息

JVM参数太多?一网打尽常用JVM参数!

-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相关参数能够参阅官方文档: docs.oracle.com/javase/8/do…

本篇文章介绍常用JVM参数,主要有GC日志、运转时数据区(栈、堆、元空间、直接内存)、OOM、废物搜集器相关的参数,有用了解参数能够更好的进行JVM调优

最后

  • 参阅资料

    • 《深化了解Java虚拟机》

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

觉得菜菜写的不错,能够点赞、关注支撑哟~

有什么问题能够在谈论区沟通喔~