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 公布!