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

编程技术  /  houtizong 发布于 3年前   98

 

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

 

作者: Ken Wu

Email: [email protected]

转载本文档请注明原文链接 http://kenwublog.com/docs/java6-jvm-options-chinese-edition.htm

 

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

限于LinuxSolaris ,默认不启用

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


Java
信号处理相关知识,详见 http://kenwublog.com/java-asynchronous-notify-based-on-signal

-XX:-DisableExplicitGC

默认不启用

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

 

开启该选项后,GC 的触发时机将由Garbage Collector 全权掌控。
注意:你熟悉的代码里没调用System.gc() ,不代表你依赖的框架工具没在使用。

例如RMI 就在多数用户毫不知情的情况下,显示地调用GC 来防止自身OOM

请仔细权衡禁用带来的影响。

-XX:-RelaxAccessControlCheck

默认不启用

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

 

作用与reflection 里的setAccessible 类似。

-XX:-UseConcMarkSweepGC

默认不启用

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

 

资料详见: http://kenwublog.com/docs/CMS_GC.pdf

-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 校验器检查失败,则使用老的校验器。

 

为什么会失败?

因为JDK6 最高向下兼容到JDK1.2 ,而JDK1.2class info JDK6info 存在较大的差异,所以新校验器可能会出现校验失败的情况。


关联选项:
-XX:+UseSplitVerifier

-XX:+HandlePromotionFailure      

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

关闭新生代收集担保。


什么是新生代收集 担保
在一次理想化的minor gc中,Eden和First Survivor中
的活跃对象会 被复制到Second Survivor。
然而,Second Survivor 不一定能容纳下所有从EFcopy 过来的活跃对象。

为了确保minor gc 能够顺利完成,GC 需要在年老代中额外保留一块足以容纳所有活跃对象的内存空间。
这个预留操作,就被称之为新生代收集担保(New Generation Guarantee )。如果预留操作无法完成时,仍会触发major gc(full gc)

为什么要关闭新生代收集 担保
因为在年老代中预留的空间大小,是无法精确计算的。

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

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

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

 

在开启本选项后,minor gc 将不再提供新生代收集担保,而是在出现survior 或年老代不够用时,抛出promotion failed 异常。

-XX:+UseSpinning

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

启用多线程自旋锁优化。


自旋锁优化原理

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

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

 

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

如果在自旋次数未达到预设值前锁已被释放,则当前线程会立即持有该锁。

 

CAS 检测锁的原理详见: http://kenwublog.com/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 ,默认启用

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

-XX:+UseBoundThreads

限于Solaris , 默认启用

绑定所有的用户线程到内核线程。
减少线程进入饥饿状态(得不到任何cpu time )的次数。

-XX:+UseLWPSynchronization

限于solaris ,默认启用

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

-XX:+MaxFDLimit

限于Solaris ,默认启用

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

-XX:+UseVMInterruptibleIO

限于solaris,默认启用

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



请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客