转载:http://blog.163.com/wb_zhaoyuwei/blog/static/183075439201111524716439/
http://www.open-open.com/lib/view/open1330049653655.html
序言:
在Java、J2EE大型应用中,JVM非标准参数的配置直接关系到整个系统的性能。
JVM非标准参数指的是JVM底层的一些配置参数,这些参数在一般开发中默认即可,不需要任何配置。但是在
生产环境中,为了提高性能,往往需要调整这些参数,以求系统达到最佳新能。
另外这些参数的配置也是影响系统稳定性的一个重要因素,相信大多数Java开发人员都见过“OutOfMemory
”类型的错误。呵呵,这其中很可能就是JVM参数配置不当或者就没有配置没意识到配置引起的。
Java 在运行已编译完成的类时,是通过 java 虚拟机来装载和执行的,java 虚拟机通过操作
系统命令 JAVA_HOME\bin\java –option 来启动,-option 为虚拟机参数,JAVA_HOME 为JDK
安装路径,通过这些参数可对虚拟机的运行状态进行调整,掌握参数的含义可对虚拟机的运
行模式有更深入理解。
一、 查看参数列表:
虚拟机参数分为基本和扩展两类,在命令行中输入 JAVA_HOME\bin\java 就可得到基本参数
列表,
在命令行输入 JAVA_HOME\bin\java –X 就可得到扩展参数列表。
二、 基本参数说明:
-----------------------------------------------------------------------
D:\j2sdk15\bin>java
Usage: 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 <class search path of directories and zip/jar files>
-classpath <class search path of directories and zip/jar files>
A ; separated list of directories, JAR archives,
and ZIP archives to search for class files.
-D<name>=<value>
set a system property
-verbose[:class|gc|jni]
enable verbose output
-version print product version and exit
-version:<value>
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[:<packagename>...|:<classname>]
-enableassertions[:<packagename>...|:<classname>]
enable assertions
-da[:<packagename>...|:<classname>]
-disableassertions[:<packagename>...|:<classname>]
disable assertions
-esa | -enablesystemassertions
enable system assertions
-dsa | -disablesystemassertions
disable system assertions
-agentlib:<libname>[=<options>]
load native agent library <libname>, e.g. -agentlib:hprof
see also, -agentlib:jdwp=help and -agentlib:hprof=help
-agentpath:<pathname>[=<options>]
load native agent library by full pathname
-javaagent:<jarpath>[=<options>]
load Java programming language agent, see java.lang.instrument
-----------------------------------------------------------------------
1. -client,-server
这两个参数用于设置虚拟机使用何种运行模式,client 模式启动比较快,但运行时性能和
内存管理效率不如 server 模式,通常用于客户端应用程序。相反,server 模式启动比 client
慢,但可获得更高的运行性能。
在 windows上,缺省的虚拟机类型为 client 模式,如果要使用 server模式,就需要在启动
虚拟机时加-server 参数,以获得更高性能,对服务器端应用,推荐采用 server 模式,尤
其是多个 CPU 的系统。在 Linux,Solaris 上缺省采用 server模式。
2. -hotspot
含义与 client 相同,jdk1.4 以前使用的参数,jdk1.4 开始不再使用,代之以 client。
3. -classpath,-cp
虚拟机在运行一个类时,需要将其装入内存,虚拟机搜索类的方式和顺序如下:
Bootstrap classes,Extension classes,User classes。
Bootstrap 中的路径是虚拟机自带的 jar 或 zip 文件,虚拟机首先搜索这些包文件,用
System.getProperty("sun.boot.class.path")可得到虚拟机搜索的包名。
Extension 是位于 jre\lib\ext 目录下的 jar 文件,虚拟机在搜索完 Bootstrap 后就搜索该
目录下的 jar 文件。用 System. getProperty("java.ext.dirs”)可得到虚拟机使用
Extension 搜索路径。
User classes 搜索顺序为当前目录、环境变量 CLASSPATH、-classpath。
4. -classpath
告知虚拟机搜索目录名、jar 文档名、zip 文档名,之间用分号;分隔。
例如当你自己开发了公共类并包装成一个 common.jar 包,在使用 common.jar 中的类时,就
需要用-classpath common.jar 告诉虚拟机从 common.jar 中查找该类,否则虚拟机就会抛
出 java.lang.NoClassDefFoundError异常,表明未找到类定义。
在运行时可用 System.getProperty(“java.class.path”)得到虚拟机查找类的路径。
使用-classpath 后虚拟机将不再使用 CLASSPATH 中的类搜索路径,如果-classpath 和
CLASSPATH 都没有设置,则虚拟机使用当前路径(.)作为类搜索路径。
推荐使用-classpath 来定义虚拟机要搜索的类路径,而不要使用环境变量 CLASSPATH 的搜
索路径,以减少多个项目同时使用 CLASSPATH 时存在的潜在冲突。例如应用 1 要使用
a1.0.jar 中的类 G,应用 2 要使用 a2.0.jar 中的类 G,a2.0.jar 是 a1.0.jar 的升级包,当
a1.0.jar,a2.0.jar 都在 CLASSPATH 中,虚拟机搜索到第一个包中的类 G 时就停止搜索,
如果应用1应用2的虚拟机都从CLASSPATH中搜索,就会有一个应用得不到正确版本的类G。
5. -D<propertyName>=value
在虚拟机的系统属性中设置属性名/值对,运行在此虚拟机之上的应用程序可用
当虚拟机报告类找不到或类冲突时可用此参数来诊断来查看虚拟机从装入类的情况。
7. -verbose:gc
在虚拟机发生内存回收时在输出设备显示信息,格式如下:
[Full GC 268K->168K(1984K), 0.0187390 secs]
该参数用来监视虚拟机内存回收的情况。
8. -verbose:jni
在虚拟机调用 native 方法时输出设备显示信息,格式如下:
[Dynamic-linking native method HelloNative.sum ... JNI]
该参数用来监视虚拟机调用本地方法的情况,在发生 jni错误时可为诊断提供便利。
9. -version
显示可运行的虚拟机版本信息然后退出。一台机器上装有不同版本的 JDK 时
10. -showversion
显示版本信息以及帮助信息。
11. -ea[:<packagename>...|:<classname>]
12. -enableassertions[:<packagename>...|:<classname>]
从 JDK1.4 开始,java 可支持断言机制,用于诊断运行时问题。通常在测试阶段使断言有效,
在正式运行时不需要运行断言。断言后的表达式的值是一个逻辑值,为 true 时断言不运行,
为 false 时断言运行,抛出 java.lang.AssertionError 错误。
上述参数就用来设置虚拟机是否启动断言机制,缺省时虚拟机关闭断言机制,用-ea 可打开
断言机制,不加<packagename>和 classname 时运行所有包和类中的断言,如果希望只运行
某些包或类中的断言,可将包名或类名加到-ea 之后。例如要启动包 com.foo.util 中的断
言,可用命令 –ea:com.foo.util 。
13. -da[:<packagename>...|:<classname>]
14. -disableassertions[:<packagename>...|:<classname>]
用来设置虚拟机关闭断言处理,packagename和classname 的使用方法和-ea 相同。
15. -esa | -enablesystemassertions
设置虚拟机显示系统类的断言。
16. -dsa | -disablesystemassertions
设置虚拟机关闭系统类的断言。
17. -agentlib:<libname>[=<options>]
该参数是 JDK5 新引入的,用于虚拟机装载本地代理库。
Libname 为本地代理库文件名,虚拟机的搜索路径为环境变量 PATH 中的路径,options 为传
给本地库启动时的参数,多个参数之间用逗号分隔。在 Windows 平台上虚拟机搜索本地库名
为 libname.dll 的文件,在 Unix 上虚拟机搜索本地库名为 libname.so 的文件,搜索路径环
境变量在不同系统上有所不同,Linux、SunOS、IRIX上为LD_LIBRARY_PATH,AIX上为LIBPATH,
HP-UX 上为SHLIB_PATH。
例如可使用-agentlib:hprof 来获取虚拟机的运行情况,包括 CPU、内存、线程等的运行数
据,并可输出到指定文件中,可用-agentlib:hprof=help 来得到使用帮助列表。在 jre\bin
目录下可发现 hprof.dll 文件。
18. -agentpath:<pathname>[=<options>]
设置虚拟机按全路径装载本地库,不再搜索 PATH 中的路径。其他功能和 agentlib 相同。
19. -javaagent:<jarpath>[=<options>]
虚拟机启动时装入java语言设备代理。Jarpath文件中的mainfest文件必须有Agent-Class
属性。代理类要实现 public static void premain(String agentArgs, Instrumentation
inst)方法。当虚拟机初始化时,将按代理类的说明顺序调用 premain方法。
参见:java.lang.instrument
-----------------------------------------------------------------------
在控制台输出信息中,有个-X(注意是大写)的命令,这个正是查看JVM配置参数的命令。
其次,用java -X 命令查看JVM的配置说明:
运行后如下结果,这些就是配置JVM参数的秘密武器.
-----------------------------------------------------------------------
D:\j2sdk15\bin>java -X
-Xmixed mixed mode execution (default)
-Xint interpreted mode execution only
-Xbootclasspath:<directories and zip/jar files separated by ;>
set search path for bootstrap classes and resources
-Xbootclasspath/a:<directories and zip/jar files separated by ;>
append to end of bootstrap class path
-Xbootclasspath/p:<directories and zip/jar files separated by ;>
prepend in front of bootstrap class path
-Xnoclassgc disable class garbage collection
-Xincgc enable incremental garbage collection
-Xloggc:<file> log GC status to a file with time stamps
-Xbatch disable background compilation
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
-Xss<size> 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)
混合模式执行
设置-client 模式虚拟机对使用频率高的方式进行 Just-In-Time 编译和执行,对其他方法
使用解释方式执行。该方式是虚拟机缺省模式。
2、-Xint interpreted mode execution only
解释模式执行
设置-client模式下运行的虚拟机以解释方式执行类的字节码,不将字节码编译为本机码。
3、-Xbootclasspath:<directories and zip/jar files separated by ;>
set search path for bootstrap classes and resources
设置zip/jar资源或者类(.class文件)存放目录路径
3、-Xbootclasspath/a:<directories and zip/jar files separated by ;>
append to end of bootstrap class path
追加zip/jar资源或者类(.class文件)存放目录路径
4、-Xbootclasspath/p:<directories and zip/jar files separated by ;>
prepend in front of bootstrap class path
预先加载zip/jar资源或者类(.class文件)存放目录路径
改变虚拟机装载缺省系统运行包 rt.jar 而从-Xbootclasspath 中设定的搜索路径中装载系
统运行类。除非你自己能写一个运行时,否则不会用到该参数。
/a:将在缺省搜索路径后加上 path 中的搜索路径。
/p:在缺省搜索路径前先搜索 path 中的搜索路径。
5、-Xnoclassgc disable class garbage collection
关闭类垃圾回收功能
关闭虚拟机对 class 的垃圾回收功能。
6、-Xincgc enable incremental garbage collection
开启类的垃圾回收功能
启动增量垃圾收集器,缺省是关闭的。增量垃圾收集器能减少偶然发生的长时间的垃圾回收
造成的暂停时间。但增量垃圾收集器和应用程序并发执行,因此会占用部分 CPU 在应用程序
上的功能。
7、-Xloggc:<file> log GC status to a file with time stamps
记录垃圾回日志到一个文件。
将虚拟机每次垃圾回收的信息写到日志文件中,文件名由 file 指定,文件格式是平文件,
内容和-verbose:gc 输出内容相同。
8、-Xbatch disable background compilation
关闭后台编译
虚拟机的缺省运行方式是在后台编译类代码,然后在前台执行代码,使用-Xbatch参数将关
闭虚拟机后台编译,在前台编译完成后再执行
9、-Xms<size> set initial Java heap size
设置JVM初始化堆内存大小
设置虚拟机可用内存堆的初始大小,缺省单位为字节,该大小为 1024 的整数倍并且要大于
1MB,可用 k(K)或m(M)为单位来设置较大的内存数。初始堆大小为 2MB。
例如:-Xms6400K,-Xms256M
10、-Xmx<size> set maximum Java heap size
设置JVM最大的堆内存大小
设置虚拟机内存堆的最大可用大小,缺省单位为字节。该值必须为 1024 整数倍,并且要大
于 2MB。可用 k(K)或 m(M)为单位来设置较大的内存数。缺省堆最大值为 64MB。
例如:-Xmx81920K,-Xmx80M
当应用程序申请了大内存运行时虚拟机抛出 java.lang.OutOfMemoryError: Java heap
space 错误,就需要使用-Xmx 设媒洗蟮目捎媚诖娑选?BR>
11、-Xss<size> set java thread stack size
设置JVM栈内存大小
设置线程栈的大小,缺省单位为字节。与-Xmx 类似,也可用 K 或 M 来设置较大的值。通常
操作系统分配给线程栈的缺省大小为 1MB。
另外也可在 java 中创建线程对象时设置栈的大小,构造函数原型为 Thread(ThreadGroup
group, Runnable target, String name, long stackSize)。
12、-Xprof output cpu profiling data
输入CPU概要表数据
输出 CPU 运行时的诊断信息。
13、-Xfuture enable strictest checks, anticipating future default
执行严格的代码检查,预测可能出现的情况
对类文件进行严格格式检查,以保证类代码符合类代码规范。为保持向后兼容,虚拟机缺省
不进行严格的格式检查。
14、-Xrs reduce use of OS signals by Java/VM (see documentation)
通过JVM还原操作系统信号
减少虚拟机中操作系统的信号(singals)的使用。该参数通常用在虚拟机以后台服务方式
运行时使用(如 Servlet)。
15、-Xcheck:jni perform additional checks for JNI functions
调用 JNI 函数时进行附加的检查,特别地虚拟机将校验传递给 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 HelloWorld
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}
编译并运行:
D:\j2sdk15\bin>javac HelloWorld.java
D:\j2sdk15\bin>java -Xms256M -Xmx512M HelloWorld
Hello 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 {ctxu}[vfm0Mi] [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)、javadoc
javadoc: 错误 - 未指定软件包或类。
用法: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 <html 代码> 包含概述页面的标题
-header <html 代码> 包含每个页面的页眉文本
-footer <html 代码> 包含每个页面的页脚文本
-bottom <html 代码> 包含每个页面的底部文本
-link <url> 创建指向位于 <url> 的 javadoc 输出的链接
-linkoffline <url> <url2> 利用位于 <url2> 的软件包列表链接至位于 <url>
的文档
-excludedocfilessubdir <名称 1>:..排除带有给定名称的所有文档文件子目录。
-group <名称> <p1>:<p2>.. 在概述页面中,将指定的软件包分组
-nocomment 抑止描述和标记,只生成声明。
-nodeprecated 不包含 @deprecated 信息
-noqualifier <名称 1>:<名称 2>:...从输出中排除限定符的列表。
-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)、rmid
rmid: 非法选项:-?
用法:rmid <option>
其中,<option> 包括:
-port <option> 指定供 rmid 使用的端口
-log <directory> 指定 rmid 将日志写入的目录
-stop 停止当前的 rmid 调用(对指定端口)
-C<runtime 标记> 向每个子进程传递参数(激活组)
-J<runtime 标记> 向 java 解释程序传递参数