# 一、JVM 启动参数规则

【1】以-开头的都是标准参数,所有JVM都支持,并且向后兼容。

-version:gc
-server
1
2

【2】以-X开头的为非标准参数,绝大多数都是控制JVM的参数。在不同版本的jvm中,参数可能会有所不同,并不保证所有jvm实现都满足,且不保证向后兼容。可以通过java -X查看非标准参数。

-Xmx2G  
-Xms2G 
-Xloggc:/data/kinyang/log/gc.%t.log
1
2
3

【3】以-XX:开头的为非稳定参数,专门用于控制JVM行为。主要用于JVM的调优和debug操作。将来可能会随时取消,需要慎重使用。

-XX:+UseParNewGC  
-XX:CompileThreshold=10  	
-XX:HeapDumpPath=/data/kinyang/dump/heap/
1
2
3

WARNING

-XX:+启用option,例如:-XX:+PrintGCDetails启动打印GC信息的选项,其中+号表示true,开启的意思
-XX:-不启用option,例如:-XX:-PrintGCDetails关闭启动打印GC信息的选项,其中-号表示false,关闭的意思
-XX:=设定option的值为数字类型,可跟单位,例如32k, 1024m,2g。例如:-XX:MaxPermSize=64m
-XX:=设定option的值为字符串,例如:-XX:HeapDumpPath="/data/kinyang/dump/heap/"

【4】以-D开头的是系统参数赋值(可以是系统默认有的参数,也可以是自己定义的参数),在程序中可以通过System.getProperty(key)获取和通过System.setProperty(key, value)进行设置

-Dfile.encoding=UTF-8 
-Dlog.path=/data/kinyang/test/log/
1
2

# 二、X参数

参数 含义 默认值 示例 说明
-Xms 初始堆大小 物理内存的1/64(<1GB) -Xms7372m
-Xmx 最大堆大小 物理内存的1/4(<1GB) -Xmx12288m 尽量设置的跟-Xms一样,防止因为内存不断增加后突然收缩带来的性能影响
-Xmn 新生代大小 -Xmn256M 这个参数影响性能,尽量设置小一点
-Xss 指定线程栈的大小 -Xss256k 一般来说,WEBX框架下的应用需要256k
-Xloggc gc日志文件路径 -Xloggc:/usr/local/gc_%t_%p.log 将gc信息打印到指定的文件中,通过时间戳生成文件名

# 三、XX参数

参数 含义 示例 说明
-XX:MetaspaceSize 设置元空间大小 -XX:MetaspaceSize=128m 永久代被元空间取代,同时元空间不像永久代一样受制于堆内存。
元空间是基于操作系统内存的,理论上讲,可以一直扩展内存直到操作系统的极限,
所以设置元空间大小时,建议加上-XX:MaxMetaspaceSize参数,给个范围限制,和-XX:MetaspaceSize参数值一样。
一般设置成256M即可,避免元空间占用的内存一直增长。
-XX:MaxMetaspaceSize 设置元空间最大大小 -XX:MaxMetaspaceSize=256m
-XX:MaxGCPauseMillis GC最大的停顿毫秒数 -XX:MaxGCPauseMillis=200 默认情况下,VM没有暂停时间目标值。参数应谨慎使用,太小的值将会导致更高频率的GC
-XX:+UseG1GC 使用G1收集器
-XX:-OmitStackTraceInFastThrow 关闭“省略异常栈信息从而快速抛出” 默认打开 必须关闭,否则会导致异常信息打印不全。
例如:只有java.lang.NullPointerException信息,没有完整的具体信息,展示什么地方为空的堆栈信息。
-XX:MinHeapFreeRatio JVM堆最小空闲比率 -XX:MinHeapFreeRatio=30 默认值40,当堆空间的空闲内存小于这个数值时,jvm便会扩展堆空间
-XX:MaxHeapFreeRatio 设置堆空间的最大空间比例 -XX:MaxHeapFreeRatio=50 默认值80,当堆空间的空闲内存大于这个数值时,jvm便会缩小堆空间
-XX:CICompilerCount 最大并行编译器线程数 -XX:CICompilerCount=3
-XX:ActiveProcessorCount 确定可用处理器的数量 -XX:ActiveProcessorCount=4 覆盖VM用于计算其用于各种操作 (例如GC和ForkJoinPool) 的线程池大小的CPU数量
在docker容器中运行多个Java进程时, 此标志对于分区CPU资源很有用
-XX:+PreserveFramePointer 精准的获取栈结构 火焰图相关,会导致一定的性能损耗
-XX:+PrintGC 垃圾回收时信息打印 与-verbose:gc功能一致
-verbose:gc 是稳定版本的参数;-XX:+PrintGC,由于是 -XX 开头可能在未来版本删除非稳定
-XX:+PrintGCDetails 输出详细的GC收集日志的信息
-XX:+PrintGCDateStamps 输出GC的时间戳 以日期的形式,如 2013-05-04T21:53:59.234+0800
-XX:+UseGCLogFileRotation 实现 GC 日志轮转 -XX:+UseGCLogFileRotation 当日志文件大小增加到 32MB,JVM 会进行 GC 日志轮转生成最多5个文件,扩展名分别为 gc.log.0、gc.log.1、gc.log.2、gc.log.3和 gc.log.4。
如果应用不断产生更多的 GC 日志,gc.log.0中的旧日志内容会被删除,新产生的 GC 事件将写入 gc.log.0。
这意味着日志内容完整性早到破坏,即无法看到所有 GC 事件。
-XX:NumberOfGCLogFiles 日志文件轮转的文件个数 -XX:NumberOfGCLogFiles=5
-XX:GCLogFileSize 日志文件的最大存储量 -XX:GCLogFileSize=32M
-XX:+HeapDumpOnOutOfMemoryError 堆内存空间溢出时输出堆的内存快照 -XX:HeapDumpPath=目录时,参数表示生成DUMP文件的路径。默认为:java__heapDump.hprof。
-XX:HeapDumpPath=文件时,形如-XX:HeapDumpPath=d:\java_heapdump.hprof。
-XX:HeapDumpPath=/opt/logs/xxx Dump目录或文件
-XX:ConcGCThreads=4 并发GC的线程数 默认值取决于JVM可用的CPU数量
ConcGCThreads=ParallelGCThreads/4四舍五入
-XX:ParallelGCThreads=4 指定并行 GC 线程的数量 一般最好和 CPU 核心数量相当
当 CPU 数量小于8, ParallelGCThreads 的值等于 CPU 数量;
当 CPU 数量大于 8 时,则使用公式:ParallelGCThreads = 8 + ((N - 8) * 5/8) = 3 +((5*CPU)/ 8)
-XX:NewSize 设置年轻代最小空间大小
-XX:MaxNewSize 设置年轻代最大空间大小
-XX:NewRatio 设置年轻代和老年代的比值 默认值-XX:NewRatio=2,表示年轻代与老年代比值为1:2,年轻代占整个堆大小的1/3
-XX:SurvivorRatio 设置年轻代中Eden区Survivor区的容量比值 默认值-XX:SurvivorRatio=8,表示Eden : Survivor0 : Survivor1 = 8 : 1 : 1
-XX:MaxTenuringThreshold 新生代中对象存活次数 -XX:MaxTenuringThreshold=18 经过Minor GC的次数后仍然存活,就会晋升到老年代
-XX:+AlwaysPreTouch 真实分配物理内存给JVM -XX:+AlwaysPreTouch JVM的参数-Xmx和-Xms可以设置JVM的堆大小,但是此时操作系统分配的只是虚拟内存,只有JVM真正要使用该内存时,才会被分配物理内存。因为之前分配的只是虚拟内存,所以每次新建对象都需要操作系统来先分配物理内存,分配对象速度自然就降低了。使用-XX:+AlwaysPreTouch参数能够达到的效果就是,在服务启动的时候真实的分配物理内存给JVM,而不再是虚拟内存,效果是可以加快代码运行效率,缺点也是有的,毕竟把分配物理内存的事提前放到JVM进程启动时做了,自然就会影响JVM进程的启动时间,导致启动时间降低几个数量级。
-XX:ReservedCodeCacheSize 保留的编码缓存大小 -XX:ReservedCodeCacheSize=128m 作用是提高编码速度。将编码缓存保存在内存中,可以避免每次运行程序时都进行编码操作,从而大大缩短程序的运行时间。还可以减少系统对文件的访问次数,从而减小I/O的开销。这对于在移动设备上的应用程序很重要,因为移动设备的I/O速度很慢。

# 四、其他参数

参数 含义 说明
-Djava.util.concurrent.ForkJoinPool.common.parallelism=4 ForkJoinPool通用线程池的线程数量 默认值是运行时计算机的处理器数量
-Dport.http.server=8080 服务端口
-Dlog.server=/opt/logs/xx 服务日志路径
-Dport.shutdown.server=8081
-Ddocbase.server=/opt/app
-Dvdir.server=/myproject
-Djava.security.egd=file:/dev/./urandom
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=192.168.11.171
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8780
-Dcom.sun.management.jmxremote.rmi.port=8780
-Dcom.sun.management.jmxremote.local.only=false
-DAPPLOGDIR=/opt/logs/100198389/applog
-Djava.util.concurrent.ForkJoinPool.common.threadFactory=com.ctrip.forkjoinworkerthreadfactory.CtripForkJoinWorkerThreadFactory
-Dcatalina.base=/opt/tomcat
-Dcatalina.home=/opt/tomcat
-Djava.io.tmpdir=/opt/tomcat/temp
-Dignore.endorsed.dirs= -Djava.endorsed.dirs指定的目录面放置的jar文件,将有覆盖系统API的功能
-Djdk.tls.ephemeralDHKeySize=2048 DH密钥大小从1024位增加到2048位 一种安全协议,一种确保共享KEY安全穿越不安全网络的方法
(adsbygoogle = window.adsbygoogle || []).push({});