JVM 参数说明

本文涉及的产品
应用实时监控服务-应用监控,每月50GB免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
函数计算FC,每月15万CU 3个月
简介: 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
相关文章
|
2月前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
6月前
|
缓存 安全 算法
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
71 0
|
3月前
|
监控 架构师 Java
JVM进阶调优系列(6)一文详解JVM参数与大厂实战调优模板推荐
本文详述了JVM参数的分类及使用方法,包括标准参数、非标准参数和不稳定参数的定义及其应用场景。特别介绍了JVM调优中的关键参数,如堆内存、垃圾回收器和GC日志等配置,并提供了大厂生产环境中常用的调优模板,帮助开发者优化Java应用程序的性能。
|
3月前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
130 3
|
3月前
|
Java Android开发 开发者
【编程进阶知识】精细调控:掌握Eclipse JVM参数配置的艺术
本文详细介绍了如何在Eclipse中配置JVM参数,包括内存的初始和最大值设置。通过具体步骤和截图演示,帮助开发者掌握JVM参数的精细调控,以适应不同的开发和测试需求。
66 1
|
5月前
|
Java
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
|
6月前
|
运维 Java Linux
(九)JVM成神路之性能调优、GC调试、各内存区、Linux参数大全及实用小技巧
本章节主要用于补齐之前GC篇章以及JVM运行时数据区的一些JVM参数,更多的作用也可以看作是JVM的参数列表大全。对于开发者而言,能够控制JVM的部分也就只有启动参数了,同时,对于JVM的性能调优而言,JVM的参数也是基础。
141 8
|
5月前
|
C# 开发者 Windows
震撼发布:全面解析WPF中的打印功能——从基础设置到高级定制,带你一步步实现直接打印文档的完整流程,让你的WPF应用程序瞬间升级,掌握这一技能,轻松应对各种打印需求,彻底告别打印难题!
【8月更文挑战第31天】打印功能在许多WPF应用中不可或缺,尤其在需要生成纸质文档时。WPF提供了强大的打印支持,通过`PrintDialog`等类简化了打印集成。本文将详细介绍如何在WPF应用中实现直接打印文档的功能,并通过具体示例代码展示其实现过程。
472 0
|
6月前
|
存储 Java
java 服务 JVM 参数设置配置
java 服务 JVM 参数设置配置
177 3
|
6月前
|
安全 Java fastjson
JVM 配置参数 -D,-X,-XX 的区别
JVM 配置参数 -D,-X,-XX 的区别
124 2