1.概述
Java支持的运行参数包括如下几种:
标准参数(-):所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
非标准参数(-X):默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
非Stable参数(-XX):此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用;
2. 标准参数
标准参数又可以分为如下几种:
运行模式相关的,如-server,-client,
类,jar路径相关的,如-cp,-classpath
运行调试相关的,如断言开关(-ea和-da),-verbose系列(-verbose:class,–verbose:gc等)
设置系统变量的-D参数。
2.1 运行模式相关的
关于-client 与-server :
JVM工作在Server模式可以大大提高性能,但应用的启动会比client模式慢大概10%。当该参数不指定时,虚拟机启动检测主机是否为服务器,如果是,则以Server模式启动,否则以client模式启动。Client模式启动速度较快,Server模式启动较慢;但是启动进入稳定期长期运行之后Server模式的程序运行速度比Client要快很多。这是因为Server模式启动的JVM采用的是重量级的虚拟机,对程序采用了更多的优化;而Client模式启动的JVM采用的是轻量级的虚拟机。所以Server启动慢,但稳定后速度比Client远远要快。
2.2 类,jar路径相关的
-cp :目录和 zip/jar 文件的类搜索路径
-classpath: 目录和 zip/jar 文件的类搜索路径。 用 : 分隔的目录, JAR 档案
和 ZIP 档案列表, 用于搜索类文件。
2.3 运行调试相关的
(1)verbose
-verbose:class
在程序运行的时候究竟会有多少类被加载呢,一个简单程序会加载上百个类的!你可以用verbose:class来监视,在命令行输入java -verbose:class XXX (XXX为程序名)你会在控制台看到加载的类的情况。
verbose和verbose:class含义相同,输出虚拟机装入的类的信息,显示的信息格式如下: [Loaded java.io.FilePermission$1 from shared objects file] 当虚拟机报告类找不到或类冲突时可用此参数来诊断来查看虚拟机从装入类的情况。
–verbose:gc
在虚拟机发生内存回收时在输出设备显示信息,格式如下: [Full GC 268K->168K(1984K), 0.0187390 secs] 该参数用来监视虚拟机内存回收的情况。
java –verbose:jni
-verbose:jni输出native方法调用的相关情况,一般用于诊断jni调用错误信息。
断言
Java断言默认是不启用的.在运行时,是需要显式开启才能生效,否则断言没有任何意义
开启断言:-ea
关闭断言:不指定-ea参数,或是加上-da
另外,断言可以开启局部断言,格式如下:
-ea:<classname> java -ea:MyClass1 打开MyClass1的assertion
-da:<classname> java -da: MyClass1 关闭MyClass1的assertion
-ea:<packagename> java -ea:pkg1 打开pkg1包的assertion
-da:<packagename> java -da:pkg1 关闭pkg1包的assertion
-ea:... java -ea:... 打开缺省包(无名包)的assertion
-da:... java -da:... 关闭缺省包(无名包)的assertion
-ea:<packagename>... java -ea:pkg1... 打开pkg1包和其子包的assertion
-da:<packagename>... java -da:pkg1... 关闭pkg1包和其子包的assertion
-esa java -esa 打开系统类的assertion
-dsa java -dsa 关闭系统类的assertion
1
2
3
4
5
6
7
8
9
10
当开始断言后,在程序中的如下代码就会生效:
assert <布尔表达式>
assert <布尔表达式> : <错误信息>
1
2
2.4 设置系统变量的-D参数
格式:-D<name>=<value>
作用:配置一些环境变量,具体有哪些参数,参数有什么效果,和你用的实际环境、项目架构都有关
示例:
public class TestDPara {
public static void main(String[] args) {
String value= System.getProperty("key1");
System.out.println(value);
}
}
1
2
3
4
5
6
7
8
运行程序:java -Dkey1=sdfdsfdsfdsfsd TestDPara
另外,一些标准的Property列表如下:
key value
“file.separator” Character that separates components of a file path. This is “/” on UNIX
“java.class.path” Path used to find directories and JAR archives containing class files.
“java.home” Installation directory for Java Runtime Environment (JRE)
“java.vendor” JRE vendor name
“java.vendor.url” JRE vender URL
“java.version” JRE version number
“line.separator” Sequence used by operating system to separate lines in text files
“os.arch” Operating system architecture
“os.name” Operating system name
“os.version” Operating system version
“path.separator” Path separator character used in java.class.path
“user.dir” User working directory
“user.home” User home directory
“user.name” User account name
3. 非标准参数(-X)
常用的-X 参数包括堆栈配置的、监控相关的
3.1 堆栈配置、垃圾回收
(1)-Xmnsize :设置初始和最大的年轻代大小。可以指定单位k(K),m(M),g(G) .年轻代存储新创建的对象,这个区域的垃圾回收的频率要比其他区域
高的多。如果这个区域太小了,那么垃圾回收的次数就会太多,如果太大了,垃圾回收就会浪费更多的时间。oracle建议年轻代的大小是
堆总大小的四分之一到二分之一之间。下面的例子展示了怎么设置年轻代的大小为256m:
-Xmn256m
-Xmn262144k
-Xmn268435456
我们还可以通过其他两个选项来代替这个选项来指定年轻代最小和最大内存: -XX:NewSize 指定初始化大小。 -XX:MaxNewSize:指定最大内存。
(2)-Xmssize :设置初始化堆内存大小,这个值的大小必须是1024的倍数,并且大于1M, 可以指定单位k(K),m(M),g(G)。下面的例子把堆的初始化大小
设置成6M。
-Xms6291456
-Xms6144k
-Xms6m
如果没有设置这个值,那么它的初始化大小就是年轻大和老年代的和。年轻代初始化大小可以通过-Xmn和-XX:NewSize 选项来指定。
(3)-Xmxsize :设置最大堆内存大小,这个值的大小必须是1024的倍数,并且大于2M,可以指定单位k(K),m(M),g(G)。默认值是根据运行时的系统配置来确定的。
一般服务器部署时,把-Xms和-Xmx的值设置成相同的大小。下面的例子把堆最大内存设置成80M
-Xmx83886080
-Xmx81920k
-Xmx80m
1
2
3
-Xmx选项和-XX:MaxHeapSize相同。
(4)-Xnoclassgc :禁止类的垃圾回收,这个以节省一些GC时间,缩短应用运行时的中断时间。 当设置了这个选项的时候,类对象在GC时不会受到任何影响,它会被认为是一直存活的。这就使得更多的内存是永久保留的。如果使用不慎的话就会导致内存溢出的异常。
3.2 编译优化相关的
(1)-Xbatch :禁止后台编译,默认JVM编译方法都是作为一个后台任务,编译完成后解释执行。使用此选项禁用后台编译,在前台编译完成后执行。
(2)-Xmixed :使用混合模式运行代码:解释模式和编译模式
(3)-Xint :仅仅使用解释模式执行方法,编译成本地方法的功能被禁用,JIT编译带来的好处将不复存在。
(4)-Xcomp :你可以指定在编译之前需要解释执行的次数。使用XX:CompileThreshold选项。
(5)-Xmaxjitcodesize=size :指定JIT编译代码的最大缓存,单位是字节。 也可以指定单位k(K)或m(M)。默认的最大缓存是240M。如果禁止分层编译的话,
默认大小就是48M。-Xmaxjitcodesize=240m。这个选项和-XX:ReservedCodeCacheSize类似。
-Xsssize :设置线程栈的大小。可以指定单位k(K),m(M),g(G)。默认值根据内存而定。
下面的例子指定栈大小为1024KB:
-Xss1m
-Xss1024k
-Xss1048576
这个选项和-XX:ThreadStackSize相同。
3.3 调试、 监控
(1)-Xprof :在程序的运行过程中输出性能分析数据,这个选项一般作为开发过程中,不建议在生产环境中使用。
(2)-Xloggc:filename :把GC信息输出到文件中,和verbose:gc的内容是一样的。如果这两个命令一起使用的话,Xloggc会覆盖verbose命令。
比如:-Xloggc:garbage-collection.log
(3)-Xdiag :显示额外的诊断信息
(4)-Xdebug :提供向后兼容的能力。
(5)-Xcheck:jni :对java本地接口方法添加额外的检查,在处理JNI请求之前会检查传递的参数和运行时环境数据。任何会产生问题的本地代码都会终止JVM。 使用这个选项会降低性能。
(6)-Xfuture :强制检查类文件格式,开发者被鼓励在开发时使用这个选项,因为在未来的版本中这个严格的检查会成为默认选项。
(7)-Xverify:mode :设置字节码验证模式。字节码验证可以帮助我们找到一些问题。mode的参数如下:
none:不进行验证。这回节省应用启动时间,同时也减少了java提供的保护。
remote:验证那些不是被引导类加载器加载的类。这是默认的设置。
all:验证所有的类。
1
2
3
3.4 其他
-X :展示出所有可用的-X选项
-Xbootclasspath:path :指定一系列用分号分开的目录、jar、或者zip文件,从中搜索引导类文件,这些文件都包含在JDK中。 不要在部署应用的时候使用这个选项覆盖rt.jar中的类,因为这违反JRE规范。
-Xbootclasspath/a:path :在引导类路径的结尾指定一系列用分号分开的目录、jar、或者zip文件,从中搜索引导类文件。 不要在部署应用的时候使用这个选项覆盖rt.jar中的类,因为这违反JRE规范。
-Xbootclasspath/p:path :在引导类路径之前指定一系列用分号分开的目录、jar、或者zip文件,从中搜索引导类文件。
不要在部署应用的时候使用这个选项覆盖rt.jar中的类,因为这违反JRE规范。
-Xinternalversion :比-version命令展示更多的JVM版本信息,然后退出。
-Xrs :减少JVM使用的操作系统信号。 关闭钩子使得java应用通过执行用户的清理代码来循序的关闭(比如数据库连接),尽管JVM图鉴终止。 JVM监控控制台,通过关闭钩子来防止意外终止。 通常,JVM注册一个控制台处理程序,它会开始关闭钩子并返回TURE,当遇到CTRL_C_EVENT, CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, and CTRL_SHUTDOWN_EVENT。JVM使用相同的原理来实现线程栈的备份已达到调试的目的。JVM使用CTRL_BREAK_EVENT 来保证线程栈备份。
如果JVM作为一个服务(比如:文本服务的servlet引擎),它可以接受CTRL_LOGOFF_EVENT,但是不会开始关闭,因为操作系统不会终止这个进程。
我们可以使用-Xrs来避免这种情况,当使用这个选项的时候,JVM不会注册控制台处理程序,也就意味着不会监控CTRL_C_EVENT, CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, or CTRL_SHUTDOWN_EVENT.这些事件。
使用这个选项会导致两个后果:
(1)Ctrl + Break 线程栈备份不再起作用
(2)用户代码必须为关闭钩子而负责,比如:当JVM终止的时候调用System.exit()。
-Xshare:mode :设置类数据共享(CDS)模式。可能得mode参数如下:
auto:如果可能就是用CDS,这是32位 client模式JVM的默认值。
on:开启类数据共享。如果某个类共享不可用,那么将打印错误并退出。
off:关闭类共享。这是32位 server模式JVM、64位JVM的默认设置。
dump:手动生成CSD文档,你将为每一个新的JDK版本重新生成CDS文档。
1
2
3
4
-XshowSettings:category :查看设置。可能的category参数如下。
all:所有的设置,这是默认值。
locale:本地设置。
properties:系统属性设置。
vm:JVM设置。
1
2
3
4
4. 非Stable参数(-XX)
原文地址:https://www.cnblogs.com/w-wfy/p/6415856.html
4.1 相关相关的(主要是gc算法)
参数及其默认值 描述
-XX:-DisableExplicitGC 禁止调用System.gc();但jvm的gc仍然有效
-XX:+MaxFDLimit 最大化文件描述符的数量限制
-XX:+ScavengeBeforeFullGC 新生代GC优先于Full GC执行
-XX:+UseGCOverheadLimit 在抛出OOM之前限制jvm耗费在GC上的时间比例
-XX:-UseConcMarkSweepGC 对老生代采用并发标记交换算法进行GC
-XX:-UseParallelGC 启用并行GC
-XX:-UseParallelOldGC 对Full GC启用并行,当-XX:-UseParallelGC启用时该项自动启用
-XX:-UseSerialGC 启用串行GC
-XX:+UseThreadPriorities 启用本地线程优先级
4.2 性能调优参数列表
参数及其默认值 描述
-XX:LargePageSizeInBytes=4m 设置用于Java堆的大页面尺寸
-XX:MaxHeapFreeRatio=70描述 GC后java堆中空闲量占的最大比例
-XX:MaxNewSize=size 新生成对象能占用内存的最大值
-XX:MaxPermSize=64m 老生代对象能占用内存的最大值
-XX:MinHeapFreeRatio=40 GC后java堆中空闲量占的最小比例
-XX:NewRatio=2 新生代内存容量与老生代内存容量的比例
-XX:NewSize=2.125m 新生代对象生成时占用内存的默认值
-XX:ReservedCodeCacheSize=32m 保留代码占用的内存容量
-XX:ThreadStackSize=512 设置线程栈大小,若为0则使用系统默认值
-XX:+UseLargePages 使用大页面内存
4.3 调试参数列表
参数及其默认值 描述
-XX:HeapDumpPath=./java_pid.hprof 指定导出堆信息时的路径或文件名
-XX:-HeapDumpOnOutOfMemoryError 当首次遭遇OOM时导出此时堆中相关信息
-XX:-PrintConcurrentLocks 遇到Ctrl-Break后打印并发锁的相关信息,与jstack -l功能相同
-XX:-TraceClassLoading 跟踪类的加载信息
-XX:OnError=";" 出现致命ERROR之后运行自定义命令
附录:Java程序支持的所有运行参数列表
Java程序支持的所有运行参数列表如下:
C:\Users\dan>java
用法: java [-options] class [args...]
(执行类)
或 java [-options] -jar jarfile [args...]
(执行 jar 文件)
其中选项包括:
-d32 使用 32 位数据模型 (如果可用)
-d64 使用 64 位数据模型 (如果可用)
-server 选择 "server" VM
默认 VM 是 server.
-cp <目录和 zip/jar 文件的类搜索路径>
-classpath <目录和 zip/jar 文件的类搜索路径>
用 ; 分隔的目录, JAR 档案
和 ZIP 档案列表, 用于搜索类文件。
-D<名称>=<值>
设置系统属性
-verbose:[class|gc|jni]
启用详细输出
-version 输出产品版本并退出
-version:<值>
警告: 此功能已过时, 将在
未来发行版中删除。
需要指定的版本才能运行
-showversion 输出产品版本并继续
-jre-restrict-search | -no-jre-restrict-search
警告: 此功能已过时, 将在
未来发行版中删除。
在版本搜索中包括/排除用户专用 JRE
-? -help 输出此帮助消息
-X 输出非标准选项的帮助
-ea[:<packagename>...|:<classname>]
-enableassertions[:<packagename>...|:<classname>]
按指定的粒度启用断言
-da[:<packagename>...|:<classname>]
-disableassertions[:<packagename>...|:<classname>]
禁用具有指定粒度的断言
-esa | -enablesystemassertions
启用系统断言
-dsa | -disablesystemassertions
禁用系统断言
-agentlib:<libname>[=<选项>]
加载本机代理库 <libname>, 例如 -agentlib:hprof
另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help
-agentpath:<pathname>[=<选项>]
按完整路径名加载本机代理库
-javaagent:<jarpath>[=<选项>]
加载 Java 编程语言代理, 请参阅 java.lang.instrument
-splash:<imagepath>
使用指定的图像显示启动屏幕
有关详细信息, 请参阅 http://www.oracle.com/technetwork/java/javase/documentation
/index.html。
C:\Users\dan>