一、JVM的参数类型
(1)标配参数(以-开头)
java -version
java -help
java -showversion
在JDK各个版本之间稳定,很少有大的变化。
[标准VM参数表]
参数名称 | 描述 | 默认值 |
---|---|---|
-d32 | 使用 32 位数据模型 (如果可用) | / |
-d64 | 使用 64 位数据模型 (如果可用) | / |
-server | 选择 "server" VM | 默认 VM 是 server,因为您是在服务器类计算机上运。 |
-cp <目录和 zip/jar 文件的类搜索路径> | / | / |
-classpath <目录和 zip/jar 文件的类搜索路径> | 用 : 分隔的目录,JAR 档案和 ZIP 档案列表,用于搜索类文件 | / |
-D<名称>=<值> | 设置系统属性 | / |
-verbose:[class或gc或jni] | 启用详细输出 | / |
-version | 输出产品版本并退出 | / |
-version:<值> | / | Deprecated |
-showversion | 输出产品版本并继续 | / |
-jre-restrict-search或-no-jre-restrict-search | / | Deprecated |
-? -help | 输出此帮助消息 | / |
-X | 输出非标准选项的帮助 | / |
-ea[:<包名、类名>] | 断言 | / |
-enableassertions[:<包名、类名>] | 按指定的粒度启用断言 | / |
-da[:<包名、类名>] | / | / |
-disableassertions[:<包名、类名>] | 禁用具有指定粒度的断言 | / |
-esa 或-enablesystemassertions | 启用系统断言 | / |
-dsa 或-disablesystemassertions | 禁用系统断言 | / |
-agentlib:<libname>[=<选项>] | 加载本机代理库 <libname> | 例如 -agentlib:hprof另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help |
-agentpath:<pathname>[=<选项>] | 按完整路径名加载本机代理库 | / |
-javaagent:<jarpath>[=<选项>] | 加载 Java 编程语言代理, 请参阅 java.lang.instrument | / |
-splash:<imagepath> | 使用指定的图像显示启动屏幕 | / |
(2)X参数(以-X开头)
- -Xint 解释执行
- -Xcomp 第一次使用就编译成本地代码(先编译)
- -Xmixed 混合模式(先编译后执行)--默认
(3)XX参数--只有类2种类型(以-XX开头)
【1】Boolean类型XX参数 公式:-XX:+ 或者-XX:- 某个属性值(+表示开启,-表示关闭)
案例:
1)是否打印GC收集细节
-XX:+PrintGCDetails
-XX:-PrintGCDetails
2)是否使用串行垃圾收集器
-XX:+UseSerialGC
-XX:-UserSerialGC
代码验证:
jps -l 表示查看java运行的进程号
jinfo -flag PrintGCDetails pid 表示查看JVM是否配置PrintGCDetails参数
-XX:-PrintGCDetails 减号表示没有配置PrintGCDetails参数
配置JVM -XX:+PrintGCDetails参数
重新启动main方法:
【2】KV设值类型 公式:-XX: key(属性)= value(属性值)
案例一: 查看-XX:MetaspaceSize=默认值大小
-XX:MetaspaceSize=21807104(大约20.8MB)
案例二:添加-XX:MetaspaceSize=1024m参数
查看-XX:MetaspaceSize=人工设置值大小
-XX:MetaspaceSize=1073741824(1024MB)
案例三:查看-XX:MaxTenuringThreshold=默认值大小
-XX:MaxTenuringThreshold=15表示年轻代对象年龄达到15岁就会进入老年代
二、jinfo查看当前运行程序配置:公式:jinfo -flag 配置项 进程号
案例: 查看JVM所有配置项(默认+人工配置)
jinfo -flags 进程号
Non-default VM flags表示JVM默认参数
Command line表示人工配置参数
三、如何解释-Xms和-Xmx参数属于XX参数
-Xms和-Xmx两个经典参数看起既不像Boolean类型XX参数,也不像KV设值类型XX参数。那为什么-Xms和-Xmx又属于XX参数?
-Xms = -XX:InitialHeapSize
-Xmx = -XX:MaxHeapSize
四、盘点家底JVM默认值
(1)第一种查看JVM默认值方式
jinfo -flag 参数项 进程号
jinfo -flags 进程号
(2)第二种查看JVM默认值方式
公式:java -XX:+PrintFlagsInitial(查看jvm未更改的默认参数)
公式:java -XX:+PrintFlagsFinal(查看jvm已经更改过的参数)
:=表示jvm启动时候默认修改或者人工更改过的参数
=表示jvm没有更改过的默认参数
uintx InitialHeapSize := 266338304 {product} 默认为操作系统64/1内存(我本机内存为16G)
(3)-XX:+PrintFlagsFinal举例:运行java命令的同时打印jvm参数
(4)-XX:+PrintCommandLineFlags打印命令行参数
五、XX参数总结
参数名称 | 含义 | 默认值/备注 |
---|---|---|
-Xms | 初始堆大小 | 物理内存的1/64(<1GB) 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制 |
-Xmx | 最大堆大小 | 物理内存的1/4(<1GB) 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制 |
-Xmn | 新生代大小(jdk 1.4或以上版本) | 增大新生代后,将会减小老年代大小。此值对系统性能影响较大。Sun官方推荐配置为整个堆的3/8 |
-Xss | 每个线程的堆栈大小 | JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K,可以带 K, M 或 G单位 |
-XX:ThreadStackSize | 同上 | 0代表使用默认值,不能带单位 |
-XX:PermSize | 设置永久代初始值 | 物理内存的1/64 |
-XX:MaxPermSize | 设置永久代最大值 | 物理内存的1/4 |
-XX:NewRatio | 新生代(包括Eden和两个Survivor区)与老年代的比值(除去永久代) | -XX:NewRatio=4表示新生代与老年代所占比值为1:4,新生代占整个堆栈的1/5,Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置。 |
-XX:SurvivorRatio | Eden区与Survivor区的大小比值 | 设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个新生代的1/10 |
-XX:LargePageSizeInBytes | 内存页的大小不可设置过大, 会影响Perm的大小 | =128m |
-XX:+UseFastAccessorMethods | 原始类型的快速优化 | / |
-XX:+DisableExplicitGC | 关闭System.gc() | 这个参数需要严格的测试 |
-XX:MaxTenuringThreshold | 垃圾最大年龄 | 如果设置为0的话,则新生代对象不经过Survivor区,直接进入老年代。对于老年代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则新生代对象会在Survivor区进行多次复制,这样可以增加对象再新生代的存活时间,增加在新生代即被回收的概率,该参数只有在串行GC时才有效 |
-XX:+AggressiveOpts | 加快编译 | / |
-XX:+UseBiasedLocking | 锁机制的性能改善 | / |
-Xnoclassgc | 禁用垃圾回收 | / |
-XX:SoftRefLRUPolicyMSPerMB | 每兆堆空闲空间中SoftReference的存活时间 | 1s |
-XX:PretenureSizeThreshold | 对象超过多大是直接在老年代分配 | 新生代采用Parallel Scavenge GC时无效,另一种直接在老年代分配的情况是大的数组对象,且数组中无外部引用对象. |
-XX:TLABWasteTargetPercent | TLAB占eden区的百分比 | 1% |
-XX:+CollectGen0First | FullGC时是否先YGC | false |
-XX:+UseParallelGC | Full GC采用parallel MSC | 见[GC参数][1] |
-XX:+UseParNewGC | 设置新生代为并行收集 | 可与CMS收集同时使用,JDK 5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值 |
-XX:ParallelGCThreads | 并行收集器的线程数 | 此值最好配置与处理器数目相等,同样适用于CMS |
-XX:+UseParallelOldGC | 老年代垃圾收集方式为并行收集(Parallel Compacting) | 这个是JAVA 6出现的参数选项 |
-XX:MaxGCPauseMillis | 每次新生代垃圾回收的最长时间(最大暂停时间) | 如果无法满足此时间,JVM会自动调整新生代大小,以满足此值. |
-XX:+UseAdaptiveSizePolicy | 自动选择新生代区大小和相应的Survivor区比例 | 设置此选项后,并行收集器会自动选择新生代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开 |
-XX:GCTimeRatio | 设置垃圾回收时间占程序运行时间的百分比 | 公式为1/(1+n) |
-XX:+ScavengeBeforeFullGC | Full GC前调用YGC | true |
-XX:+UseConcMarkSweepGC | 使用CMS内存收集 | 测试中配置这个以后, -XX:NewRatio=4的配置失效了,原因不明,所以此时新生代大小最好用-Xmn设置 |
-XX:+AggressiveHeap | 试图是使用大量的物理内存 | 长时间大内存使用的优化,能检查计算资源(内存, 处理器数量,至少需要256MB内存 |
-XX:CMSFullGCsBeforeCompaction | 多少次后进行内存压缩 | 由于并发收集器不对内存空间进行压缩,整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低 |
-XX:+CMSParallelRemarkEnabled | 降低标记停顿 | / |
-XX+UseCMSCompactAtFullCollection | 在FullGC的时候对老年代的压缩 | CMS是不会移动内存的, 因此这个非常容易产生碎片,导致内存不够用,因此内存的压缩这个时候就会被启用。增加这个参数是个好习惯。可能会影响性能,但是可以消除碎片 |
-XX:+UseCMSInitiatingOccupancyOnly | 使用手动定义初始化定义开始CMS收集 | 禁止hostspot自行触发CMS GC |
-XX:CMSInitiatingOccupancyFraction=70 | 使用cms作为垃圾回收使用70%后开始CMS收集 | 该值的设置需要满足以下公式CMSInitiatingOccupancyFraction计算公式 |
-XX:CMSInitiatingPermOccupancyFraction | 设置Perm Gen使用到达多少比率时触发 | 92 |
-XX:+CMSIncrementalMode | 设置为增量模式 | 用于单CPU情况 |
-XX:+CMSClassUnloadingEnabled | 永久代CMS方式GC | / |
-XX:+PrintGC | GC日志输出 | 和-verbose:gc一样 |
-XX:+PrintGCDetails | 同上 | 更详细 |
-XX:+PrintGCTimeStamps | 输出GC的时间戳 | 配合上述PrintGC参数使用,或者写成-XX:+PrintGC:PrintGCTimeStamps类似的 |
-XX:+PrintGC:PrintGCTimeStamps | / | 可与-XX:+PrintGC -XX:+PrintGCDetails混合使用 |
-XX:+PrintGCApplicationStoppedTime | 打印垃圾回收期间程序暂停的时间。可与上面混合使用 | 输出形式:Total time for which application threads were stopped: 0.0468229 seconds |
-XX:+PrintGCApplicationConcurrentTime | 打印每次垃圾回收前,程序未中断的执行时间 | 可与上面混合使用,输出形式:Application time: 0.5291524 seconds |
-XX:+PrintHeapAtGC | 打印GC前后的详细堆栈信息 | / |
-Xloggc:filename | 把相关日志信息记录到文件以便分析 | 与上面几个配合使用 |
-XX:+PrintClassHistogram | 在控制台按下Ctrl+Break后,打印类的信息 | / |
-XX:+PrintClassHistogramBeforeFullGC | FullGC前打印类信息 | / |
-XX:+PrintTLAB | 查看TLAB空间的使用情况 | / |
XX:+PrintTenuringDistribution | 查看每次minor GC后新的存活周期的阈值 | / |
-ea | 开启assert断言 | / |
-Xprof | 性能诊断 | / |
-Xrunhprof | 性能诊断 | / |
-XX:+TraceClassLoading | 打印类加载过程的信息 | 类似 [Loaded java.util.AbstractList$Itr from /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/rt.jar] |
-XX:+TraceClassUnloading | 打印类卸载的过程信息 | / |
Xbootclasspath | 指定加载不需要校验的类 | 跳过必要的类加载前的校验,能够减少加载时间,但是不安全 |
-XX:+PrintCompilation | 打印Hotspot使用JIT 编译的方法名称 | / |
-XX:+HeapDumpOnOutOfMemoryError | OM时生成heap dump | 默认输出在存放类文件的根文件夹 |
-XX:HeapDumpPath | 设置输出OM dump文件路径 | 配合-XX:+HeapDumpOnOutOfMemoryError使用 |