Java 命令
1. java命令简介
java命令是用来启动一个Java程序的。
2. 命令格式
1 |
|
- options:Command-line options. See Options.
- class:The name of the class to be called.
- file.jar:The name of the JAR file to be called. Used only with the -jar command.
- arguments:The arguments passed to the main function.
3. 命令参数详解
java命令通过启动Java运行时环境,加载指定的类并调用该类的main方法来启动一个Java应用程序
指定的class需要声明一个main方法,格式如下:
1 |
|
如果java命令后面没有option参数,那么紧跟其后的第一个参数就是Class的全路径二进制名。例如 java com.test.Test。
如果指定了-jar。那么-jar后面跟的就是个包含了main方法的JAR文件,例如 java -jar Test.jar
Java虚拟机启动的时候需要加载启动类和其他需要用到的类。查找的顺序分别是启动类路径,扩展类路径,以及用户类路径。可以通过java -verbose:class查看类加载的顺序
4 Options
当前的Java虚拟机支持的Options分成Standard Options和NonStandard Options
1. Standard Options
-cp,-classpath
虚拟机在运行一个类时,需要将其装入内存,虚拟机搜索类的方式和顺序如下:
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。
-cp 和 -classpath 它们用于告知虚拟机搜索目录名、jar文档名、zip文档名
- windows:包之间用分号 ; 分隔。
- linux: 包之间用冒号 : 分隔。
例如当你自己开发了公共类并包装成一个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。
为了方便,我们还可以用通配符*来代替多个路径
1 |
|
-client,-server
这两个参数用于设置虚拟机使用何种运行模式,client模式启动比较快,但运行时性能和内存管理效率不如server模式,通常用于客户端应用程序。相反,server模式启动比client慢,但可获得更高的运行性能。
在windows上,缺省的虚拟机类型为client模式,如果要使用 server模式,就需要在启动虚拟机时加-server参数,以获得更高性能,对服务器端应用,推荐采用server模式,尤其是多个CPU的系统。在 Linux,Solaris上缺省采用server模式。
-Dproperty=value
该参数通常用于设置系统级全局变量值,如配置文件路径,应为该属性在程序中任何地方都可访问。
在虚拟机的系统属性中设置属性名/值对,运行在此虚拟机之上的应用程序可用System.getProperty(“propertyName”)得到value的值。
如果value中有空格,则需要用双引号将该值括起来,如-Dname=”space string”。
示例1:
设置虚拟机使用的Extension搜索路径
1 |
|
-d32,-d64
1 |
|
-verbose:[class|gc|jni]
-verbose:class
verbose和verbose:class含义相同,输出虚拟机装入的类的信息,显示的信息格式如下:
[Loaded java.io.FilePermission$1 from shared objects file]
当虚拟机报告类找不到或类冲突时可用此参数来诊断来查看虚拟机从装入类的情况。-verbose:gc
在虚拟机发生内存回收时在输出设备显示信息,格式如下:
[Full GC 268K->168K(1984K), 0.0187390 secs]
该参数用来监视虚拟机内存回收的情况。-verbose:jni
在虚拟机调用native方法时输出设备显示信息,格式如下:
[Dynamic-linking native method HelloNative.sum … JNI]
该参数用来监视虚拟机调用本地方法的情况,在发生jni错误时可为诊断提供便利。
-version
显示可运行的虚拟机版本信息然后退出。一台机器上装有不同版本的JDK时
-showversion
显示版本信息以及帮助信息。
-ea[:…|:] 和 -enableassertions[:…|:]
从JDK1.4开始,java可支持断言机制,用于诊断运行时问题。通常在测试阶段使断言有效,在正式运行时不需要运行断言。断言后的表达式的值是一个逻辑值,为true时断言不运行,为false时断言运行,抛出java.lang.AssertionError错误。
上述参数就用来设置虚拟机是否启动断言机制,缺省时虚拟机关闭断言机制,用-ea 可打开断言机制,不加
例如要启动包com.foo.util中的断言,可用命令 ea:com.foo.util 。
注:ea是enableassertions的缩写
-da[:…|:] 和 -disableassertions[:…|:]
用来设置虚拟机关闭断言处理,packagename和classname的使用方法和-ea相同。
注:da应该是disableassertions的缩写
-esa 和-enablesystemassertions
设置虚拟机显示系统类的断言。
注:esa是enablesystemassertions的缩写
-dsa 和 -disablesystemassertions
设置虚拟机关闭系统类的断言。
注:dsa是disablesystemassertions的缩写
-agentlib:[=]
该参数是JDK5新引入的,用于虚拟机装载本地代理库。
Libname为本地代理库文件名,虚拟机的搜索路径为环境变量PATH中的路径,options为传给本地库启动时的参数,多个参数之间用逗号分隔。在Windows平台上虚拟机搜索本地库名为libname.dll的文件,在Unix上虚拟机搜索本地库名为libname.so的文件,搜索路径环境变量在不同系统上有所不同,Linux、SunOS、IRIX上为LD_LIBRARY_PATH,AIX上为LIBPATH,HP-UX上为SHLIB_PATH。
1 |
|
-agentpath:[=]
设置虚拟机按全路径装载本地库,不再搜索PATH中的路径。其他功能和agentlib相同。
-javaagent:[=]
虚拟机启动时装入java语言设备代理。Jarpath文件中的mainfest 文件必须有Agent-Class属性。代理类要实现public static void premain(String agentArgs, Instrumentation inst)方法。当虚拟机初始化时,将按代理类的说明顺序调用premain方法。
2. NonStandard Options 扩展参数说明
0. -X
打印出NonStandard Options(非标准参数)的帮助信息,并退出jvm
1.-Xmixed
设置-client模式虚拟机对使用频率高的方式进行Just-In-Time编译和执行,对其他方法使用解释方式执行。该方式是虚拟机缺省模式。
2.-Xint
设置-client模式下运行的虚拟机以解释方式执行类的字节码,不将字节码编译为本机码。
让虚拟机只在解释型模式下运行,不允许生成本地指令(就是禁用JIT)。有可能会损失性能
3. -Xbootclasspath:path 和 -Xbootclasspath/a:path 及 -Xbootclasspath/p:path
改变虚拟机装载缺省系统运行包rt.jar而从-Xbootclasspath中设定的搜索路径中装载系统运行类。除非你自己能写一个运行时,否则不会用到该参数。
/a:将在缺省搜索路径后加上path 中的搜索路径。
/p:在缺省搜索路径前先搜索path中的搜索路径。
4.-Xnoclassgc
关闭虚拟机对class的垃圾回收功能。有可能会导致OutOfMemoryError
5.-Xincgc
启动增量垃圾收集器,缺省是关闭的。增量垃圾收集器能减少偶然发生的长时间的垃圾回收造成的暂停时间。但增量垃圾收集器和应用程序并发执行,因此会占用部分CPU在应用程序上的功能。
6.-Xloggc:
将虚拟机每次垃圾回收的信息写到日志文件中,文件名由file指定,文件格式是平文件,内容和-verbose:gc输出内容相同。
7.-Xbatch
虚拟机的缺省运行方式是在后台编译类代码,然后在前台执行代码,使用-Xbatch参数将关闭虚拟机后台编译,在前台编译完成后再执行。
8-Xms
设置虚拟机可用内存堆的初始大小,缺省单位为字节,该大小为1024的整数倍并且要大于1MB,可用k(K)或m(M)为单位来设置较大的内存数。初始堆大小为2MB。
例如:-Xms83886080,-Xms6400K,-Xms256M
9.-Xmx
设置虚拟机内存堆的最大可用大小,缺省单位为字节。该值必须为1024整数倍,并且要大于2MB。可用k(K)或m(M)为单位来设置较大的内存数。缺省堆最大值为64MB。
例如:-Xmx83886080,-Xmx81920K,-Xmx80M
当应用程序申请了大内存运行时虚拟机抛出java.lang.OutOfMemoryError: Java heap space错误,就需要使用-Xmx设置堆的最大值
10.-Xss
设置线程栈的大小,缺省单位为字节。与-Xmx类似,也可用K或M来设置较大的值。通常操作系统分配给线程栈的缺省大小为1MB。
另外也可在java中创建线程对象时设置栈的大小,构造函数原型为Thread(ThreadGroup group, Runnable target, String name, long stackSize)。
11.-Xprof
输出CPU运行时的诊断信息。分析正在运行的程序,并将分析数据发送到标准输出。该选项作为一个在程序开发中很有用的实用程序提供,并不打算用于生产系统。
12.-Xfuture
对类文件进行严格格式检查,以保证类代码符合类代码规范。为保持向后兼容,虚拟机缺省不进行严格的格式检查。
13.-Xrs
减少虚拟机中操作系统的信号(singals)的使用。该参数通常用在虚拟机以后台服务方式运行时使用(如Servlet)。
14.-Xcheck:jni
调用JNI函数时进行附加的检查,特别地虚拟机将校验传递给JNI函数参数的合法性,在本地代码中遇到非法数据时,虚拟机将报一个致命错误而终止。使用该参数后将造成性能下降。
-Xmnsize or -XX:NewSize
指定年轻代的大小
-XX:+|-DisableAttachMechanism
是否允许Java VM被命令attach。默认是关闭的。如果要开启可以如下命令
java -XX:+DisableAttachMechanism
-XX:+|-FlightRecorder
性能分析工具。
-XXLargePageSizeInBytes=n
Specifies the maximum size for large pages.
-XX:MaxGCPauseMillis=n
设置最大的GC 暂停时间
-XX:NewSize
同-Xmnsize.
-XX:ParallelGCThreads=n
设置并行垃圾回收的线程数量
-XX:+UseConcMarkSweepGC or -XX:+UseG1GC
开启Concurrent Mark Sweep (CMS) 或 G1 垃圾回收器.
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps
打印带时间戳的垃圾回收日志