介绍

学习JVM参数配置,是为了能在JVM出现问题时分析原因并且去解决它。JVM监控与调优主要的着眼点在于如何配置、如何监控、如何调优等。
本文只重点介绍一些重要和常用的参数,如果想了解全部参数,可以参考下面的文章:
JVM启动参数大全:http://www.blogjava.net/midstr/archive/2008/09/21/230265.html

参数介绍

1.标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
	2.非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
	3.非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用(但是,这些参数往往是非常有用的);
  • 标准参数
    其实标准参数是用过Java的人都最熟悉的,就是你在运行java命令时后面加上的参数,如java -version, java -jar等,输入命令java -help或java -?就能获得当前机器所有java的标准参数列表。
    -client
    设置jvm使用client模式,这是一般在pc机器上使用的模式,启动很快,但性能和内存管理效率并不高;多用于桌面应用;
    -server
    使用server模式,启动速度虽然慢(比client模式慢10%左右),但是性能和内存管理效率很高,适用于服务器,用于生成环境、开发环境或测试环境的服务端;
    如果没有指定-server或-client,JVM启动的时候会自动检测当前主机是否为服务器,如果是就以server模式启动,64位的JVM只有server模式,所以无法使用-client参数;
    默认情况下,不同的启动模式,执行GC的方式有所区别:
  • Android JVM GC 参数 jvm参数说明_Android JVM GC 参数

  • -classpath / -cp
    JVM加载和搜索文件的目录路径,多个路径用;分隔。注意,如果使用了-classpath,JVM就不会再搜索环境变量中定义的CLASSPATH路径。
    JVM搜索路径的顺序为:
    1、先搜索JVM自带的jar或zip包(Bootstratp搜索路径可以用System.getProperty(“sun.boot.class.path”)获得)
    2、搜索JRE_HOME/lib/ext下的jar包(Extension搜索路径可以用System.getProperty(“java.ext.dirs”)获得)
    3、搜索用户自定义目录,顺序为:当前目录(.),CLASSPATH,-cp(搜索路径System.getProperty(“java.class.path”)获得)
    -DpropertyName=value
    定义系统的全局属性值,如配置文件地址等,如果value有空格,可以用-Dname="space string"这样的形式来定义,用System.getProperty(“propertyName”)可以获得这些定义的属性值,在代码中也可以用System.setProperty(“propertyName”,“value”)的形式来定义属性。
    -verbose
    这是查询GC问题最常用的命令之一,具体参数如:-verbose:class输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断。-verbose:gc输出每次GC的相关情况,后面会有更详细的介绍。
    -verbose:jni
    输出native方法调用的相关情况,一般用于诊断jni调用错误信息。
  • 非标准参数
    非标准参数,是在标准参数的基础上进行扩展的参数,输入“java -X”命令,能够获得当前JVM支持的所有非标准参数列表(你会发现,其实并不多哦)。在不同类型的JVM中,采用的参数有所不同。
    -Xmn
    新生代内存大小,包括E区和两个S区的总和,使用方法如:-Xmn65535,-Xmn1024k,-Xmn512m,-Xmn1g (-Xms,-Xmx也是种写法)
    -Xms
    初始堆的大小,也是堆大小的最小值,默认值是总共的物理内存/64(且小于1G),默认情况下,当堆中可用内存小于40%(这个值可以用-XX: MinHeapFreeRatio 调整,如-X:MinHeapFreeRatio=30)时,堆内存会开始增加,一直增加到-Xmx的大小;
    -Xmx
    堆的最大值,默认值是总共的物理内存/64(且小于1G),如果Xms和Xmx都不设置,则两者大小会相同,默认情况下,当堆中可用内存大于70%(这个值可以用-XX: MaxHeapFreeRatio 调整,如-X:MaxHeapFreeRatio=60)时,堆内存会开始减少,一直减小到-Xms的大小;
    整个堆的大小=年轻代大小+年老代大小,堆的大小不包含持久代大小,如果增大了年轻代,年老代相应就会减小,官方默认的配置为年老代大小/年轻代大小=2/1左右(使用-XX:NewRatio可以设置-XX:NewRatio=5,表示年老代/年轻代=5/1);
    建议在开发测试环境可以用Xms和Xmx分别设置最小值最大值,但是在线上生产环境,Xms和Xmx设置的值必须一样,原因与年轻代一样——防止抖动;
    -Xss
    这个参数用于设置每个线程的栈内存,默认1M
    -Xprof
    跟踪正运行的程序,并将跟踪数据在标准输出;适合于开发环境调试。
    -Xnoclassgc
    关闭针对class的gc功能;因为其阻止内存回收,所以可能会导致OutOfMemoryError错误,慎用;
    -Xincgc
    开启增量gc(默认为关闭);这有助于减少长时间GC时应用程序出现的停顿;但由于可能和应用程序并发执行,所以会降低CPU对应用的处理能力。
    -Xloggc:file
    与-verbose:gc功能类似,只是将每次GC事件的相关情况记录到一个文件中,文件的位置最好在本地,以避免网络的潜在问题。
    若与verbose命令同时出现在命令行中,则以-Xloggc为准。
  • 非Stable参数(非静态参数)
    以-XX表示的非Stable参数,JVM(Hotspot)中主要的参数可以大致分为3类
    性能参数(Performance Options):用于JVM的性能调优和内存分配控制,如初始化内存大小的设置;
    行为参数(Behavioral Options):用于改变JVM的基础行为,如GC的方式和算法的选择;
    调试参数(Debugging Options):用于监控、打印、输出等jvm参数,用于显示jvm更加详细的信息;

对于非Stable参数,使用方法有4种:
-XX:+ 启用选项
-XX:- 不启用选项
-XX:= 给选项设置一个数字类型值,可跟单位,例如32k, 1024m, 2g
-XX:= 给选项设置一个字符串值,例如-XX:HeapDumpPath=./dump.core

  • 性能参数
    性能参数往往用来定义内存分配的大小和比例,相比于行为参数和调试参数,一个比较明显的区别是性能参数后面往往跟的有数值,常用如下:
  • Android JVM GC 参数 jvm参数说明_Android JVM GC 参数_02

  • 行为参数
    行为参数主要用来选择使用什么样的垃圾收集器组合,以及控制运行过程中的GC策略等
  • Android JVM GC 参数 jvm参数说明_java_03

  • 调试参数
    调试参数,主要用于监控和打印GC的信息
  • Android JVM GC 参数 jvm参数说明_Android JVM GC 参数_04