本文
是基于最新的SUN官方
文档Java SE 6 Hotspot VM Options
编写的译文。主要介绍JVM
中的非稳态选项及其使用说明。
为了让读者明白每个选项的含义,作者在原文基础上补 充了大量的资料
。希望这份文档,对正在研究JVM
参数的朋友有帮助!
另外,考虑到本文档是初稿,如有描述错误,敬请指正。
非稳态
选项使用说明
-XX:+<option>
启用选项
-XX:-<option>
不启用选项
-XX:<option>=<number>
给选项设置一个数字类型值,可跟单位,例如 32k, 1024m, 2g
-XX:<option>=<string>
给选项设置一个字符串值,例如-XX:HeapDumpPath=./dump.core
行为
选项
选项 |
默认值与限制 |
描述 |
-XX:-AllowUserSignalHandlers |
限于Linux |
允许为java
|
-XX:-DisableExplicitGC |
默认不启用 |
禁止在运行期显式地调用 System.gc()
开启该选项后,GC 例如RMI 请仔细权衡禁用带来的影响。 |
-XX:-RelaxAccessControlCheck |
默认不启用 |
在Class
作用与reflection |
-XX:-UseConcMarkSweepGC |
默认不启用 |
启用CMS
|
-XX:-UseParallelGC |
-server 其他情况下,默认不启用 |
策略为新生代使用并行清除,年老代使用单线程Mark-Sweep-Compact |
-XX:-UseParallelOldGC |
默认不启用 |
策略为老年代和新生代都使用并行清除的垃圾收集器。 |
-XX:-UseSerialGC |
-client 其他情况下,默认不启用 |
使用串行垃圾收集器。 |
-XX:+UseSplitVerifier |
java5 java6 |
使用新的Class
Classload顺序
|
-XX:+FailOverToOldVerifier |
Java6 |
如果新的Class 为什么会失败? 因为JDK6
|
-XX:+HandlePromotionFailure |
java5 |
关闭新生代收集担保。
为了确保minor gc
为了确保极端情况的发生,GC参考了最坏情况下的新生代内存占 用,即Eden+First Survivor。 这种策略无疑是在浪费年老代内存,从时序角度看,还会提前触发Full GC 为了避免如上情况的发生,JVM
在开启本选项后,minor gc |
-XX:+UseSpinning |
java1.4.2 |
启用多线程自旋锁优化。
大家知道,Java 为了避免进入OS
自旋锁优化的原理是在线程进入OS 如果在自旋次数未达到预设值前锁已被释放,则当前线程会立即持有该锁。
CAS
|
-XX:PreBlockSpin=10 |
-XX:+UseSpinning |
控制多线程自旋锁优化的自旋次数。(
|
-XX:+ScavengeBeforeFullGC |
默认启用 |
在Full GC前触发一次Minor GC。 |
-XX:+UseGCOverheadLimit |
默认启用 |
限制GC |
-XX:+ |
1.4.2 |
启用线程本地缓存区(Thread Local |
-XX:+UseThreadPriorities |
默认启用 |
使用本地线程的优先级。 |
-XX:+UseAltSigs |
限于Solaris |
为了防止与其他发送信号的应用程序冲突,允许使用候补信号替代 SIGUSR1 |
-XX:+UseBoundThreads |
限于Solaris |
绑定所有的用户线程到内核线程。 |
-XX:+UseLWPSynchronization |
限于solaris |
使用轻量级进程(内核线程)替换线程同步。 |
-XX:+MaxFDLimit |
限于Solaris |
设置java |
-XX:+UseVMInterruptibleIO |
限于solaris,默认启用 |
在solaris |
选项与默认值 |
默认值与限制 |
描述 |
-XX:+ |
JDK 5 update 6 JDK6 |
启用JVM |
-XX:CompileThreshold=10000 |
1000 |
通过JIT |
-XX: |
默认4m amd64 |
设置堆内存的内存页大小。
调整内存页的方法和性能提升原理,详见 http://kenwublog.com/tune-large-page-for-jvm-optimization |
-XX: |
70 |
GC
什么是预估上限值? JVM 它们会一直保留着,直到运行过程中,JVM 这里提到的已分配上限值,也可以叫做预估上限值。
注意:预估上限值的大小一定小于或等于最大值。 |
-XX:MaxNewSize=size |
1.3. 1.3.1 |
新生代占整个堆内存的最大值。 |
-XX:MaxPermSize=64m |
5.0 1.4 1.3.1 -client: 32m
其他默认 64m |
Perm |
-XX:MinHeapFreeRatio=40 |
40 |
GC (
关联选项: -XX:MaxHeapFreeRatio=70 |
-XX:NewRatio=2 |
Sparc -client: 8 x86 -server: 8 x86 -client: 12 -client: 4 (1.3) 8 (1.3.1+) x86: 1
其他默认 2 |
新生代和年老代的堆内存占用比例。 例如2 |
-XX:NewSize=2.125m |
5.0 x86: 1m x86, 5.0
其他默认 2.125m |
新生代预估上限的默认值。( |
-XX:ReservedCodeCacheSize |
Solaris 64-bit, amd64, -server x86: 48m 1.5.0_06
其他默认 32m |
设置代码缓存的最大值,编译时用。 |
-XX:SurvivorRatio=8 |
Solaris amd64: 6 Sparc in 1.3.1: 25 Solaris platforms
其他默认 8 |
Eden 所以survivor |
-XX: |
50 |
实际使用的survivor |
-XX:ThreadStackSize=512 |
Sparc: 512 Solaris x86: 320 Sparc 64 bit: 1024 Linux amd64: 1024 (
其他默认 512. |
线程堆栈大小 |
-XX:+UseBiasedLocking |
JDK 5 update 6 JDK6 |
启用偏向锁。
|
-XX:+UseFastAccessorMethods |
默认启用 |
优化原始类型的getter |
-XX:-UseISM |
默认启用 |
启用solaris
|
JDK 5 update 5 JDK6 |
启用大内存分页。
调整内存页的方法和性能提升原理,详见http://kenwublog.com/tune-large-page-for-jvm-optimization
关联选项 -XX:LargePageSizeInBytes=4m |
|
-XX:+UseMPSS |
1.4.1 其余版本默认启用 |
启用solaris |
-XX:+StringCache |
默认启用 |
启用字符串缓存。 |
-XX: |
1 |
与机器码指令预读相关的一个选项,资料比较少,本文档不做解释。有兴趣的 朋友请自行阅读官方doc |
-XX:AllocatePrefetchStyle=1 |
1 |
与机器码指令预读相关的一个选项,资料比较少,本文档不做解释。有兴趣的 朋友请自行阅读官方doc |
调试选项
选项与默认值 |
默认值与限制 |
描述 |
-XX:-CITime |
1.4 默认启用 |
打印JIT |
-XX:ErrorFile=./hs_err_pid<pid>.log |
Java 6 |
如果JVM crashed |
-XX:-ExtendedDTraceProbes |
Java6 默认不启用 |
启用dtrace |
-XX:HeapDumpPath=./java_pid<pid>.hprof |
默认是java |
堆内存快照的存储文件路径。
什么是堆内存快照? 当java 文件名一般为 java_<pid>_<date>_<time>_heapDump.hprof 解析快照文件,可以使用 jhat, eclipse MAT |
-XX:-HeapDumpOnOutOfMemoryError |
1.4.2 update12 默认不启用 |
在OOM |
-XX:OnError="<cmd args>;<cmd args>" |
1.4.2 update 9 |
当java |
-XX:OnOutOfMemoryError="<cmd args>; |
1.4.2 update 12 |
当第一次发生OOM |
-XX:-PrintClassHistogram |
默认不启用 |
在Windows
Jmap 详见 http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html |
-XX:-PrintConcurrentLocks |
默认不启用 |
在thread dump
Jstack 详见 http://java.sun.com/javase/6/docs/technotes/tools/share/jstack.html |
-XX:-PrintCommandLineFlags |
5.0 |
Java
例如: -XX:+UseConcMarkSweepGC -XX:+HeapDumpOnOutOfMemoryError -XX:+DoEscapeAnalysis |
-XX:-PrintCompilation |
默认不启用 |
往stdout
例如: 1 java.lang.String::charAt (33 bytes) |
-XX:-PrintGC |
默认不启用 |
开启GC
打印格式例如: [Full GC 131115K->7482K(1015808K), 0.1633180 secs]
该选项可通过 com.sun.management.HotSpotDiagnosticMXBean API 详见 http://java.sun.com/developer/technicalArticles/J2SE/monitoring/#Heap_Dump |
-XX:-PrintGCDetails |
1.4.0 |
打印GC
打印格式例如: [Full GC (System) [Tenured:
该选项可通过 com.sun.management.HotSpotDiagnosticMXBean API 详见 http://java.sun.com/developer/technicalArticles/J2SE/monitoring/#Heap_Dump |
-XX:-PrintGCTimeStamps |
默认不启用 |
打印GC
打印格式例如: 2.744 secs]
该选项可通过 com.sun.management.HotSpotDiagnosticMXBean API 详见 http://java.sun.com/developer/technicalArticles/J2SE/monitoring/#Heap_Dump |
-XX:-PrintTenuringDistribution |
默认不启用 |
打印对象的存活期限信息。
打印格式例如: [GC 204009K->21850K(515200K), 0.1563482 secs]
Age1 2 |
-XX:-TraceClassLoading |
默认不启用 |
打印class
例如: [Loaded java.lang.Object from /opt/taobao/install/jdk1.6.0_07/jre/lib/rt.jar] |
-XX:-TraceClassLoadingPreorder |
1.4.2 |
按class
例如: [Loading java.lang.Object from /home/confsrv/jdk1.6.0_14/jre/lib/rt.jar] |
-XX:-TraceClassResolution |
1.4.2 |
打印所有静态类,常量的代码引用位置。用于debug
例如: RESOLVE java.util.HashMap java.util.HashMap$Entry HashMap.java:209
说明HashMap |
-XX:-TraceClassUnloading |
默认不启用 |
打印class |
-XX:- |
Java6 |
打印class
例如: [Adding new constraint for [Setting class object in existing constraint for name: [Ljava/lang/Object; and loader sun/misc/Launcher$ExtClassLoader ] [Updating constraint for name org/xml/sax/InputSource, loader <bootloader>, by setting class object ] [Extending constraint for name java/lang/Object by adding loader[15]: sun/reflect/DelegatingClassLoader ]
装载策略变化是实现classloader 对此感兴趣的朋友,详见 http://kenwublog.com/docs/Dynamic+Class+Loading+in+the+Java+Virtual+Machine.pdf |
-XX:+ |
默认启用 |
当java |
作者敬告
完善的单元测试,功能回归测试,和性能基准测试可以减少因调整非稳态JVM
选项带来的风险。
参考资料
Java6
性能调优白皮书
http://java.sun.com/performance/reference/whitepapers/6_performance.html
Java6 GC
调优指南
http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html
更
为全面的options列表
http://blogs.sun.com/watt/resource/jvm-options-list.html
PDF版请点击这里:
http://kenwublog.com/docs/java6-jvm-options-chinese-edition.pdf