查看任何一个JVM参数的默认值
java -XX:+PrintFlagsFinal -version |grep MetaspaceSize
下面的模板摘自线上核心业务系统的jvm启动模板
-XX:-UseBiasedLocking
-XX:AutoBoxCacheMax=20000
-Xloggc:/filepath/gc.log
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath="/filepath/"
-XX:ErrorFile="/filepath/hs_err_pid<pid>.log"
-XX:+PrintCommandLineFlags
-XX:-OmitStackTraceInFastThrow
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
-XX:MaxTenuringThreshold=6
-XX:+ExplicitGCInvokesConcurrent
-XX:+ParallelRefProcEnabled
-server
-Xmx4g
-Xms4g
-XX:NewRatio=1
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=512m
server or client
服务端的形式启动jvm,会有很多系统参数的优化相对于client客户端的模式。java -version可以查看当前默认是Server模式还是Client模式
UseBiasedLocking
AutoBoxCacheMax
java的Integer对象中有一个IntegerCache缓存,IntegerCache有一个静态代码块,JVM在加载Integer这个类时,会优先加载静态的代码。当JVM进程启动完毕后, -128 ~ +127 范围的数字会被缓存起来,调用valueOf方法的时候,如果是这个范围内的数字,则直接从缓存取出。超过这个范围的则构造新的Integer对象。
loggc
PrintGCApplicationStoppedTime
PrintGCDateStamps
PrintGCDetails
HeapDumpOnOutOfMemoryError
HeapDumpPath
ErrorFile
错误文件,当java发生致命错误时,例如jdk的bug等。记录错误日志用于上报分析
PrintCommandLineFlags
可以让在程序运行前打印出用户手动设置或者JVM自动设置的XX参数的配置值
OmitStackTraceInFastThrow
省略异常栈信息从而快速抛出,默认为开启状态,如果开启该参数,JVM会对一些特定的异常类型做Fast Throw优化,如果检测到在代码里某个位置连续多次抛出同一类型异常的话(treat_throw_as_hot=true),则用Fast Throw方式来抛出异常,而异常Trace及详细的异常栈信息会被清空。这种异常抛出速度非常快,因为不需要在堆里分配内存,也不需要构造完整的异常栈信息
JVM只对几个特定类型异常开启了Fast Throw优化:
- NullPointerException
- ArithmeticException
- ArrayIndexOutOfBoundsException
- ArrayStoreException
- ClassCastException
UseConcMarkSweepGC
CMSInitiatingOccupancyFraction
CMS垃圾收集器,当老年代内存使用达到指定配置比例时,触发CMS垃圾回收
UseCMSInitiatingOccupancyOnly
指定HotSpot-VM总是使用-XX:CMSInitiatingOccupancyFraction的值作为old的空间使用率限制来启动CMS垃圾回收。如果没有使用-XX:+UseCMSInitiatingOccupancyOnly,那么HotSpot-VM只是利用这个值来启动第一次CMS垃圾回收,后面都是使用HotSpot-VM自动计算出来的值。
MaxTenuringThreshold
ExplicitGCInvokesConcurrent
System.gc()是正常FULL GC,会STW,打开此参数后,在做System.gc()时会做background模式CMS GC,即并行FULL GC,可提高FULL GC效率
注,该参数在允许systemGC且使用CMS GC时有效
ParallelRefProcEnabled
采用多线程的方式发现需要处理的finalize方法的对象,非多线程执行对象的finalize方法;如果应用有大量的引用或者finalizable对象需要处理,指定下面这个选项可以减少垃圾回收的时间,他会使用多个的引用处理线程,而不是单个线程。这个选项不会启用多线程运行方法的finalizer。他会使用很多线程去发现需要排队通知的finalizable对象。
mx
ms
NewRatio
新老代内存比,老年代:新生代,-XX:NewRatio=8 新老代内存比,老年代:新生代=8:1
SurvivorRatio
-XX:SurvivorRatio=8 新生代内存比,Eden园:survivor区=8:1,由于存活区survivor有两个,所以是2/10比例
MetaspaceSize
1.8之后不再有持久带概念,取而代之的为Metaspace,指定MetaspaceSize大小
Metaspace由于使用不断扩容到-XX:MetaspaceSize
参数指定的量,就会发生FGC;且之后每次Metaspace扩容都可能会发生FGC
MaxMetaspaceSize
与上面配置对应的最大值,默认是一个极大的值,例如:18446744073709547520
如果MaxMetaspaceSize设置太小,可能会导致频繁FullGC,甚至OOM
查看默认配置:java -XX:+PrintFlagsFinal -version |grep MetaspaceSize
PrintSafepointStatistics
PrintSafepointStatisticsCount
-XX:PrintSafepointStatisticsCount=1 打印安全点统计信息count值,与上面的PrintSafepointStatistics参数同时开启使用才会打印统计信息
ss
NativeMemoryTracking
Native Memory Tracking(NMT)是Java7U40引入的HotSpot新特性,可用于监控JVM原生内存的使用,但比较可惜的是,目前的NMT不能监控到JVM之外或原生库分配的内存。java进程启动时指定开启NMT(有一定的性能损耗),输出级别可以设置为“summary”或“detail”级别。
开启后,通过jcmd可以访问收集到的数据
// 开启:-XX:NativeMemoryTracking=summary 或者 -XX:NativeMemoryTracking=detail
jcmd <pid> VM.native_memory [summary | detail | baseline | summary.diff | detail.diff
UnlockDiagnosticVMOptions
Enable normal processing of flags
PrintNMTStatistics
Print native memory tracking summary data if it is on
-XX:+UnlockDiagnosticVMOptions必须配合参数{2}使用,并且只能加在其后才能生效
可以通过上面两个VM参数在JVM退出时打印NMT报告