您的位置:首页 > 编程语言 > Java开发

Java 6 JVM参数选项大全(中文版)

2010-06-04 15:48 696 查看

Java 6 JVM

数选项大全(中文版)

作者:
Ken Wu

Email:
ken.wug@gmail.com

转载本文档请注明来自
Ken
Wu`s Blog



本文
是基于最新的
SUN官方
文档
Java SE 6 Hotspot
VM
Options

编写的译文。主要介绍JVM
中的非稳态选项及其使用说明。

为了让读者明白每个选项的含义,作者在原文基础上补充了大量的资料


因为是初稿,如有描述错误,敬请指正。

非稳态

选项使用说明



-XX:+<option>

启用option

-XX:-<option>

不启用option

-XX:<option>=<number>

设定option
的值为数字类型,可跟单位,例如 32k, 1024m, 2g

-XX:<option>=<string>
设定option

值为字符串,例如-XX:HeapDumpPath=./dump.core

行为

选项


选项


默认值与限制


描述


-XX:-AllowUserSignalHandlers

限于Linux
和Solaris
,默认不启用

允许为java
进程安装信号处理器。

Java
信号相关知识,详见 http://kenwu.me/java-asynchronous-notify-based-on-signal
-XX:-DisableExplicitGC

默认不启用

禁止在运行期显式地调用 System.gc()


开启该选项后,GC
的触发时机将由Garbage Collector
全权掌控。

需要注意的是,你程序里没调用System.gc()
,你依赖的框
架,工具可能在使用。例如RMI
。请仔细权衡禁用带来的影响。

-XX:-RelaxAccessControlCheck

默认不启用

在Class
校验器里,放松对访问控
制的检查。

作用与reflection
里的setAccessible
类似。

-XX:-UseConcMarkSweepGC

默认不启用

启用CMS
低停顿垃圾收集器。

-XX:-UseParallelGC

默认不启用,-server

时启用

策略为新生代使用并行清除,年老代使用单线程Mark-Sweep-Compact

除的垃圾收集器。

-XX:-UseParallelOldGC

默认不启用

策略为老年代和新生代都使用并行清除的垃圾收集器。

-XX:-UseSerialGC

默认不启用,-client时启用

使用串行垃圾收集器。

-XX:+UseSplitVerifier

java5
默认不启用,java6
默认启用

使用新的Class
类型校验器



什么是新Class
类型校验器?


新Class
类型校验器,将老的校验步骤拆分成两步:

1
,类型推断。

2
,类型校验。

新类型校验器通过在javac
编译时嵌入类型信息到bytecode
中,省略了类型推断这一步,从而提升了classloader

性能。

Classload顺序

load ->

verify


-> prepare -> resove
-> init

关联选项:

-XX:+FailOverToOldVerifier

-XX:+FailOverToOldVerifier

Java6
新引入选项,默认启用

如果新的Class
校验器检查失败,
则使用老的校验器。



关联选项:


-XX:+UseSplitVerifier

-XX:+HandlePromotionFailure

java5
以前是默认不启用,java6
默认启用

关闭新生代收集担保。

什么是新生代收集

担保



在一次理想化的minor gc中,活跃对象会从Eden和First Survivor中被复制到Second Survivor。

然而,Second
Survivor
不一定能容纳所有的活跃对象。

为了确保minor gc
能够顺利完
成,需要在年老代中保留一块足以容纳所有活跃对象的内存空间。

这个预留的操作,被称之为新生代收集担保(New Generation Guarantee

)。
当预留操作无法完成时,就会触发major gc(full gc)


为什么要关闭新生代收集
担保?


因为在年老代中预留的空间大小,是无法精确计算的。

为了确保极端情况的发生,GC参考了最坏情况下的新生
代内存占用,即Eden+First
Survivor。

这种策略无疑是在浪费年老代内存,并从时序角度看,可能提前触发Full GC


为了避免如上情况的发生,JVM
允许
开发者关闭新生代收集担保。

在开启本选项后,minotr gc

不再提供新生代收集担保,而是在出现survior
或年老代不够用时,抛出promotion failed
异常。

-XX:+UseSpinning

java1.4.2
和1.5
需要手动启用, java6
默认已启用

启用多线程自旋锁优化。

自旋锁优化原理


大家知道,Java
的多线程安全是基
于Lock
机制实现的,而Lock

性能往往不如人意。

原因是,monitorenter
与monitorexit

两个控制多线程同步的bytecode
原语,是JVM

赖操作系统互斥(mutex)
来实现的。

互斥是一种会导致线程挂起,并在较短的时间内又需要重新调度回原线程的,较为消耗资源的操作。

为了避免进入OS
互斥,Java6
的开发者们提出了自旋锁优化方法。

自旋锁优化的原理是在线程进入OS

斥前,通过CAS
自旋一定的次数来检测锁的释放。

如果在自旋次数未达到预订值前,发现锁已被释放,则会立即持有该锁。

CAS
检测锁的原理详见:
http://kenwu.me/theory-of-lightweight-locking-upon-cas
关联选项:


-XX:PreBlockSpin=10

-XX:PreBlockSpin=10

-XX:+UseSpinning

必须先启用,对于java6
来说已经默认启用了,这里默认自旋10


控制多线程自旋锁优化的自旋次数。(

么是自旋锁优化?见
-XX:+UseSpinning

处的描述)

关联选项:


-XX:+UseSpinning

-XX:+ScavengeBeforeFullGC

默认启用

在Full GC前触发一次Minor GC。

-XX:+UseGCOverheadLimit

默认启用

限制GC
的运行时间。如果GC
耗时过长,就抛OOM


-XX:+
UseTLAB

1.4.2
以前和使用-client
选项时,默认不启用,其余版本默认启用

启用线程本地缓存区(Thread Local
)。

-XX:+UseThreadPriorities

默认启用

使用本地线程的优先级。

-XX:+UseAltSigs

限于Solaris
,默认启用

为了防止与其他发送信号的应用程序冲突,允许使用候补信号替代 SIGUSR1
和SIGUSR2


-XX:+UseBoundThreads

限于Solaris
,
默认启用

绑定所有的用户线程到内核线程。

减少线程进入饥饿状态(得不到任何cpu time
)的次数。

-XX:+UseLWPSynchronization

限于solaris
,默认启用

使用轻量级进程(内核线程)替换线程同步。

-XX:+MaxFDLimit

限于Solaris
,默认启用

设置java
进程可用文件描述符为操
作系统允许的最大值。

-XX:+UseVMInterruptibleIO

限于solaris,默认启用

在solaris
中,允许运行时中断
线程 。


能选项


选项与默认值


默认值与限制


描述


-XX:+
AggressiveOpts

JDK 5
update 6
后引入,但需要手动启用。

JDK6
默认启用。

启用JVM
开发团队最新的调优成果。
例如编译优化,偏向锁,并行年老代收集等。

-XX:CompileThreshold=10000

1000

JIT
将方法编译成机器码的触发阀
值,可以理解为调用方法的次数,例如调1000
次,这编译为机器码。

-XX:

LargePageSizeInBytes

=4m

默认4m
,amd64
位:2m

设置堆的内存页大小。

调整内存页的方法和性能提升原理,详见
http://kenwu.me/tune-large-page-for-jvm-optimization
-XX:
MaxHeapFreeRatio

=70

70

GC
后,如果发现空闲堆内存占到整个
预估堆内存的70%
,则收缩堆内存预估最大值。

什么是预估堆内存?


预估堆内存是堆大小动态调控的重要选项之一。

堆内存预估最大值一定小于或等于固定最大值(-Xmx

定的数值)


前者会根据使用情况动态调大或缩小,以提高GC

收的效率。

-XX:MaxNewSize=size

1.3.
1
Sparc: 32m

1.3.1

x86: 2.5m

新生代占整个堆内存的最大值。

-XX:MaxPermSize=64m

5.0
以后
: 64 bit VMs
会增大预设值的30%

1.4

amd64: 96m

1.3.1 -client: 32m

其他默认 64m

Perm
占整个堆内存的最大值。

-XX:MinHeapFreeRatio=40

40

GC
后,如果发现空闲堆内存占到整个
预估堆内存的40%
,则放大堆内存的预估最大值,但不超过固定最大值。

(
什么是预估堆内存?见
-XX:MaxHeapFreeRatio


的描述)

关联选项:


-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

新生代和年老代的堆内存占用比例。

这里的2
表示,新生代占最大堆内存的1/2
。也就是和年老代平分堆的占用。

-XX:NewSize=2.125m

5.0
以后
: 64 bit Vms

会增大预设值
的30%

x86: 1m

x86, 5.0
以后
: 640k

其他默认 2.125m

新生代预估堆内存占用的默认值。(

么是预估堆内存?见
-XX:MaxHeapFreeRatio

处的描述)

-XX:ReservedCodeCacheSize
=32m

Solaris 64-bit, amd64, -server
x86: 48m

1.5.0_06
之前
, Solaris 64-bit a
m
d64: 1024m

其他默认 32m

设置代码缓存的最大值,编译用。

-XX:SurvivorRatio=8

Solaris amd64: 6

Sparc in 1.3.1: 25

Solaris platforms
5.0
以前
: 32

其他默认 8

Eden
与Survivor
的占用比例。这里的8
表示,一个survivor
区占用
1/8
的新生代内存,因为survivor
有2
个,所以是 2/8
,那么Eden
的占比为
6/8


-XX:
TargetSurvivorRatio

=50

50

实际使用的survivor
空间大小
占比。默认是50%
,最高90%


-XX:ThreadStackSize=512

Sparc: 512

Solaris x86: 320
(5.0
以前
256)

Sparc 64 bit: 1024

Linux amd64: 1024 (
5.0
以前 0

)

其他默认 512.

线程堆栈大小

-XX:+UseBiasedLocking

JDK 5
update 6
后引入,但需要手动启用。

JDK6
默认启用。

启用偏向锁。

原理详见 http://kenwu.me/theory-of-java-biased-locking
-XX:+UseFastAccessorMethods

默认启用

启用原始类型的getter
方法优
化。

-XX:-UseISM

默认启用

启用solaris
的ISM


详见
Intimate
Shared Memory
.

-XX:+UseLargePages

JDK 5
update 5
后引入,但需要手动启用。

JDK6
默认启用。

启用大内存分页。

调整内存页的方法和性能提升原理,详见 http://kenwu.me/tune-large-page-for-jvm-optimization
-XX:+UseMPSS

1.4.1
之前:
不启用

其余版本默认启用

启用solaris
的MPSS
,不能与ISM
同时使用。

-XX:+StringCache

默认启用

启用字符串缓存。

-XX:

AllocatePrefetchLines

=1

1

与机器码指令预读相关的一个选项,资料比较少,本文档不做解释。有兴趣的朋友请自
行阅读官方doc


-XX:AllocatePrefetchStyle=1

1

与机器码指令预读相关的一个选项,资料比较少,本文档不做解释。有兴趣的朋友请自
行阅读官方doc


调试选项


选项与默认值


默认值与限制


描述


-XX:-CITime

1.4
引入。

默认启用

打印JIT
编译器编译耗时。

-XX:ErrorFile=./hs_err_pid<pid>.log

Java 6
引入。

如果JVM crash
后,将错误日
志输出到指定目录。

-XX:-ExtendedDTraceProbes

Java6
引入,限于solaris

默认不启用

启用
dtrace

诊断。

-XX:HeapDumpPath=./java_pid<pid>.hprof

默认是java
进程启动位置,即user.dir

堆内存快照的存储路径。

什么是堆内存快照?


当java
进程因OOM
或crash
被强制退出后,生成hprof
(Heap PROFling
)格
式的堆快照文件。用于出问题后调试,诊断。

文件名一般为

java_<pid>_<date>_<time>_heapDump.hprof

解析快照文件,可以使用 jhat,
eclipse MAT
,gdb
等工具。

-XX:-HeapDumpOnOutOfMemoryError

1.4.2
update12

5.0 update 7
引入。

默认不启用

在OOM
时,输出一个dump.core
文件,记录当时的堆内存快照(什么是堆内存快照?
见 -XX:HeapDumpPath
处的描
述)。

-XX:OnError="<cmd
args>;<cmd args>"

1.4.2
update 9
引入

当java
每抛出一个ERROR
时,运行指定命令行指令集。指令集是与OS

境相关的,在linux
下多数是bash

本,windows
下是某个dos

处理。

-XX:OnOutOfMemoryError="<cmd
args>;

<cmd args>"

1.4.2
update 12
和java6
时引入

当第一次OOM
时,运行指定命令行指
令集。指令集是与OS
环境相关的,在linux

多数是bash
脚本,windows
下是某个dos
批处理。

-XX:-PrintClassHistogram

默认不启用

打印class
柱状图,图中除了class
,还有该class
的instance
统计信息。

Windows
下,
按ctrl-break
时。

Linux
下是执行kill -3
,或发送SIGQUIT
信号。

Jmap

histo pid
也实现了相同的功能。

详见 http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html
-XX:-PrintConcurrentLocks

默认不启用

在线程dump
时,顺便打印
java.util.concurrent
锁状态。

Jstack


l pid

同样实现了相同的功能。

详见 http://java.sun.com/javase/6/docs/technotes/tools/share/jstack.html
-XX:-PrintCommandLineFlags

5.0
引入,默认不启用

Java
启动时,往stdout
打印当前启用的非稳态jvm options


例如:

-XX:+UseConcMarkSweepGC
-XX:+HeapDumpOnOutOfMemoryError -XX:+DoEscapeAnalysis

-XX:-PrintCompilation

默认不启用

打印方法被JIT
编译时的信息到stdout


例如:

1

java.lang.String::charAt (33 bytes)

-XX:-PrintGC

默认不启用

开启GC
日志打印。

例如:

[Full
GC 131115K->7482K(1015808K), 0.1633180 secs]

该选项可通过 com.sun.management.HotSpotDiagnosticMXBean
API
和 Jconsole
动态启用。

详见 http://java.sun.com/developer/technicalArticles/J2SE/monitoring/#Heap_Dump
-XX:-PrintGCDetails

1.4.0
引入,默认不启用

打印GC
回收的细节。

例如:

[Full
GC (System) [Tenured: 0K->2394K(466048K), 0.0624140 secs]
30822K->2394K(518464K), [Perm : 10443K->10443K(16384K)],
0.0625410
secs] [Times: user=0.05 sys=0.01, real=0.06 secs]

该选项可通过 com.sun.management.HotSpotDiagnosticMXBean
API
和 Jconsole
动态启用。

详见 http://java.sun.com/developer/technicalArticles/J2SE/monitoring/#Heap_Dump
-XX:-PrintGCTimeStamps

默认不启用

打印GC
停顿耗时。

例如:

2.744

: [Full GC (System) 2.744: [Tenured:
0K->2441K(466048K), 0.0598400 secs] 31754K->2441K(518464K),
[Perm :
10717K->10717K(16384K)], 0.0599570 secs] [Times: user=0.06
sys=0.00,
real=0.06

secs]

该选项可通过 com.sun.management.HotSpotDiagnosticMXBean
API
和 Jconsole
动态启用。

详见 http://java.sun.com/developer/technicalArticles/J2SE/monitoring/#Heap_Dump
-XX:-PrintTenuringDistribution

默认不启用

打印对象的存活期限信息。

例如:

[GC

Desired survivor size 4653056 bytes, new threshold 32 (max 32)

- age 1: 2330640 bytes, 2330640 total

- age 2: 9520 bytes, 2340160 total

204009K->21850K(515200K),
0.1563482 secs]

Age1 2
表示在第1
和2
次GC

存活的对象大小。

-XX:-TraceClassLoading

默认不启用

打印class
装载信息到stdout
。记Loaded
状态。

例如:

[Loaded
java.lang.Object from /opt/taobao/install/jdk1.6.0_07/jre/lib/rt.jar]

-XX:-TraceClassLoadingPreorder

1.4.2
引入,默认不启用

按class
的引用/
依赖顺序打印类装载信息到stdout
。不
同于 TraceClassLoading
,本选项只记
Loading
状态。

例如:

[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
类的209
行引用了静态类 java.util.HashMap$Entry

-XX:-TraceClassUnloading

默认不启用

打印class
的卸载信息到stdout
。记Unloaded
状态。

-XX:-
TraceLoaderConstraints

Java6
引入,默认不启用

打印class
的装载策略变化信息到stdout


例如:

[Adding
new constraint for name: java/lang/String, loader[0]:
sun/misc/Launcher$ExtClassLoader,
loader[1]: <bootloader> ]

[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://kenwu.me/docs/Dynamic+Class+Loading+in+the+Java+Virtual+Machine.pdf
中的 contraint rules

章。

-XX:+
PerfSaveDataToFile

默认启用

当java
进程因OOM
或crash
被强制退出后,生成一个堆
快照文件(什么是堆内存快照?
见 -XX:HeapDumpPath

处的描述)。

作者敬告


完善的单元测试,功能回归测试,和性能基准测试可以减少因调整非稳态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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: