原文:http://xinklabi.iteye.com/blog/837435
java
Java在运行已编译完成的类时,是经过java虚拟机来装载和执行的,java虚拟机经过操做系统命令JAVA_HOME"bin"java –option 来启动,-option为虚拟机参数,JAVA_HOME为JDK安装路径,经过这些参数可对虚拟机的运行状态进行调整,掌握参数的含义可对虚拟机的运行模式有更深刻理解。
web
1、 查看参数列表:
虚拟机参数分为基本和扩展两类,在命令行中输入JAVA_HOME"bin"java 就可获得基本参数列表,在命令行输入JAVA_HOME"bin"java –X 就可获得扩展参数列表。
2、 基本参数说明:
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在虚拟机的系统属性中设置属性名/值对,运行在此虚拟机之上的应用程序可用System.getProperty(“propertyName”)获得value的值。若是value中有空格,则须要用双引号将该值括起来,如-Dname=”space string”。该参数一般用于设置系统级全局变量值,如配置文件路径,应为该属性在程序中任何地方均可访问。 6. -verbose[:class|gc|jni]在输出设备上显示虚拟机运行信息。verbose和verbose:class含义相同,输出虚拟机装入的类的信息,显示的信息格式以下:[Loaded java.io.FilePermission$1 from shared objects file]当虚拟机报告类找不到或类冲突时可用此参数来诊断来查看虚拟机从装入类的状况。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显示版本信息以及帮助信息。 内容来自dedecms 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设置虚拟机关闭系统类的断言。 dedecms.com 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方法。 copyright dedecms 参见:java.lang.instrument3、 扩展参数说明1. -Xmixed设置-client模式虚拟机对使用频率高的方式进行Just-In-Time编译和执行,对其余方法使用解释方式执行。该方式是虚拟机缺省模式。2. -Xint设置-client模式下运行的虚拟机以解释方式执行类的字节码,不将字节码编译为本机码。3. -Xbootclasspath:path4. -Xbootclasspath/a:path5. -Xbootclasspath/p:path改变虚拟机装载缺省系统运行包rt.jar而从-Xbootclasspath中设定的搜索路径中装载系统运行类。除非你本身能写一个运行时,不然不会用到该参数。/a:将在缺省搜索路径后加上path 中的搜索路径。/p:在缺省搜索路径前先搜索path中的搜索路径。6. -Xnoclassgc关闭虚拟机对class的垃圾回收功能。7. -Xincgc启动增量垃圾收集器,缺省是关闭的。增量垃圾收集器能减小偶然发生的长时间的垃圾回收形成的暂停时间。但增量垃圾收集器和应用程序并发执行,所以会占用部分CPU在应用程序上的功能。 8. -Xloggc:<file>将虚拟机每次垃圾回收的信息写到日志文件中,文件名由file指定,文件格式是平文件,内容和-verbose:gc输出内容相同。9. -Xbatch虚拟机的缺省运行方式是在后台编译类代码,而后在前台执行代码,使用-Xbatch参数将关闭虚拟机后台编译,在前台编译完成后再执行。10.-Xms<size>设置虚拟机可用内存堆的初始大小,缺省单位为字节,该大小为1024的整数倍而且要大于1MB,可用k(K)或m(M)为单位来设置较大的内存数。初始堆大小为2MB。例如:-Xms6400K,-Xms256M11.-Xmx<size>设置虚拟机内存堆的最大可用大小,缺省单位为字节。该值必须为1024整数倍,而且要大于2MB。可用k(K)或m(M)为单位来设置较大的内存数。缺省堆最大值为64MB。例如:-Xmx81920K,-Xmx80M当应用程序申请了大内存运行时虚拟机抛出java.lang.OutOfMemoryError: Java heap space错误,就须要使用-Xmx设置最大内存。12.-Xss<size>设置线程栈的大小,缺省单位为字节。与-Xmx相似,也可用K或M来设置较大的值。一般操做系统分配给线程栈的缺省大小为1MB。 另外也可在java中建立线程对象时设置栈的大小,构造函数原型为Thread(ThreadGroup group, Runnable target, String name, long stackSize)。13.-Xprof输出CPU运行时的诊断信息。14.-Xfuture对类文件进行严格格式检查,以保证类代码符合类代码规范。为保持向后兼容,虚拟机缺省不进行严格的格式检查。15.-Xrs减小虚拟机中操做系统的信号(singals)的使用。该参数一般用在虚拟机之后台服务方式运行时使用(如Servlet)。16.-Xcheck:jni1、运行class文件 执行带main方法的class文件,命令行为:java <CLASS文件名>注意:CLASS文件名不要带文件后缀.class例如:java Test若是执行的class文件是带包的,即在类文件中使用了:package <包名>那应该在包的基路径下执行,命令行为:java <包名>.CLASS文件名例如:PackageTest.java中,其包名为:com.ee2ee.test,对应的语句为:package com.ee2ee.test;PackageTest.java及编译后的class文件PackageTest.class的存放目录以下:classes |__com |__ee2ee |__test |__PackageTest.java |__PackageTest.class要运行PackageTest.class,应在classes目录下执行:java com.ee2ee.test.PackageTest 2、运行jar文件中的class 原理和运行class文件同样,只需加上参数-cp <jar文件名>便可。例如:执行test.jar中的类com.ee2ee.test.PackageTest,命令行以下:java -cp test.jar com.ee2ee.test.PackageTest 3、显示jdk版本信息 当一台机器上有多个jdk版本时,须要知道当前使用的是那个版本的jdk,使用参数-version便可知道其版本,命令行为:java -version 4、增长虚拟机可使用的最大内存 java虚拟机可以使用的最大内存是有限制的,缺省值一般为64MB或128MB。若是一个应用程序为了提升性能而把数据加载内存中而占用较大的内存,好比超过了默认的最大值128MB,须要加大java虚拟机可以使用的最大内存,不然会出现Out of Memory(系统内存不足)的异常。启动java时,须要使用以下两个参数:-Xms java虚拟机初始化时使用的内存大小-Xmx java虚拟机可使用的最大内存以上两个参数中设置的size,能够带单位,例如:256m表示256MB举例说明:java -Xms128m -Xmx256m ...表示java虚拟机初始化时使用的内存为128MB,可以使用的最大内存为256MB。对于tomcat,能够修改其脚本catalina.sh(unix平台)或catalina.bat(windows平台),设置变量JAVA_OPTS便可,例如:JAVA_OPTS='-Xms128m -Xmx256m' 在控制台输出信息中,有个-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,我是没辙了。若是你会这些,仍是没有看明白,那么你赶忙学学英语吧,这样你就能看懂了。