我正在参与「启航方案」
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相关参数能够参阅官方文档: docs.oracle.com/javase/8/do…
本篇文章介绍常用JVM参数,主要有GC日志、运转时数据区(栈、堆、元空间、直接内存)、OOM、废物搜集器相关的参数,有用了解参数能够更好的进行JVM调优
最后
-
参阅资料
- 《深化了解Java虚拟机》
本篇文章将被收入JVM专栏,觉得不错感兴趣的同学能够收藏专栏哟~
觉得菜菜写的不错,能够点赞、关注支撑哟~
有什么问题能够在谈论区沟通喔~