@[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