7.5.3 启动参数
HotSpot虚拟机在启动时可以指定很多不同的参数。这些参数中有些是标准参数,是所有平台上的虚拟机都支持的。另外一些则是非标准的或试验性质的参数,不是所有平台上的虚拟机都支持。这些试验性质的参数的功能可能并不稳定,会在后续的版本中发生变化。
HotSpot虚拟机支持的标准参数并不是很多:“-classpath”和“-cp”都可以用来指定程序运行时的类路径(classpath);“-D”用来设置系统属性的值;“-ea”和“-da”分别用来启用和禁用程序中的断言;“-esa”和“-dsa”分别用来启用和禁用系统类中的断言;“-verbose”用来要求虚拟机输出一些详细的信息,如“-verbose:class”用来输出加载Java类时的信息,“-verbose:gc”用来在垃圾回收器运行时输出相关信息,“-verbose:jni”用来在使用原生方法时输出相关信息。
在启动参数中以“-X”开头的参数是非标准参数,不是所有平台上的虚拟机都支持。这些参数中比较常见的是设置虚拟机堆内存大小的参数,其中“-Xms”用来设置堆内存的初始值,“-Xmx”用来设置堆内存的最大值。
以“-XX”开头的参数的实现不是很稳定,一般不推荐使用。在前面介绍虚拟机的垃圾回收机制时,启用特定垃圾回收方式的参数都是以“-XX”开头的,说明对这些参数的使用需要特别注意。这些参数根据数据类型的不同可以分成三类:第一类是布尔型的参数,可以通过“-XX:+<option>”的形式来打开,通过“-XX:-<option>”的形式来关闭。第二类是数值型的参数,可以通过“-XX:<option>=<number>”的形式来指定。在指定数值大小时可以使用“k”、“m”和“g”等单位,分别表示千、兆和千兆。最后一类是字符串类型的参数,可以通过“-XX:<option>=<string>”的形式来指定。
根据作用的不同大致可以将这些参数分成三类。第一类是与虚拟机行为相关的。前面介绍的指定垃圾回收方式的参数都属于这一类。除此之外,还包括一些有用的参数,如“-XX:+DisableExplicitGC”用来禁止通过System.gc方法来显式要求运行垃圾回收器。如果不希望程序直接影响垃圾回收器的运行,那么可以打开此功能。“-XX:+ScavengeBeforeFullGC”用来要求垃圾回收器在对整个内存空间进行回收之前,先回收年轻世代的内存空间。这个功能默认是打开的。“-XX:+UseGCOverheadLimit”用来限制虚拟机花费在垃圾回收上的时间。如果虚拟机把大量的时间花费在垃圾回收上,就说明虚拟机的内存过小,不足以支持程序的运行。如果这样的情况持续发生一段时间,虚拟机会抛出OutOfMemoryError错误。这个功能默认是打开的,如果不希望存在这样的限制,可以关闭此功能。
第二类参数是与性能优化相关的。这些参数主要用来处理字符串的优化,以及调整虚拟机堆内存各个部分的大小。下面介绍一下这些参数中比较重要的几个。“-XX:+AggressiveOpts”用来启用在当前虚拟机版本中处于试验性质的优化策略,这些优化策略有可能在以后的虚拟机版本中被默认启用。启用这些优化策略通常会提升程序的运行性能,但是有可能造成一些程序运行时的错误。“-XX:+UseStringCache”用来启用对经常使用的字符串进行缓存的功能,可以提升性能。“-XX:+UseCompressedStrings”用来启用对字符串的压缩处理。如果字符串中仅包含ASCII字符,会使用byte[]而不是char[]来表示字符串,这样可以节省占用的内存空间。“-XX:+OptimizeStringConcat”用来启用对字符串连接操作的优化功能。“-XX:NewRatio”用来指定年轻世代和年老世代所占的内存的比例。“-XX:NewSize”用来指定年轻世代所占的内存大小。“-XX:MaxPermSize”用来指定永久世代所占内存的最大值。
第三类参数是与程序调试相关的,可以控制虚拟机在运行时输出一些调试信息。这些参数中比较重要的包括:“-XX:+CITime”用来控制输出JIT编译器所花费的时间;“-XX:+PrintGC”用来控制当垃圾回收器运行时输出与回收操作相关的信息;“-XX:+PrintGCDetails”的作用类似于“-XX:+PrintGC”,只是输出的信息更加详细;“-XX:+PrintGCTimeStamps”也用来输出与垃圾回收相关的信息,只不过会在信息中包含时间戳;“-XX:+TraceClassLoading”用来控制Java类被加载时输出相关的调试信息;“-XX:+TraceClassUnloading”用来控制Java类被卸载时输出相关的调试信息。