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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: JVM参数太多?一网打尽常用JVM参数!

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

image.png

-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调优

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

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

本篇文章笔记以及案例被收入 gitee-StudyJavagithub-StudyJava 感兴趣的同学可以stat下持续关注喔~

有什么问题可以在评论区交流,如果觉得菜菜写的不错,可以点赞、关注、收藏支持一下~

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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
28天前
|
监控 架构师 Java
JVM进阶调优系列(6)一文详解JVM参数与大厂实战调优模板推荐
本文详述了JVM参数的分类及使用方法,包括标准参数、非标准参数和不稳定参数的定义及其应用场景。特别介绍了JVM调优中的关键参数,如堆内存、垃圾回收器和GC日志等配置,并提供了大厂生产环境中常用的调优模板,帮助开发者优化Java应用程序的性能。
|
4月前
|
缓存 安全 算法
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
45 0
|
1月前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
43 3
|
1月前
|
Java Android开发 开发者
【编程进阶知识】精细调控:掌握Eclipse JVM参数配置的艺术
本文详细介绍了如何在Eclipse中配置JVM参数,包括内存的初始和最大值设置。通过具体步骤和截图演示,帮助开发者掌握JVM参数的精细调控,以适应不同的开发和测试需求。
41 1
|
3月前
|
Java
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
|
4月前
|
运维 Java Linux
(九)JVM成神路之性能调优、GC调试、各内存区、Linux参数大全及实用小技巧
本章节主要用于补齐之前GC篇章以及JVM运行时数据区的一些JVM参数,更多的作用也可以看作是JVM的参数列表大全。对于开发者而言,能够控制JVM的部分也就只有启动参数了,同时,对于JVM的性能调优而言,JVM的参数也是基础。
102 8
|
3月前
|
C# 开发者 Windows
震撼发布:全面解析WPF中的打印功能——从基础设置到高级定制,带你一步步实现直接打印文档的完整流程,让你的WPF应用程序瞬间升级,掌握这一技能,轻松应对各种打印需求,彻底告别打印难题!
【8月更文挑战第31天】打印功能在许多WPF应用中不可或缺,尤其在需要生成纸质文档时。WPF提供了强大的打印支持,通过`PrintDialog`等类简化了打印集成。本文将详细介绍如何在WPF应用中实现直接打印文档的功能,并通过具体示例代码展示其实现过程。
292 0
|
4月前
|
存储 Java
java 服务 JVM 参数设置配置
java 服务 JVM 参数设置配置
148 3
|
4月前
|
安全 Java fastjson
JVM 配置参数 -D,-X,-XX 的区别
JVM 配置参数 -D,-X,-XX 的区别
80 2
|
3月前
|
运维 监控 Java
【JVM 调优秘籍】实战指南:JVM 调优参数全解析,让 Java 应用程序性能飙升!
【8月更文挑战第24天】本文通过一个大型在线零售平台的例子,深入探讨了Java虚拟机(JVM)性能调优的关键技术。面对应用响应延迟的问题,文章详细介绍了几种常用的JVM参数调整策略,包括堆内存大小、年轻代配置、垃圾回收器的选择及日志记录等。通过具体实践(如设置`-Xms`, `-Xmx`, `-XX:NewRatio`, `-XX:+UseParallelGC`等),成功降低了高峰期的响应时间,提高了系统的整体性能与稳定性。案例展示了合理配置JVM参数的重要性及其对解决实际问题的有效性。
96 0