1. JVM参数分类
- 标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
- 非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
- 非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用,一般JVM调优使用的即此类参数。
2. 标准参数(-)
比如-version、-help等,几乎所有的JDK版本都不会改变。下面再列举几个常见的标准参数:
-client
设置JVM使用client模式,常用于客户端应用程序或者调试。其特点为启动速度快,但是运行时性能和内存效率不高。-server
设置JVM使用server模式,一般线上应用都使用此模式,在具有64位能力的jdk环境下将默认启用该模式,而忽略-client参数。其特点是启动速度慢,运行性能和内存效率高。-classpath classpath / -cp classpath
使用-classpath后jvm将不再使用CLASSPATH中的类搜索路径,如果-classpath和CLASSPATH都没有设置,则jvm使用当前路径(.)作为类搜索路径。
jvm搜索类的方式和顺序为:Bootstrap,Extension,User。
Bootstrap中的路径是jvm自带的jar或zip文件,jvm首先搜索这些包文件,用System.getProperty("sun.boot.class.path")可得到搜索路径。
Extension是位于JRE_HOME/lib/ext目录下的jar文件,jvm在搜索完Bootstrap后就搜索该目录下的jar文件,用System.getProperty("java.ext.dirs")可得到搜索路径。
User搜索顺序为当前路径.、CLASSPATH、-classpath,jvm最后搜索这些目录,用System.getProperty("java.class.path")可得到搜索路径。-Dproperty=value
设置系统属性名/值对,运行在此jvm之上的应用程序可用System.getProperty("property")得到value的值。如果value中有空格,则需要用双引号将该值括起来,如-Dname= "space string"。
该参数通常用于设置系统级全局变量值,如配置文件路径,以便该属性在程序中任何地方都可访问。-jar
指定以jar包的形式运行应用程序。使用这种方式,jar包中的mainfest文件中必须声明初始加载的Main-class,同时Main-class必须有public static void main(String[] args)方法。
- -verbose:class
输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断。 - -verbose:gc
输出每次GC的相关情况。 - -verbose:jni
输出native方法调用的相关情况,一般用于诊断jni调用错误信息。
3. 非标准参数(-X)
一般很少使用。
- -Xint,解释执行模式,所有的字节码将被直接执行,而不会编译成本地码;
- -Xcomp,编译模式;
- -Xmixed,开启混合模式(默认),先编译成字节码,然后执行。
4. 非Stable参数(-XX)
这类参数是进行jvm参数调优可能会进行修改,不过这类参数不是稳定的,不同版本的jvm中,可能对应的参数名称不同。并且可能在未来的版本被删除或重命名。
4.1 类型分类
-XX参数按照参数类型进行分类的话,可以分成两类:布尔类型和KV键值对类型。
4.1.1 布尔类型
-XX:+某个属性
开启某个jvm属性,-XX:+PrintGCDetails,开启GC详细信息。
-XX:-某个属性
关闭某个jvm属性,不是所有的属性都如此
4.1.2 KV键值对类型
-XX:属性key=值value
。比如-XX:Metaspace=128m
、-XX:SurvivorRatio=4
。
4.2. 功能分类
-XX参数按照功能进行分类的话,可以大概分为
- 行为参数:用于改变jvm的一些基础行为;
- 性能参数:用于jvm的性能调优;
- 调试参数:一般用于打开跟踪、打印、输出等jvm参数,用于显示jvm更加详细的信息。
4.2.1 行为参数
-
-XX:-DisableExplicitGC
禁止调用System.gc();但jvm的gc仍然有效 -
-XX:+MaxFDLimit
最大化文件描述符的数量限制 -
-XX:+ScavengeBeforeFullGC
新生代GC优先于Full GC执行 -
-XX:+UseGCOverheadLimit
在抛出OOM之前限制jvm耗费在GC上的时间比例 -
-XX:-UseConcMarkSweepGC
对老生代采用并发标记交换算法进行GC -
-XX:-UseParallelGC
启用并行GC -
-XX:-UseParallelOldGC
对Full GC启用并行,当-XX:-UseParallelGC启用时该项自动启用 -
-XX:-UseSerialGC
启用串行GC -
-XX:+UseThreadPriorities
启用本地线程优先级
4.2.2 性能参数
-
-XX:LargePageSizeInBytes=4m
设置用于Java堆的大页面尺寸 -
-XX:MaxHeapFreeRatio=70
GC后java堆中空闲量占的最大比例 -
-XX:MaxNewSize=size
新生成对象能占用内存的最大值 -
-XX:MaxPermSize=64m
老生代对象能占用内存的最大值 -
-XX:MinHeapFreeRatio=40
GC后java堆中空闲量占的最小比例 -
-XX:NewRatio=2
新生代内存容量与老生代内存容量的比例 -
-XX:NewSize=2.125m
新生代对象生成时占用内存的默认值 -
-XX:ReservedCodeCacheSize=32m
保留代码占用的内存容量 -
-XX:ThreadStackSize=512
设置线程栈大小,若为0则使用系统默认值 -
-XX:+UseLargePages
使用大页面内存 -
-Xms
等价于-XX:InitialHeapSize
初始化堆内存大小 -
-Xmx
等价于-XX:MaxHeapSize
最大的堆内存大小 -
-Xmn
等价于-XX:NewSize=size
设置初始的年轻代的大小 -
-Xss
等价于-XX:ThresholdStackSize
。用于设置单个栈的大小,系统默认值是0,不代表栈大小为0。而是根据操作系统的不同,有不同的值。比如64位的Linux系统是1024K,而Windows系统依赖于虚拟内存。
4.2.3 调试参数
-
-XX:-CITime
打印消耗在JIT编译的时间 -
-XX:ErrorFile=./hs_err_pid<pid>.log
保存错误日志或者数据到文件中 -
-XX:-ExtendedDTraceProbes
开启solaris特有的dtrace探针 -
-XX:HeapDumpPath=./java_pid<pid>.hprof
指定导出堆信息时的路径或文件名 -
-XX:-HeapDumpOnOutOfMemoryError
当首次遭遇OOM时导出此时堆中相关信息 -
-XX:OnError="<cmd args>;<cmd args>"
出现致命ERROR之后运行自定义命令 -
-XX:OnOutOfMemoryError="<cmd args>;<cmd args>"
当首次遭遇OOM时执行自定义命令 -
-XX:-PrintClassHistogram
遇到Ctrl-Break后打印类实例的柱状信息,与jmap -histo功能相同 -
-XX:-PrintConcurrentLocks
遇到Ctrl-Break后打印并发锁的相关信息,与jstack -l功能相同 -
-XX:-PrintCommandLineFlags
打印在命令行中出现过的标记 -
-XX:-PrintCompilation
当一个方法被编译时打印相关信息 -
-XX:-PrintGC
每次GC时打印相关信息 -
-XX:-PrintGC Details
每次GC时打印详细信息 -
-XX:-PrintGCTimeStamps
打印每次GC的时间戳 -
-XX:-TraceClassLoading
跟踪类的加载信息,(jre/lib/rt.jar下的类全部加载,起来类用到的时候再加载) -
-XX:-TraceClassLoadingPreorder
跟踪被引用到的所有类的加载信息 -
-XX:-TraceClassResolution
跟踪常量池 -
-XX:-TraceClassUnloading
跟踪类的卸载信息 -
-XX:-TraceLoaderConstraints
跟踪类加载器约束的相关信息
4.3. 查看参数
- 查看某个参数
使用jps -l
配合jinfo -flag JVM参数 pid
。先用jsp -l
查看java进程,选择某个进程号。
17888 org.jetbrains.jps.cmdline.Launcher
5360 org.jetbrains.idea.maven.server.RemoteMavenServer
18052 demo3.demo3
jinfo -flag PrintGCDetails 18052
可以查看18052 Java进程的PrintGCDetails
参数信息。
-XX:-PrintGCDetails
- 查看所有参数
使用jps -l
配合jinfo -flags pid
可以查看所有参数。
也可以使用java -XX:+PrintFlagsInitial
[Global flags]
intx ActiveProcessorCount = -1 {product}
uintx AdaptiveSizeDecrementScaleFactor = 4 {product}
uintx AdaptiveSizeMajorGCDecayTimeScale = 10 {product}
uintx AdaptiveSizePausePolicy = 0 {product}
······
uintx YoungPLABSize = 4096 {product}
bool ZeroTLAB = false {product}
intx hashCode = 5 {product}
- 查看修改后的参数
使用java -XX:PrintFlagsFinal
可以查看修改后的参数,与上面类似。只是修改过后是:=
而不是=
。
- 查看常见参数
如果不想查看所有参数,可以用-XX:+PrintCommandLineFlags
查看常用参数。
-XX:InitialHeapSize=132375936 -XX:MaxHeapSize=2118014976 -XX:+PrintCommandLineFlags -XX:+UseCompressedCla
扩展阅读
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html;