JVM 参数说明

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
云原生网关 MSE Higress,422元/月
可观测可视化 Grafana 版,10个用户账号 1个月
简介: JVM 参数说明

@[toc]

JVM 参数说明


1、废弃 CMS GC

Java 9 废弃了 CMS GC ,原因是 CMS 参数太多,太复杂,因此相关参数不可用
JVM 后续默认使用 G1 算法,通过配置消除重复字符串,可以降低内存使用
也可以配置使用 ZGC 算法,它有更低的 GC 停顿,一般小于 10ms,需要 Java 11 以上

2、常用相关参数

Params

// 一定要作为第一个参数,在多个CPU时性能佳
-server


// 在控制台输出 GC 情况
-verbose:gc


// 不验证类,在运行受信任的代码时,可以加上该参数以提供运行速度
-noverify

-X Params

// JVM 的初始分配内存
// 在服务端生产环境时,设置为与 -Xmx 值一致,避免垃圾回收时,重新分配内存
// 开发环境下时,可以设置较小,避免 IDE 直接启动就有较高的内存占用
-Xms256m

// JVM 最大可用内存
-Xmx2048m

// 设置年轻代内存大小
// 整个JVM内存大小= 年轻代大小 + 年老代大小 + 持久代大小(一般为固定 64M)
-Xmn256m


// 记录GC日志,这里建议写成绝对路径
// Java 11 里面已经标记该参数为 deprecated ,将被弃用
// 使用 -Xlog:gc 代替该参数
-Xloggc

-XX Params

// 元空间初始大小
-XX:MetaspaceSize  (windows 下默认值 21MB)
// 元空间最大可分配大小
-XX:MaxMetaspaceSize  (默认值为 -1)

1、如果不指定元空间的大小,默认情况下,元空间最大的大小是系统内存的大小,元空间一直扩大,虚拟机可能会消耗完所有的可用系统内存
2、如果元空间内存不够用,就会报OOM
3、一旦元空间触及 -XX:MetaspaceSize 值,会触发 Full GC



// 最大堆栈跟踪深度
-XX:MaxJavaStackTraceDepth=10000


// 省略异常信息快速抛出异常 (JVM 默认开启了这个优化,如果想关闭,则配置该值)
// 开启后,如果异常过多,比如几千次后,异常将不会打印堆栈信息
-XX:-OmitStackTraceInFastThrow


// 当发生 OOM 时,自动生成 DUMP 文件
-XX:+HeapDumpOnOutOfMemoryError
// 可以通过 -XX:HeapDumpPath 指定文件的存放目录,该参数不会去创建目录,所以需要保证目录事先存在
// 例如(当前目录) -XX:HeapDumpPath=./
// 例如(绝对路径) -XX:HeapDumpPath=/usr/local/
-XX:HeapDumpPath=目录


// 最大并行编译数,用于提高编译速度,但是并不明显
// 缺点是会影响系统稳定性,增加 JVM 崩溃的可能性
// 开发环境下,可以设置为 2
-XX:CICompilerCount=2


// 通过反射 JVM 自己创建的 Class 对象都是 SoftReference (软引用)
// -XX:SoftRefLRUPolicyMSPerMB 设置的是每一 MB 的空闲内存空间中,可以允许 SoftReference 存活多少 MS
// 他的存活表达式为 clock - timestamp <= freespace * SoftRefLRUPolicyMSPerMB , 如果条件成立,则会被回收
// 如果该值被设置为 0 ,会导致刚创建软引用被立马回收导致频繁 GC
// 假设空闲内存为 1500MB,我们设置该值为 200,则存活时间为 6 分钟
// 开发时需要频道启停,且有非常多的项目在本地时,可以设置该值较小,可以节省 IDEA 的资源占用
-XX:SoftRefLRUPolicyMSPerMB=200


// 意思为使用 CMS 垃圾回收器
// CMS 为基于标记清除算法实现的多线程老年代垃圾回收器
// CMS 为响应时间优先的垃圾回收器,适合于应用服务器,如网络游戏,电商等和电信领域的应用
// CMS 与应用程序并发执行,回收时间段内,大部分时间应用程序可以继续执行,停顿较短,但是对 CPU 消耗会加大
// 该参数在 Java 9 中已经标记为 deprecated ,在 Java 11 中已经不可用
-XX:+UseConcMarkSweepGC


// 开启 CMS 并行收集
// 但是需要注意的是,CMSParallelRemarkEnabled 不是 FullGC
-XX:+CMSParallelRemarkEnabled


// 使用 Concurrent gc 情况下,防止 Memory Fragmention,减少 Memory 碎片
-XX:+UseCMSCompactAtFullCollection


// get,set 方法转成本地代码(对于jvm来说是冗余代码,jvm将进行优化)
-XX:+UseFastAccessorMethods


// 指示只有在 old generation 在使用了初始化的比例后concurrent collector 启动收集
-XX:+UseCMSInitiatingOccupancyOnly


// 设置代码缓存的大小 (它是用来存储已编译方法生成的本地代码)
// 如果代码缓存满了,将无法使用 JIT 编译(被停用了),导致 CPU 占用飙升
// Java 8 client 端的默认值为 32 MB, server 端为 240 MB
// 当本地有非常多的项目,需求迭代频繁时,可以增大该值
-XX:ReservedCodeCacheSize=240m


// 让 JVM 使用大内存分页,防止 TLB miss 的过多发生,导致访问内存分页表,降低性能
-XX:-UseLargePages


// 使用大内存分页的大小
-XX:LargePageSizeInBytes=128m


// 打印 GC 时候的详细,与 -verbose:gc 是一个功能
// 区别是 -verbose:gc 是稳定版本,PrintGC 是非稳定版本,可能在未通知的情况下删除
// 但是 -XX 更好用
// -XX:+PrintGC   输出 GC 日志
// -XX:+PrintGCDetails  输出 GC 的详细日志
// -XX:+PrintGCTimeStamps  输出 GC 的时间戳(以基准时间的形式)
// -XX:+PrintGCDateStamps  输出 GC 的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
// -XX:+PrintHeapAtGC  在进行 GC 的前后打印出堆的信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC -Xloggc:${LOG_DIR}/gc.log"


// 它定义了新生代中Eden区域和Survivor区域(From幸存区或To幸存区)的比例,默认为8,也就是说Eden占新生代的8/10,From幸存区和To幸存区各占新生代的1/10
// 参考以下公式
// Eden = (R*Y)/(R+1+1)
// From = Y/(R+1+1)
// To   = Y/(R+1+1)
//
// 其中:
// R:SurvivorRatio比例
// Y:新生代空间大小
-XX:SurvivorRatio


// NewRatio = 4 代表新生代老年代的比例为 1:4,也就是年轻代占堆的 1/5
-XX:NewRatio


// 让代码主动 GC 失效,也就是 System.gc() 不会生效
// 但是弊端是某些框架使用堆外内存,必须使用 System.gc() 来释放,如果不能释放就可能导致内存一直增长,造成内存泄漏
-XX:+DisableExplicitGC


// 选择垃圾收集器为并行收集器。此配置仅对年轻代有效。
// 可以同时并行多个垃圾收集线程,但此时用户线程必须停止。
-XX:+UseParallelGC


// 设置年轻代为多线程收集。可与CMS收集同时使用。
// 在serial基础上实现的多线程收集器
-XX:+UseParNewGC


// 设置并发 CMS 的线程数量
-XX:ParallelCMSThreads=4
相关文章
|
5月前
|
DataWorks Java 关系型数据库
DataWorks常见问题之将预警信息发送至邮箱
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
|
3月前
|
缓存 安全 算法
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
31 0
|
2月前
|
Java
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
|
2月前
|
C# 开发者 Windows
震撼发布:全面解析WPF中的打印功能——从基础设置到高级定制,带你一步步实现直接打印文档的完整流程,让你的WPF应用程序瞬间升级,掌握这一技能,轻松应对各种打印需求,彻底告别打印难题!
【8月更文挑战第31天】打印功能在许多WPF应用中不可或缺,尤其在需要生成纸质文档时。WPF提供了强大的打印支持,通过`PrintDialog`等类简化了打印集成。本文将详细介绍如何在WPF应用中实现直接打印文档的功能,并通过具体示例代码展示其实现过程。
133 0
|
3月前
|
运维 Java Linux
(九)JVM成神路之性能调优、GC调试、各内存区、Linux参数大全及实用小技巧
本章节主要用于补齐之前GC篇章以及JVM运行时数据区的一些JVM参数,更多的作用也可以看作是JVM的参数列表大全。对于开发者而言,能够控制JVM的部分也就只有启动参数了,同时,对于JVM的性能调优而言,JVM的参数也是基础。
|
2月前
|
运维 监控 Java
【JVM 调优秘籍】实战指南:JVM 调优参数全解析,让 Java 应用程序性能飙升!
【8月更文挑战第24天】本文通过一个大型在线零售平台的例子,深入探讨了Java虚拟机(JVM)性能调优的关键技术。面对应用响应延迟的问题,文章详细介绍了几种常用的JVM参数调整策略,包括堆内存大小、年轻代配置、垃圾回收器的选择及日志记录等。通过具体实践(如设置`-Xms`, `-Xmx`, `-XX:NewRatio`, `-XX:+UseParallelGC`等),成功降低了高峰期的响应时间,提高了系统的整体性能与稳定性。案例展示了合理配置JVM参数的重要性及其对解决实际问题的有效性。
55 0
|
3月前
|
存储 Java
java 服务 JVM 参数设置配置
java 服务 JVM 参数设置配置
63 3
|
5月前
|
缓存 算法 安全
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(二)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
58 0
|
5月前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
146 0
|
2月前
|
算法 Java
JVM常用运行时参数说明
JVM常用运行时参数说明