请注意.: 本文主要面向JDK7及之前的版本. 如果使用JDK8以及更高的版本,可能会有差异,请访问官方文档:
本文主要介绍 HotSpot JVM 中与性能相关的命令行启动参数,包括环境变量。 适用于 Java HotSpot Client VM 和 Java HotSpot Server VM。
- 1、JVM标准参数请参考在 Java Application Launcher 参考手册:
- 2、 非标准参数(non-standard options):
- 以
-X
开头的参数是非标准参数(non-standard, 不保证所有的JVM实现都支持), 如果后续版本的JDK有变更,不一定通知用户. - 以
-XX
开头的参数是不稳定参数(not stable), 如有变更,也不另行通知.
- 以
JDK 1.3.0 及以下版本, 如果想使用Java HotSpot VM, 请参考: Java HotSpot Equivalents of Exact VM flags.
下面列出 Solaris Sparc 中,Java SE 6 -server
模式的参数默认值. 部分选项的默认值在各种CPU平台/操作系统/JVM版本中略有不同, 在文档中有特殊说明.
- 布尔类型的选项(Boolean), 以加号减号来打头:
-XX:+<option>
(加号开启) ;-XX:-<option>
(减号关闭). - 数值类型的选项(Numeric), 以等号来分隔:
-XX:<option>=<number>
. 数值部分支持缩略符, 例如m
和M
表示MB(megabytes),k
和K
表示KB(kilobytes), 以及g
/G
表示GB(gigabytes).32k
等价于32768
. - 字符串类型选项(String), 同样以等号分隔:
-XX:<option>=<string>
, 通常用于指定文件路径, 或者命令列表
可管理的标志位(Flags manageable), 可以通过JDK管理接口(com.sun.management.HotSpotDiagnosticMXBean
) 或者 JConsole 进行动态修改.
请参考 Java SE 6 系统平台监控和管理 一文对应的示例. 可管理的标志位(flags) 也可以通过 jinfo -flag 命令来设置.
JVM选项大致可以分为以下几类:
- Behavioral options, 控制JVM行为的选项.
- Garbage First (G1) Garbage Collection Options, G1垃圾收集相关选项
- Performance tuning, 性能调优选项.
- Debugging options, 调试相关选项, 支持跟踪、打印、以及输出JVM相关的信息.
选项与默认值 | 说明 |
---|---|
-XX:-AllowUserSignalHandlers | 允许应用程序注册信号量处理器(installs signal handlers). (只适用于 Solaris 以及 Linux.) |
-XX:AltStackSize=16384 | 备用(Alternate)信号栈(signal stack)大小.(单位是Kbytes). (只适用于 Solaris, 从 5.0 起已被移除.) |
-XX:-DisableExplicitGC | 默认情况下应用程序调用 System.gc()是启用(enable)的(-XX:-DisableExplicitGC). 如果使用 -XX:+DisableExplicitGC 则禁止(disable)调用 System.gc(). 注意 JVM 在必要时仍然会执行垃圾回收. |
-XX:+FailOverToOldVerifier | 当新类型的检查器失败时故障转移到老的验证程序(verifier). (开始引入: 6.) |
-XX:+HandlePromotionFailure | 年轻代的垃圾收集(youngest generation collection)不需要保证所有的存活对象都得到提升(a guarantee of full promotion). (开始引入: 1.4.2 update 11) [5.0 及之前的默认值: false.] |
-XX:+MaxFDLimit | 提升(Bump)文件描述符(file descriptors)的数量到最大值. (仅 Solaris 有效.) |
-XX:PreBlockSpin=10 | 使用 -XX:+UseSpinning 多线程自旋锁优化的自旋次数(Spin count variable). 用于控制进入操作系统线程同步代码前,所允许的最大自旋次数 (Controls the maximum spin iterations allowed). (开始引入: 1.4.2.) |
-XX:-RelaxAccessControlCheck | 放宽(Relax)验证器(verifier)中的访问控制检查(access control checks). (开始引入: 6.) |
-XX:+ScavengeBeforeFullGC | 在full GC之前先执行一次年轻代GC. (开始引入: 1.4.1.) |
-XX:+UseAltSigs | 为JVM内部信号使用备用信号(alternate signals)来代替(instead of) SIGUSR1和SIGUSR2 . (开始引入: 1.3.1 update 9, 1.4.1. 只适用于 Solaris.) |
-XX:+UseBoundThreads | 绑定用户级别的线程到内核线程(Bind user level threads to kernel threads). (只适用于 Solaris.) |
-XX:-UseConcMarkSweepGC | 对老年代使用CMS垃圾收集器. (开始引入: 1.4.1) |
-XX:+UseGCOverheadLimit | 使用一种政策,限制在抛出OutOfMemory错误前JVM花费在GC上的那部分时间. (开始引入: 6.) |
-XX:+UseLWPSynchronization | 使用 LWP-based 来取代基于线程的同步(thread based synchronization). (开始引入: 1.4.0. 只适用于 Solaris only.) |
-XX:-UseParallelGC | 使用并行垃圾收集(parallel garbage collection)来清扫内存(scavenges). (开始引入: 1.4.1) |
-XX:-UseParallelOldGC | 对 FullGC使用并行垃圾收集. 如果设置 -XX:+UseParallelGC 则会自动启用本选项. (开始引入: 5.0 update 6.) |
-XX:-UseSerialGC | 使用串行垃圾收集(serial garbage collection). (开始引入: 5.0.) |
-XX:-UseSpinning | 进入操作系统线程同步代码之前,在Java的管程(Monitor)上启用自旋锁优化(naive spinning). (只适用于 1.4.2 以及 5.0.) [1.4.2, multi-processor Windows platforms: true] |
-XX:+UseTLAB | 使用 thread-local 对象分配 (从 1.4.0 开始引入, 使用的是 UseTLE 优先.) [1.4.2 及更早版本, x86架构或者带 -client 选项时为: false] |
-XX:+UseSplitVerifier | 使用新型 checker, 基于 StackMapTable 特性(attributes). (开始引入: 5.0.)[5.0: false] |
-XX:+UseThreadPriorities | 使用本机线程优先级(native thread priorities). |
-XX:+UseVMInterruptibleIO | 对于会导致OS_INTRPT的 I/O 操作, 在EINTR之前/时进行线程中断. (开始引入: 6. 只适用于 Solaris.) |
选项与默认值 | 说明 |
---|---|
-XX:+UseG1GC | 使用G1收集器(垃圾优先,Garbage First) |
-XX:MaxGCPauseMillis=n | 设置最大GC停顿时间目标值. 这是一个软指标, JVM会尽量去努力达成. |
-XX:InitiatingHeapOccupancyPercent=n | 启动并发GC周期(concurrent GC cycle)时整个堆内存的占用百分比. 垃圾收集器用它来根据整个堆内存(entire heap)的占用比触发一次并发GC周期(concurrent GC cycle) , 而不只是某一代内存的占用比 (如G1). 值为 0 则表示一直执行GC('do constant GC cycles'). 默认值为 45. |
-XX:NewRatio=n | 老年代与年轻代(old/new generation)空间比值. 默认值为 2. |
-XX:SurvivorRatio=n | 新生区与存活区(eden/survivor)的比值. 默认值为 8. |
-XX:MaxTenuringThreshold=n | 对象在年轻代中存活周期(tenuring threshold)的最大值. 默认值为 15. |
-XX:ParallelGCThreads=n | 设置垃圾收集器在并行阶段(parallel phases)使用的线程数量. 各个平台上的JVM默认值会有很大差别. |
-XX:ConcGCThreads=n | 并发垃圾收集器(concurrent garbage collectors)所使用的线程数量. 各个平台上的JVM默认值不相同. |
-XX:G1ReservePercent=n | 设置作为假天花板的保留堆内存大小, 用来降低转移失败(promotion failure)发生的可能性. 默认值为 10. |
-XX:G1HeapRegionSize=n | 使用G1时Java堆内存被切分为大小相等的很多块(regions). 这个值设定每个单独的块(individual sub-divisions)的大小. 默认这个参数的值由启动时堆内存大小计算优化得出. 允许的最小值为 1Mb,最大为 32Mb. |
选项与默认值 | 说明 |
---|---|
-XX:+AggressiveOpts | 打开编译器的关键点性能优化(point performance compiler optimizations),预计在后续版本中将默认开启. (从 5.0 update 6 开始引入.) |
-XX:CompileThreshold=10000 | 触发JIT执行编译时方法执行/分支(invocations/branches)的次数. 客户端JVM默认1500次[-client: 1,500] |
-XX:LargePageSizeInBytes=4m | 设置堆内存的大分页容量(large page size). (从 1.4.0 update 1 开始引入.) [amd64: 2m.] |
-XX:MaxHeapFreeRatio=70 | GC之后避免收缩(shrinking)的堆内存自由空间最大百分比. |
-XX:MaxNewSize=size | 年轻代(new generation)的最大尺寸(单位: 字节,byte). 从JDK 1.4开始, MaxNewSize 的值根据 NewRatio 计算得出. [1.3.1 Sparc: 32m; 1.3.1 x86: 2.5m.] |
-XX:MaxPermSize=64m | 持久代(Permanent Generation, Class,常量等信息放在这里,最新的String常量池已移出持久代)的大小. [5.0 and newer: 64 bit VMs are scaled 30% larger; 1.4 amd64: 96m; 1.3.1 -client: 32m.] |
-XX:MinHeapFreeRatio=40 | GC后避免扩充(expansion)的最小堆内存自由空间百分比. |
-XX:NewRatio=2 | 年轻代与老年代(new/old generation)的比值(Ratio). [Sparc -client: 8; x86 -server: 8; x86 -client: 12.]-client: 4 (1.3) 8 (1.3.1+), x86: 12] |
-XX:NewSize=2m | 年轻代(new generation)的默认大小 (单位: 字节,byte) [5.0 及以后版本: 64 bit VM 为 30% 以上比例; x86: 1m; x86, 5.0 及更早版本为: 640k] |
-XX:ReservedCodeCacheSize=32m | 保留代码缓存空间大小(Reserved code cache size 单位: 字节, byte) - 也是最大(maximum) 代码缓存空间大小. [Solaris 64-bit, amd64, 以及 -server x86: 2048m; 在 1.5.0_06 及更早版本的 Solaris 64-bit 和 amd64: 1024m.] |
-XX:SurvivorRatio=8 | (年轻代之中,)新生代/存活区(eden/survivor)的大小比值 [Solaris amd64: 6; Sparc in 1.3.1: 25; 其他 Solaris 版本在5.0以及更早版本中是: 32] |
-XX:TargetSurvivorRatio=50 | 清理(scavenge)之后期待的存活区(survivor)空间占用率. |
-XX:ThreadStackSize=512 | 线程栈的大小 (单位: K字节, Kbytes). (设为 0 则表示使用默认 stack size) [Sparc: 512; Solaris x86: 320 (在 5.0 及更早版本中最初是 256 prior); Sparc 64 bit: 1024; Linux amd64: 1024 (在 5.0 及更早版本中为 0 ); 其他平台默认为 0.] |
-XX:+UseBiasedLocking | 启用偏向锁(biased locking). 详情请参考 JVM调优示例. (从 5.0 update 6 开始引入.) [5.0: false] |
-XX:+UseFastAccessorMethods | 对Get原生类型属性域(<Primitive>Field)方法进行优化. |
-XX:-UseISM | 使用私有共享内存(ISM, Intimate Shared Memory). [对 non-Solaris 平台不可用.] 详情请参考 Intimate Shared Memory. |
-XX:+UseLargePages | 使用大分页内存. (从 5.0 update 5 开始引入.) 详情请参考 Java 对 Large Memory Pages 的支持. |
-XX:+UseMPSS | 为堆内存启用MPSS(Multiple Page Size Support),支持 w/4mb 分页 . 不能和 ISM 一起使用,这会覆盖掉ISM的配置(as this replaces the need for ISM). (从 1.4.0 update 1 开始引入, 只适用于 Solaris 9 and newer.) [1.4.1 and earlier: false] |
-XX:+UseStringCache | 为一般分配的字符串启用缓存.
|
-XX:AllocatePrefetchLines=1 | 在上次对象分配后,使用JIT生成的预取指令时读取的缓存行数. 如果上次分配的对象是一个普通对象则默认值是1,如果是一个数组则默认值为3.
|
-XX:AllocatePrefetchStyle=1 | 为预取指令(prefetch instructions)生成代码样式(code style).
0 - 不生成(generate*d*)预取指令, 1 - 在每次分配(each allocation)之后执行预取指令, 2 - 当预取指令(prefetch instructions)执行时使用 TLAB 分配 watermark 指针pointer to gate . |
-XX:+UseCompressedStrings | 对于可以用纯ASCII字符表示的 Strings,使用 byte[]. (Java 6 Update 21 性能版? 引入【Performance Release】)
|
-XX:+OptimizeStringConcat | 如有可能,优化字符串连接操作(Optimize String concatenation operations). (Java 6 Update 20 开始引进)
|
选项与默认值 | 说明 |
---|---|
-XX:-CITime | 打印 JIT 编译(器)花费的时间. (从 1.4.0 开始引入.) |
-XX:ErrorFile=./hs_err_pid<pid>.log | 如果发生错误,将错误数据保存到此文件. (从 6 开始引入.) |
-XX:-ExtendedDTraceProbes | 启用性能影响(performance-impacting) dtrace 探测. (从 6 开始引入. 只适用于 Solaris.) |
-XX:HeapDumpPath=./java_pid<pid>.hprof | 堆转储(heap dump)的文件或目录(Path to directory or filename ). 可动态配置(Manageable). (从 1.4.2 update 12 , 5.0 update 7 开始引入.) |
-XX:-HeapDumpOnOutOfMemoryError | 在抛出 java.lang.OutOfMemoryError 时转储(dump)堆内存到文件中. 可动态配置(Manageable). (从 1.4.2 update 12, 5.0 update 7 开始引入.) |
-XX:OnError="<cmd args>;<cmd args>" | 在致命错误(fatal error)发生时运行用户指定的命令(user-defined commands). (从 1.4.2 update 9 开始引入.) |
-XX:OnOutOfMemoryError="<cmd args>;
<cmd args>" | 在首次抛出 OutOfMemoryError 时运行用户指定的命令(user-defined commands). (从 1.4.2 update 12 , 以及 JDK 6 开始引入) |
-XX:-PrintClassHistogram | 在按下 Ctrl-Break 时打印出类实例直方图(Print a histogram of class instances on Ctrl-Break). 可动态配置(Manageable). (从 1.4.2 开始引入.) 命令 jmap -histo 提供了等价的功能. |
-XX:-PrintConcurrentLocks | 在使用 Ctrl-Break 进行线程转储时(thread dump)打印 java.util.concurrent 锁. 可动态配置(Manageable). (从 JDK6 开始引入.) 命令 jstack -l 提供了等价的功能. |
-XX:-PrintCommandLineFlags | 打印命令行中的参数标志(flags). (从 5.0 开始引入.) |
-XX:-PrintCompilation | 当一个方法被编译时打印消息. |
-XX:-PrintGC | 在GC时打印消息. 可动态配置(Manageable). |
-XX:-PrintGCDetails | 在GC时打印更多细节信息. 可动态配置(Manageable). (从 1.4.0 开始引入.) |
-XX:-PrintGCTimeStamps | 在GC时打印时间戳. 可动态配置(Manageable) (从 1.4.0 开始引入.) |
-XX:-PrintTenuringDistribution | 打印对象生命周期年龄信息(tenuring age information). |
-XX:-PrintAdaptiveSizePolicy | 启用自适应分代大小信息的打印(Enables printing of information about adaptive generation sizing). |
-XX:-TraceClassLoading | 跟踪(Trace)类的加载. |
-XX:-TraceClassLoadingPreorder | 跟踪所有类加载引用顺序(Trace all classes loaded in order referenced) (不是 loaded 状态). (从 1.4.2 开始引入.) |
-XX:-TraceClassResolution | 跟踪常量池解析(Trace constant pool resolutions). (从 1.4.2 开始引入.) |
-XX:-TraceClassUnloading | 跟踪(Trace)类的卸载(unloading). |
-XX:-TraceLoaderConstraints | 跟踪加载器限制记录(Trace recording of loader constraints). (从 Java6 开始引入.) |
-XX:+PerfDataSaveToFile | 在退出时保存 jvmstat 二进制数据. |
-XX:ParallelGCThreads=n | 设置 年轻代与老年代垃圾收集的并行线程数. 各个平台上的JVM默认值会有很大差别. |
-XX:+UseCompressedOops | 启用指针压缩(对象引用使用32位偏移量表示,而不是64位指针),在Java堆内存大小 小于 32gb 时用来对64位JVM进行优化. |
-XX:+AlwaysPreTouch | 在 JVM 初始化期间对Java堆内存进行摸底(Pre-touch). 因此能可以在初始化期间将堆内存的每一页(Every page of the heap)都写0 (demand-zeroed),而不必等到应用程序执行时再慢慢进行. |
-XX:AllocatePrefetchDistance=n | 为对象内存分配(object allocation)设置预取距离(prefetch distance). 即将写入新对象值的内存,会连同最近分配的对象地址后一段距离(单位: 字节 byte)被一起预取到 cache 中. 每个 Java 线程都有自己的分配点(allocation point). 各个平台上的JVM默认值会有很大差别. |
-XX:InlineSmallCode=n | 只有在以前编译好的方法生成的本地机器码数量小于这个值时才会被内联(Inline). 各个平台上的JVM默认值会有很大差别. |
-XX:MaxInlineSize=35 | 一个方法要被内联(inlined),最多允许有多少个字节码(Maximum bytecode size). |
-XX:FreqInlineSize=n | 一个频繁使用的方法(frequently executed method)要被内联(inlined),最多允许有多少个字节码(Maximum bytecode size). 各个平台上的JVM默认值会有很大差别. |
-XX:LoopUnrollLimit=n | 对小于此值的循环体,server模式编译器将其展开(Unroll). server模式编译器根据一个函数计算出限制值,而不是直接使用指定值. 各平台JVM的默认值会有很大差别. |
-XX:InitialTenuringThreshold=7 | 为年轻代收集器(parallel young collector)中的 自适应GC(adaptive GC)设置初始生命周期阀值(initial tenuring threshold). 生命周期阀值是指一个对象被提升到老年代(old, or tenured)之前,在年轻代GC中存活的次数. |
-XX:MaxTenuringThreshold=n | 为自适应GC(adaptive GC sizing)设置对象的最大生命期阀值(tenuring threshold) . 当前允许的最大值是 15. 并行垃圾收集器(parallel collector)的默认值为 15, CMS 默认值为 4 . |
-Xloggc:<filename> | 记录 GC verbose 日志输出到指定的文件. verbose 输出由正常的 verbose GC flags 控制. |
-XX:-UseGCLogFileRotation | 启用 GC 日志轮换(rotation), 要求设置了 -Xloggc. |
-XX:NumberOfGClogFiles=1 | 设置日志轮换(rotating)的文件数量, 必须大于等于(>= 1). 轮换日志文件会使用如下命名规则(naming scheme), <filename>.0, <filename>.1, ..., <filename>.n-1. |
-XX:GCLogFileSize=8K | 单个日志文件的大小,大于这个值则进行日志切换(rotated), 必须大于等于(>= 8K). |
原文链接: http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
原文日前: 大约2014-01-02
翻译参考: JVM 不稳定参数: http://286.iteye.com/blog/1924947