在Java、J2EE大型应用中,JVM非标准参数的配置直接关系到整个系统的性能。java
JVM非标准参数指的是JVM底层的一些配置参数,这些参数在通常开发中默认便可,不须要任何配置。可是在生产环境中,为了提升性能,每每须要调整这些参数,以求系统达到最佳新能。web
另外这些参数的配置也是影响系统稳定性的一个重要因素,相信大多数Java开发人员都见过“OutOfMemory”类型的错误。呵呵,这其中极可能就是JVM参数配置不当或者就没有配置没意识到配置引发的。bootstrap
为了说明这些参数,还须要说说JDK中的命令行工具一些知识作铺垫。windows
首先看如何获取这些命令配置信息说明:服务器
假设你是windows平台,你安装了J2SDK,那么如今你从cmd控制台窗口进入J2SDK安装目录下的bin目录,而后运行java命令,出现以下结果,这些就是包括java.exe工具的和JVM的全部命令都在里面。app
-----------------------------------------------------------------------函数
D:\j2sdk15\bin>java工具
Usage: java [-options] class [args...]性能
(to execute a class)ui
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
-----------------------------------------------------------------------
在控制台输出信息中,有个-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配置参数中文说明:
-----------------------------------------------------------------------
一、-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
设置zip/jar资源或者类(.class文件)存放目录路径
三、-Xbootclasspath/a:<directories and zip/jar files separated by ;>
append to end of bootstrap class path
追加zip/jar资源或者类(.class文件)存放目录路径
四、-Xbootclasspath/p:<directories and zip/jar files separated by ;>
prepend in front of bootstrap class path
预先加载zip/jar资源或者类(.class文件)存放目录路径
五、-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
设置JVM初始化堆内存大小
十、-Xmx<size> set maximum Java heap size
设置JVM最大的堆内存大小
十一、-Xss<size> set java thread stack size
设置JVM栈内存大小
十二、-Xprof output cpu profiling data
输入CPU概要表数据
1三、-Xfuture enable strictest checks, anticipating future default
执行严格的代码检查,预测可能出现的状况
1四、-Xrs reduce use of OS signals by Java/VM (see documentation)
经过JVM还原操做系统信号
1五、-Xcheck:jni perform additional checks for JNI functions
对JNI函数执行检查
1六、-Xshare:off do not attempt to use shared class data
尽量不去使用共享类的数据
1七、-Xshare:auto use shared class data if possible (default)
尽量的使用共享类的数据
1八、-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/ .