zoukankan      html  css  js  c++  java
  • Java 6 JVM参数选项大全(中文版)(转)

    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

  • 相关阅读:
    mysql修改数据表名
    HDU 5742 It's All In The Mind (贪心)
    HDU 5752 Sqrt Bo (数论)
    HDU 5753 Permutation Bo (推导 or 打表找规律)
    HDU 5762 Teacher Bo (暴力)
    HDU 5754 Life Winner Bo (博弈)
    CodeForces 455C Civilization (并查集+树的直径)
    CodeForces 455B A Lot of Games (博弈论)
    CodeForces 455A Boredom (DP)
    HDU 4861 Couple doubi (数论 or 打表找规律)
  • 原文地址:https://www.cnblogs.com/likehua/p/2354081.html
Copyright © 2011-2022 走看看