Java_6_JVM参数选项大全.doc_第1页
Java_6_JVM参数选项大全.doc_第2页
Java_6_JVM参数选项大全.doc_第3页
Java_6_JVM参数选项大全.doc_第4页
Java_6_JVM参数选项大全.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java虚拟机(JVM)参数配置说明在Java、J2EE大型应用中,JVM非标准参数的配置直接关系到整个系统的性能。JVM非标准参数指的是JVM底层的一些配置参数,这些参数在一般开发中默认即可,不需要任何配置。但是在生产环境中,为了提高性能,往往需要调整这些参数,以求系统达到最佳新能。另外这些参数的配置也是影响系统稳定性的一个重要因素,相信大多数Java开发人员都见过“OutOfMemory”类型的错误。呵呵,这其中很可能就是JVM参数配置不当或者就没有配置没意识到配置引起的。为了说明这些参数,还需要说说JDK中的命令行工具一些知识做铺垫。首先看如何获取这些命令配置信息说明:假设你是windows平台,你安装了J2SDK,那么现在你从cmd控制台窗口进入J2SDK安装目录下的bin目录,然后运行java命令,出现如下结果,这些就是包括java.exe工具的和JVM的所有命令都在里面。-D:j2sdk15binjavaUsage: java -options class args. (to execute a class) or java -options -jar jarfile args. (to execute a jar file)where options include: -client to select the client VM -server to select the server VM -hotspot is a synonym for the client VM deprecated The default VM is client. -cp -classpath A ; separated list of directories, JAR archives, and ZIP archives to search for class files. -D= set a system property -verbose:class|gc|jni enable verbose output -version print product version and exit -version: require the specified version to run -showversion print product version and continue -jre-restrict-search | -jre-no-restrict-search include/exclude user private JREs in the version search -? -help print this help message -X print help on non-standard options -ea:.|: -enableassertions:.|: enable assertions -da:.|: -disableassertions:.|: disable assertions -esa | -enablesystemassertions enable system assertions -dsa | -disablesystemassertions disable system assertions -agentlib:= load native agent library , e.g. -agentlib:hprof see also, -agentlib:jdwp=help and -agentlib:hprof=help -agentpath:= load native agent library by full pathname -javaagent:= load Java programming language agent, see java.lang.instrument-在控制台输出信息中,有个-X(注意是大写)的命令,这个正是查看JVM配置参数的命令。其次,用java -X 命令查看JVM的配置说明:运行后如下结果,这些就是配置JVM参数的秘密武器,这些信息都是英文的,为了方便阅读,我根据自己的理解翻译成中文了(不准确的地方还请各位博友斧正)-D:j2sdk15binjava -X -Xmixed mixed mode execution (default) -Xint interpreted mode execution only -Xbootclasspath: set search path for bootstrap classes and resources -Xbootclasspath/a: append to end of bootstrap class path -Xbootclasspath/p: prepend in front of bootstrap class path -Xnoclassgc disable class garbage collection -Xincgc enable incremental garbage collection -Xloggc: log GC status to a file with time stamps -Xbatch disable background compilation -Xms set initial Java heap size -Xmx set maximum Java heap size -Xss set java thread stack size -Xprof output cpu profiling data -Xfuture enable strictest checks, anticipating future default -Xrs reduce use of OS signals by Java/VM (see documentation) -Xcheck:jni perform additional checks for JNI functions -Xshare:off do not attempt to use shared class data -Xshare:auto use shared class data if possible (default) -Xshare:on require using shared class data, otherwise fail.The -X options are non-standard and subject to change without notice.-JVM配置参数中文说明:-1、-Xmixed mixed mode execution (default)混合模式执行2、-Xint interpreted mode execution only解释模式执行3、-Xbootclasspath: set search path for bootstrap classes and resources设置zip/jar资源或者类(.class文件)存放目录路径3、-Xbootclasspath/a: append to end of bootstrap class path追加zip/jar资源或者类(.class文件)存放目录路径4、-Xbootclasspath/p: prepend in front of bootstrap class path预先加载zip/jar资源或者类(.class文件)存放目录路径5、-Xnoclassgc disable class garbage collection关闭类垃圾回收功能6、-Xincgc enable incremental garbage collection开启类的垃圾回收功能7、-Xloggc: log GC status to a file with time stamps记录垃圾回日志到一个文件。8、-Xbatch disable background compilation关闭后台编译9、-Xms set initial Java heap size设置JVM初始化堆内存大小10、-Xmx set maximum Java heap size设置JVM最大的堆内存大小11、-Xss set java thread stack size设置JVM栈内存大小12、-Xprof output cpu profiling data输入CPU概要表数据13、-Xfuture enable strictest checks, anticipating future default执行严格的代码检查,预测可能出现的情况14、-Xrs reduce use of OS signals by Java/VM (see documentation)通过JVM还原操作系统信号15、-Xcheck:jni perform additional checks for JNI functions对JNI函数执行检查16、-Xshare:off do not attempt to use shared class data尽可能不去使用共享类的数据17、-Xshare:auto use shared class data if possible (default)尽可能的使用共享类的数据18、-Xshare:on require using shared class data, otherwise fail.尽可能的使用共享类的数据,否则运行失败The -X options are non-standard and subject to change without notice.-怎么用这这些参数呢?其实所有的命令行都是这么一用,下面我就给出一个最简单的HelloWorl的例子来演示这个参数的用法,非常的简单。HelloWorld.java-public class HelloWorldpublic static void main(String args) System.out.println(Hello World!);编译并运行:D:j2sdk15binjavac HelloWorld.javaD:j2sdk15binjava -Xms256M -Xmx512M HelloWorldHello World!呵呵,这下满足了吧!实践:在大型系统或者应用中配置JVM参数比如你配置IDE工具的参数,常见的有IDEA、Eclipse,这个是在一个配置文件中指定即可。如果你要在J2EE环境中配置这些参数,那么你需要在J2EE应用服务器或者Servlet容器相关启动参数设置处指定,其启动文件中来配置,Tomcat是在catalina.bat中配置,weblogic和websphere是在其他地方,具体我就说了,相信玩过的这些大型服务器的人都知道,没玩过的看看这篇文章,玩玩就知道了,呵呵。另外常常有人问到jdk的一些相关命令用法,其实,当你看到这里的时候,你应该知道如何获取这些命令的用法了。如果你还不会,那么,建议你去学学DOS,我是没辙了。如果你会这些,还是没有看明白,那么你赶紧学学英语吧,这样你就能看懂了。另外:我在最后给出常用的几个Java命令行说明,以供参考:(1)、javac用法:javac 其中,可能的选项包括: -g 生成所有调试信息 -g:none 不生成任何调试信息 -g:lines,vars,source 只生成某些调试信息 -nowarn 不生成任何警告 -verbose 输出有关编译器正在执行的操作的消息 -deprecation 输出使用已过时的 API 的源位置 -classpath 指定查找用户类文件的位置 -cp 指定查找用户类文件的位置 -sourcepath 指定查找输入源文件的位置 -bootclasspath 覆盖引导类文件的位置 -extdirs 覆盖安装的扩展目录的位置 -endorseddirs 覆盖签名的标准路径的位置 -d 指定存放生成的类文件的位置 -encoding 指定源文件使用的字符编码 -source 提供与指定版本的源兼容性 -target 生成特定 VM 版本的类文件 -version 版本信息 -help 输出标准选项的提要 -X 输出非标准选项的提要 -J 直接将 传递给运行时系统(2)、jar用法:jar ctxuvfm0Mi jar-文件 manifest-文件 -C 目录 文件名 .选项: -c 创建新的存档 -t 列出存档内容的列表 -x 展开存档中的命名的(或所有的文件 -u 更新已存在的存档 -v 生成详细输出到标准输出上 -f 指定存档文件名 -m 包含来自标明文件的标明信息 -0 只存储方式;未用ZIP压缩格式 -M 不产生所有项的清单(manifest文件 -i 为指定的jar文件产生索引信息 -C 改变到指定的目录,并且包含下列文件:如果一个文件名是一个目录,它将被递归处理。清单(manifest文件名和存档文件名都需要被指定,按m 和 f标志指定的相同顺序。示例1:将两个class文件存档到一个名为 classes.jar 的存档文件中: jar cvf classes.jar Foo.class Bar.class示例2:用一个存在的清单(manifest)文件 mymanifest 将 foo/ 目录下的所有 文件存档到一个名为 classes.jar 的存档文件中: jar cvfm classes.jar mymanifest -C foo/ .(3)、javadocjavadoc: 错误 - 未指定软件包或类。用法:javadoc 选项 软件包名称 源文件 file-overview 读取 HTML 文件的概述文档-public 仅显示公共类和成员-protected 显示受保护/公共类和成员(默认)-package 显示软件包/受保护/公共类和成员-private 显示所有类和成员-help 显示命令行选项并退出-doclet 通过替代 doclet 生成输出-docletpath 指定查找 doclet 类文件的位置-sourcepath 指定查找源文件的位置-classpath 指定查找用户类文件的位置-exclude 指定要排除的软件包的列表-subpackages 指定要递归装入的子软件包-breakiterator 使用 BreakIterator 计算第 1 句-bootclasspath 覆盖引导类加载器所装入的 类文件的位置-source 提供与指定版本的源兼容性-extdirs 覆盖安装的扩展目录的位置-verbose 输出有关 Javadoc 正在执行的操作的消息-locale 要使用的语言环境,例如 en_US 或 en_US_WIN-encoding 源文件编码名称-quiet 不显示状态消息-J 直接将 传递给运行时系统通过标准 doclet 提供:-d 输出文件的目标目录-use 创建类和软件包用法页面-version 包含 version 段-author 包含 author 段-docfilessubdirs 递归复制文档文件子目录-splitindex 将索引分为每个字母对应一个文件-windowtitle 文档的浏览器窗口标题-doctitle 包含概述页面的标题-header 包含每个页面的页眉文本-footer 包含每个页面的页脚文本-bottom 包含每个页面的底部文本-link 创建指向位于 的 javadoc 输出的链接-linkoffline 利用位于 的软件包列表链接至位于 的文档-excludedocfilessubdir :.排除带有给定名称的所有文档文件子目录。-group :. 在概述页面中,将指定的软件包分组-nocomment 抑止描述和标记,只生成声明。-nodeprecated 不包含 deprecated 信息-noqualifier :.从输出中排除限定符的列表。-nosince 不包含 since 信息-notimestamp 不包含隐藏时间戳-nodeprecatedlist 不生成已过时的列表-notree 不生成类分层结构-noindex 不生成索引-nohelp 不生成帮助链接-nonavbar 不生成导航栏-serialwarn 生成有关 serial 标记的警告-tag : 指定单个变量自定义标记-taglet 要注册的 Taglet 的全限定名称-tagletpath Taglet 的路径-charset 用于跨平台查看生成的文档的字符集。-helpfile 包含帮助链接所链接到的文件-linksource 以 HTML 格式生成源-sourcetab 指定源中每个制表符占据的空格数-keywords 使软件包、类和成员信息附带 HTML 元标记-stylesheetfile 用于更改生成文档的样式的文件-docencoding 输出编码名称(4)、rmidrmid: 非法选项:-?用法:rmid 其中, 包括: -port 指定供 rmid 使用的端口 -log 指定 rmid 将日志写入的目录 -stop 停止当前的 rmid 调用(对指定端口) -C 向每个子进程传递参数(激活组) -J 向 java 解释程序传递参数非稳态选项使用说明-XX:+ 启用选项-XX:- 不启用选项-XX:= 给选项设置一个数字类型值,可跟单位,例如 32k, 1024m, 2g-XX:= 给选项设置一个字符串值,例如-XX:HeapDumpPath=./dump.core选项默认值与限制描述-XX:-AllowUserSignalHandlers限于Linux和Solaris,默认不启用允许为java进程安装信号处理器。Java信号处理相关知识,详见 /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低停顿垃圾收集器。资料详见:/docs/CMS_GC.pdf-XX:-UseParallelGC-server时启用其他情况下,默认不启用策略为新生代使用并行清除,年老代使用单线程Mark-Sweep-Compact的垃圾收集器。-XX:-UseParallelOldGC默认不启用策略为老年代和新生代都使用并行清除的垃圾收集器。-XX:-UseSerialGC-client时启用其他情况下,默认不启用使用串行垃圾收集器。-XX:+UseSplitVerifierjava5默认不启用java6默认启用使用新的Class类型校验器。新Class类型校验器有什么特点?新Class类型校验器,将老的校验步骤拆分成了两步:1,类型推断。2,类型校验。新类型校验器通过在javac编译时嵌入类型信息到bytecode中,省略了类型推断这一步,从而提升了classloader的性能。Classload顺序(供参考)load -verify- prepare - resove - init关联选项:-XX:+FailOverToOldVerifier-XX:+FailOverToOldVerifierJava6新引入选项,默认启用如果新的Class校验器检查失败,则使用老的校验器。为什么会失败?因为JDK6最高向下兼容到JDK1.2,而JDK1.2的class info 与JDK6的info存在较大的差异,所以新校验器可能会出现校验失败的情况。关联选项:-XX:+UseSplitVerifier-XX:+HandlePromotionFailure java5以前是默认不启用,java6默认启用关闭新生代收集担保。什么是新生代收集担保?在一次理想化的minor gc中,Eden和First Survivor中的活跃对象会被复制到Second Survivor。然而,Second Survivor不一定能容纳下所有从E和F区copy过来的活跃对象。为了确保minor gc能够顺利完成,GC需要在年老代中额外保留一块足以容纳所有活跃对象的内存空间。这个预留操作,就被称之为新生代收集担保(New Generation Guarantee)。如果预留操作无法完成时,仍会触发major gc(full gc)。为什么要关闭新生代收集担保?因为在年老代中预留的空间大小,是无法精确计算的。为了确保极端情况的发生,GC参考了最坏情况下的新生代内存占用,即Eden+First Survivor。这种策略无疑是在浪费年老代内存,从时序角度看,还会提前触发Full GC。为了避免如上情况的发生,JVM允许开发者手动关闭新生代收集担保。在开启本选项后,minor gc将不再提供新生代收集担保,而是在出现survior或年老代不够用时,抛出promotion failed异常。-XX:+UseSpinningjava1.4.2和1.5需要手动启用, java6默认已启用启用多线程自旋锁优化。自旋锁优化原理大家知道,Java的多线程安全是基于Lock机制实现的,而Lock的性能往往不如人意。原因是,monitorenter与monitorexit这两个控制多线程同步的bytecode原语,是JVM依赖操作系统互斥(mutex)来实现的。互斥是一种会导致线程挂起,并在较短的时间内又必须重新调度回原线程的,较为消耗资源的操作。为了避免进入OS互斥,Java6的开发者们提出了自旋锁优化。自旋锁优化的原理是在线程进入OS互斥前,通过CAS自旋一定的次数来检测锁的释放。如果在自旋次数未达到预设值前锁已被释放,则当前线程会立即持有该锁。CAS检测锁的原理详见: /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:+UseTLAB1.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:+AggressiveOptsJDK 5 update 6后引入,但需要手动启用。JDK6默认启用。启用JVM开发团队最新的调优成果。例如编译优化,偏向锁,并行年老代收集等。-XX:CompileThreshold=100001000通过JIT编译器,将方法编译成机器码的触发阀值,可以理解为调用方法的次数,例如调1000次,将方法编译为机器码。-XX:LargePageSizeInBytes=4m默认4mamd64位:2m设置堆内存的内存页大小。调整内存页的方法和性能提升原理,详见 /tune-large-page-for-jvm-optimization-XX:MaxHeapFreeRatio=7070GC后,如果发现空闲堆内存占到整个预估上限值的70%,则收缩预估上限值。什么是预估上限值?JVM在启动时,会申请最大值(-Xmx指定的数值)的地址空间,但其中绝大部分空间不会被立即分配(virtual)。它们会一直保留着,直到运行过程中,JVM发现实际占用接近已分配上限值时,才从virtual里再分配掉一部分内存。这里提到的已分配上限值,也可以叫做预估上限值。引入预估上限值的好处是,可以有效地控制堆的大小。堆越小,GC效率越高嘛。注意:预估上限值的大小一定小于或等于最大值。-XX:MaxNewSize=size1.3.1 Sparc: 32m1.3.1 x86: 2.5m新生代占整个堆内存的最大值。-XX:MaxPermSize=64m5.0以后: 64 bit VMs会增大预设值的30%1.4 amd64: 96m1.3.1 -client: 32m其他默认 64mPerm(俗称方法区)占整个堆内存的最大值。-XX:MinHeapFreeRatio=4040GC后,如果发现空闲堆内存占到整个预估上限值的40%,则增大上限值。(什么是预估上限值?见 -XX:MaxHeapFreeRatio 处的描述)关联选项:-XX:MaxHeapFreeRatio=70-XX:NewRatio=2Sparc -client: 8x86 -server: 8x86 -client: 12-client: 4 (1.3)8 (1.3.1+)x86: 12其他默认 2新生代和年老代的堆内存占用比例。例如2表示新生代占最大堆内存的1/2。即年老代和新生代平分堆的占用。-XX:NewSize=2.125m5.0以后: 64 bit Vms 会增大预设值的30%x86: 1mx86, 5.0以后: 640k其他默认 2.125m新生代预估上限的默认值。(什么是预估上限值?见 -XX:MaxHeapFreeRatio 处的描述)-XX:ReservedCodeCacheSize=32m Solaris 64-bit, amd64, -server x86: 48m1.5.0_06之前, Solaris 64-bit amd64: 1024m其他默认 32m设置代码缓存的最大值,编译时用。-XX:SurvivorRatio=8Solaris amd64: 6Sparc in 1.3.1: 25Solaris platforms 5.0以前: 32其他默认 8Eden与Survivor的占用比例。例如8表示,一个survivor区占用 1/8 的新生代内存,另外因为有2个survivor,所以survivor总共是占用新生代内存的 2/8,Eden的占比则为 6/8。-XX:TargetSurvivorRatio=5050实际使用的survivor空间大小占比。默认是50%,最高90%。-XX:ThreadStackSize=512Sparc: 512Solaris x86: 320 (5.0以前 256)Sparc 64 bit: 1024Linux amd64: 1024 (5.0 以前 0)其他默认 512.线程堆栈大小-XX:+UseBiasedLockingJDK 5 update 6后引入,但需要手动启用。JDK6默认启用。启用偏向锁。偏向锁原理详见 /theory-of-java-biased-locking-XX:+UseFastAccessorMethods默认启用优化原始类型的getter方法性能。-XX:-UseISM默认启用启用solaris的ISM。详见Intimate Shared Memory.-XX:+UseLargePagesJDK 5 update 5后引入,但需要手动启用。JDK6默认启用。启用大内存分页。调整内存页的方法和性能提升原理,详见/tune-large-page-for-jvm-optimization关联选项-XX:LargePageSizeInBytes=4m-XX:+UseMPSS1.4.1 之前: 不启用其余版本默认启用启用solaris的MPSS,不能与ISM同时使用。-XX:+StringCache默认启用启用字符串缓存。-XX:AllocatePrefetchLines=11与机器码指令预读相关的一个选项,资料比较少,本文档不做解释。有兴趣的朋友请自行阅读官方doc。-XX:AllocatePrefetchStyle=11与机器码指令预读相关的一个选项,资料比较少,本文档不做解释。有兴趣的朋友请自行阅读官方doc。调试选项选项与默认值默认值与限制描述-XX:-CITime1.4引入。默认启用打印JIT编译器编译耗时。-XX:ErrorFile=./hs_err_pid.logJava 6引入。如果JVM crashed,将错误日志输出到指定文件路径。-XX:-ExtendedDTraceProbesJava6引入,限于solaris默认不启用启用dtrace诊断。-XX:HeapDumpPath=./java_pid.hprof 默认是java进程启动位置,即user.dir堆内存快照的存储文件路径。什么是堆内存快照?当java进程因OOM或crash被OS强制终止后,会生成一个hprof(Heap PROFling)格式的堆内存快照文件。该文件用于线下调试,诊断,查找问题。文件名一般为java_heapDump.hprof解析快照文件,可以使用 jhat, eclipse MAT,gdb等工具。-XX:-HeapDumpOnOutOfMemoryError1.4.2 update12 和 5.0 update 7 引入。默认不启用在OOM时,输出一个dump.core文件,记录当时的堆内存快照(什么是堆内存快照? 见 -XX:HeapDumpPath 处的描述)。-XX:OnError=;1.4.2 update 9引入当java每抛出一个ERROR时,运行指定命令行指令集。指令集是与OS环境相关的,在linux下多数是bash脚本,windows下是dos批处理。-XX:OnOutOfMemoryError=;1.4.2 update 12和java6时引入当第一次发生OOM时,运行指定命令行指令集。指令集是与OS环境相关的,在linux下多数是bash脚本,windows下是dos批处理。-XX:-PrintClassHistogram默认不启用在Windows下, 按ctrl-break或Linux下是执行kill -3(发送SIGQUIT信

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论