`

Java 6 JVM参数选项大全

    博客分类:
  • Java
阅读更多

Java 6 JVM参数选项大全

 

本文是基于最新的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

限于LinuxSolaris,默认不启用

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


Java
信号相关知识,详见 http://www.bt285.cn/content.php?id=274912

-XX:-DisableExplicitGC

默认不启用

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

 甜性涩爱下载 http://www.bt285.cn/content.php?id=1196863

开启该选项后,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中,活跃对象会从EdenFirst 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.21.5需要手动启用, java6默认已启用

启用多线程自旋锁优化。


自旋锁优化原理

大家知道,Java的多线程安全是基于Lock机制实现的,而Lock的性能往往不如人意。
原因是,monitorentermonitorexit这两个控制多线程同步的bytecode原语,是JVM依赖操作系统互斥(mutex)来实现的。
互斥是一种会导致线程挂起,并在较短的时间内又需要重新调度回原线程的,较为消耗资源的操作。

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

 

自旋锁优化的原理是在线程进入OS互斥前,通过CAS自旋一定的次数来检测锁的释放。

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

 

CAS检测锁的原理详见http://www.bt285.cn/sejishikong/ 关联选项:
-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,默认启用

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

-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

默认4mamd64位:2m

设置堆的内存页大小。

 

调整内存页的方法和性能提升原理,详见 http://www.bt285.cn/sejishikong/

-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: 12

 

其他默认 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 amd64: 1024m

 

其他默认 32m

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

-XX:SurvivorRatio=8

Solaris amd64: 6

Sparc in 1.3.1: 25

Solaris platforms5.0以前: 32

 

其他默认 8

EdenSurvivor的占用比例。这里的8表示,一个survivor区占用 1/8 的新生代内存,因为survivor2个,所以是 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://www.bt285.cn/aidesefang/

-XX:+UseFastAccessorMethods

默认启用

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

-XX:-UseISM

默认启用

启用solarisISM

 

详见Intimate Shared Memory.

-XX:+UseLargePages

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

JDK6默认启用。

启用大内存分页。

 

调整内存页的方法和性能提升原理,详见 http://www.bt285.cn/aidesefang/

-XX:+UseMPSS

1.4.1 之前不启用

其余版本默认启用

启用solarisMPSS,不能与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进程因OOMcrash被强制退出后,生成hprofHeap PROFling)格式的堆快照文件。用于出问题后调试,诊断。

文件名一般为

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

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

-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 12java6时引入

当第一次OOM时,运行指定命令行指令集。指令集是与OS环境相关的,在linux下多数是bash脚本,windows下是某个dos批处理。

-XX:-PrintClassHistogram

默认不启用

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

Windowsctrl-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表示在第12GC后存活的对象大小。

-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://www.bt285.cn/aidesefang/ 中的 contraint rules一章。

-XX:+PerfSaveDataToFile

默认启用

java进程因OOMcrash被强制退出后,生成一个堆快照文件(什么是堆内存快照 -XX:HeapDumpPath 处的描述)。

 

分享到:
评论

相关推荐

    java 6 jvm 参数选项大全

    Java 6 JVM 参数选项大全(中文版) 作者:KenWu Email:ken.wug@gmail.com 转载本文档请注明原文链接 http://kenwublog.com/docs/java6-jvm-options-chinese-edition.htm! 本文是基于最新的SUN官方文档...

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

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

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

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

    Java 6 JVM 参数选项大全

    主要是对java应用启动时候的熟悉相关参数的设置,对整个应用的性能起着至关重要的作用哦

    《深入理解Java虚拟机》参数介绍

    Java启动参数共分为三类; 标准参数(-) 所有的JVM实现都必须实现这些参数的功能,而且向后兼容 非标准参数(-X) 默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容; 非稳定参数(-XX...

    JAVA_API1.6文档(中文)

    java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供...

    jvm-monitoring-agent:从内部监视JVM,检测线程块并自动保存线程转储

    java -javaagent:jvm-monitoring-agent-0.9.0.jar=threshold=1000,debug ...rest of command 配置标志/选项 debug 启用调试输出-如果您怀疑某些问题,则可能会提供其他信息。 要调试选项问题,请使其成为第一个传递...

    Java 1.6 API 中文 New

    java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了...

    【Java基础】JDK、JRE、JVM之间的关系

    编译时首先读入java源程序(即在DOS命令行下输入javac HelloWorld.java等文件名参数和其他选项参数),然后进行语法检查,如果出现问题就终止编译。语法检查通过后,生成字节码文件,字节码文件名和原文件名相同,...

    JDK1.8所有vmXX选项及值(java)

    JDK1.8.0_112所有vm选项,用于...基于Java 6(update 21oder 21之后)版本, HotSpot JVM 提供给了两个新的参数,在JVM启动后,在命令行中可以输出所有XX参数和值。 -XX:+PrintFlagsFinal and -XX:+PrintFlagsInitial

    JAVA上百实例源码以及开源项目

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    JAVA上百实例源码以及开源项目源代码

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    java api最新7.0

    java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了...

    JavaAPI1.6中文chm文档 part1

    java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供...

    疯狂JAVA讲义

    1.3.2 Java程序的运行机制和JVM 6 1.4 开发Java的准备 7 1.4.1 安装JDK 8 学生提问:不是说JVM是运行Java程序的虚拟机吗?那JRE和JVM的关系是怎样的呢? 8 学生提问:为什么不安装公共JRE系统呢? 9 1.4.2 设置...

    java程序双击运行-双击jar文件运行程序.pdf

    java程序双击运⾏_双击jar⽂件运⾏程序 Java应⽤程序jar⽂件可以由 JVM(Java虚拟机)直接执⾏,只要操作系统安装了JVM便可以运⾏作为Java应⽤程序的jar⽂件。可是,很多 朋友遇到⼀个难题,那就是下载了jar⽂件以后在...

Global site tag (gtag.js) - Google Analytics