文章目录
- 语法介绍
- Options
- Standard Options
- -agentlib:libname[=options]
- -Dproperty=value
- -classpath
- -cp
- -jar filename
- -verbose:class
- -verbose:gc
- Non-Standard Options
- -X
- -Xloggc:filename
- -Xmnsize
- -Xmssize
- -Xmxsize
- -Xprof
- -Xsssize
- Advanced Runtime Options
- -XX:ErrorFile=filename
- -XX:MaxDirectMemorySize=size
- -XX:ThreadStackSize=size
- Advanced JIT Compiler Options
- Advanced Serviceability Options
- -XX:+HeapDumpOnOutOfMemoryError
- -XX:HeapDumpPath=path
- Advanced Garbage Collection Options
- -XX:ConcGCThreads=threads
- -XX:G1HeapRegionSize=size
- -XX:+G1PrintHeapRegions
- -XX:G1ReservePercent=percent
- -XX:InitialSurvivorRatio=ratio
- -XX:MaxGCPauseMillis=time
- -XX:MaxMetaspaceSize=size
- -XX:MaxNewSize=size
- -XX:NewRatio=ratio
- -XX:NewSize=size
- -XX:ParallelGCThreads=threads
- -XX:+PrintGC
- -XX:+PrintGCDateStamps
- -XX:+PrintGCDetails
- -XX:+PrintGCTimeStamps
- -XX:SurvivorRatio=ratio
- -XX:TLABSize=size
- -XX:+UseConcMarkSweepGC
- -XX:+UseG1GC
- -XX:+UseParallelGC
- -XX:+UseParallelOldGC
- -XX:+UseParNewGC
- -XX:+UseSerialGC
- Performance Tuning Examples
- 参考网址
语法介绍
java
命令是用于启动Java
应用的。其语法有如下两种。
java [options] classname [args]
java [options] -jar filename [args]
选项 | 描述 |
| 用 |
| 用于启动的类的全限定名 |
| 将被调用的JAR文件,只能和 |
| 传递给 |
java
命令通过启动一个Java Runtime Environment (JRE)
来运行Java
程序,加载指定的类和调用该类的main()
方法。该方法必须是public
和static
的,必须不返回任何值,必须接收一个String
数组作为参数。方法声明可参考这个例子:public static void main(String[] args)
。
对于java
命令第一种用法,会根据classname
指定的类来启动。
对于java
命令第二种用法即指定了-jar
,会根据JAR
文件里的META-INF/MANIFEST.MF
里Main-Class
指定的类来启动。如下图所示
JRE
会在三个地方寻找启动类和其他应用所依赖的类:the bootstrap class path, the installed extensions, and the user's class path.
在classname
或者JAR
文件后面的参数会传递给启动类的main()
方法。
Options
java
命令支持很多选项,大致可以分为如下几类:
Standard Options
Non-Standard Options
Advanced Runtime Options
Advanced JIT Compiler Options
Advanced Serviceability Options
Advanced Garbage Collection Options
Standard Options
,所有的JVM
都支持,如常见的操作:检查JRE
版本、设置classpath
、开启verbose
等。
Non-standard options
,是特定于Java HotSpot Virtual Machine
的通用选项,不保证所有的JVM
都支持,并且可能会发生变化,这些选项以-X
开头。
Advanced options
,不建议随意使用。这些是用于调优Java HotSpot Virtual Machine
特定区域的开发人员选项,这些操作通常具有特定的系统需求,可能需要特权访问系统配置参数。它们也不能保证被所有JVM实现所支持,并且可能会发生变化。这些高级选项以-XX
开头。
可以参考JDK过时参数来追踪在新版本过时和移除的选项。
Boolean Option
是用于关闭或者打开一个feature
的,可通过-XX:+OptionName
来开启某个feature
,通过-XX:-OptionName
来关闭某个feature
。
对于那些需要参数的option
,参数和option
之间可能用空格
或者:
或者=
隔开,或者参数直接跟在option
后面,每个option
的语法是不同的。
如果是想确定bytes
大小,可以直接写bytes
大小,也可以使用k
或K
表示KB
,使用m
或M
表示MB
,使用g
或G
表示GB
。譬如向指定一个8G大小的内存,可以用8g, 8192m, 8388608k, or 8589934592
。
如果想表示百分比,可以使用0
到1
的小数,如0.25
就表示25%
。
Standard Options
-agentlib:libname[=options]
加载指定的native agent library
(本地库),库名后面接着的是逗号分隔
的参数。
譬如指定-agentlib:foo
,那么JVM
会在环境变量LD_LIBRARY_PATH
指定的路径尝试去加载名为libfoo.so
的文件。
-agentlib:hprof=cpu=samples,interval=20,depth=3
展示了如何加载heap profiling tool (HPROF) library
去每隔20ms获取CPU
信息,栈深度为3
更详细的介绍可以通过java -agentlib:hprof=help
获取。
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000
展示了使用socket
去监听等待一个debugger
去连接java -agentlib:jdwp=transport=dt_socket,address=localhost:8000
展示了使用socket
去连接一个指定地址的debugger
更详细的介绍可以通过java -agentlib:jdwp=help
获取。
-Dproperty=value
设置属性变量,其中property
是没有空格的字符串,代表某个属性,value
也是字符串,表示该属性的值,如果value
包含空格,可以使用双引号""
包裹,譬如-Dfoo="foo bar"
-classpath
设置JVM
的环境变量,指示JVM
如何去搜索class
文件。Java
是编译型语言,源码文件是.java
,但编译后的.class
文件才是真正可以被JVM
执行的字节码。因此,JVM
需要知道,如果想加载一个abc.xyz.Hello
的类,应该去哪搜索对应的Hello.class
文件。
所以classpth
就是一组目录的集合,它设置的搜索路径与操作系统相关。Windows
上使用;
分隔,Linux
上使用:
分隔
-- 如下面是Windows ,由于目录有空格所以用双引号括起来
C:\work\project1\bin;C:\shared;"D:\My Documents\project1\bin"
-- 如下面是Linux
/usr/shared:/usr/local/bin:/home/omm/bin
假设classpath
是.:/home/omm/bin:/usr/local/bin
,当JVM
加载这个abc.xyz.Hello
类时,会依次从
<Current Working Directory>/abc/xyz/Hello.class
/home/omm/bin/abc/xyz/Hello.class
/usr/local/bin/abc/xyz/Hello.class
注意.
表示当前目录,如果JVM
在某个路径下找到了对应的class
文件就不会继续往下搜索了,如果所有路径都没有找到则会报错。
强烈建议,不要去设置系统的classpath
环境变量,那样会污染整个环境。只有当启动JVM
时才去设置classpath
才是推荐的做法。也就是在调用java
命令时传入-cp
或者-classpath
参数。
如果没有设置系统环境变量,也没有传入-cp
参数,那么JVM默认的classpath
为.
,即当前目录。
java -cp .:/home/omm/bin:/usr/local/bin abc.xyz.Hello
-cp
是参数-classpath
的简写。
-jar filename
根据-jar
指定的JAR
文件里的启动类来启动,前面有说过。
关于JAR
文件的使用可以参考jar命令。jar
命令的使用和Linux下的tar
很相似,都需要先指定操作模式,c
创建JAR
文件,u
更新JAR
文件,x
解压JAR
文件,t
查看JAR
文件。其中f
是指定JAR
文件。更详细的命令可以参考上面的官网地址。
-verbose:class
显示每个已加载类的信息
-verbose:gc
显示每个GC事件的信息
Non-Standard Options
-X
显示所有的 -X
选项的信息
-Xloggc:filename
设置存放GC
信息的文件。写入该文件的信息和-verbose:gc
的输出是一样的。如果同一个java
命令里-Xloggc
和-verbose:gc
都设置了,则前者会覆盖后者。
例如:-Xloggc:garbage-collection.log
-Xmnsize
设置堆heap
中年轻代young generation
的初始值和最大值。
堆heap
中年轻代young generation
是用于存放新对象的。该区域的GC操作比其他区域会频繁些。如果该区域太小,那么将会有很多的minor garbage collections
执行。如果该区域太大,那么只会有full garbage collections
执行,并且full gc
会耗费很长的时间去完成。
建议将年轻代young generation
的大小保持在总体堆内存的1/4
到1/2
之间。
例如-Xmn256m
就是设置年轻代为256M
。
更建议使用-XX:NewSize
设置年轻代的初始大小,-XX:MaxNewSize
设置年轻代的最大值。而不是使用-Xmnsize
来统一设置年轻代的初始值和最大值。
-Xmssize
设置堆heap
的初始值。
例如-Xms6m
将堆heap
的初始值设置为6M
。
如果没有显示地设置该值,那么堆heap
的初始值为年轻代和老年代大小之和。年轻代的值由-Xmnsize
或者-XX:MaxNewSize
来设置。
-Xmxsize
设置堆heap
的最大值。默认值会在运行时根据系统配置情况设置。
通常在服务器运行时-Xms
和-Xmx
设置为一样的值,具体原因可参考GC调优。
例如-Xmx80m
将堆heap
的最大值设置为80M
。-Xmx
等价于-XX:MaxHeapSize
。
-Xprof
对运行中的程序进行分析,并将分析的数据输出到standard output
。在开发阶段很有用,生产环境不建议。
-Xsssize
设置线程栈thread stack
大小。
例如-Xss1m
将线程栈设置为1M
。不同的服务器有不同的默认值。-Xss
等价于-XX:ThreadStackSize
。
Advanced Runtime Options
-XX:ErrorFile=filename
指定当发生不可恢复的错误时,写入错误数据的文件名(包括路径)。默认情况下,文件会在当前工作目录current working directory
下生成,名为hs_err_pid${pid}.log
,其中${pid}
就是导致错误的进程的进程id。下面的例子展示了如何去设置一个默认的文件【注意进程的标识符设置为%p
】。-XX:ErrorFile=./hs_err_pid%p.log
也可以设置为带路径的文件,-XX:ErrorFile=/var/log/java/java_error.log
如果文件无法在当前目录创建(由于空间不足、权限或其他问题),那么文件会在操作系统的临时文件夹创建,譬如Linux
操作系统下临时文件夹就是/tmp
。
-XX:MaxDirectMemorySize=size
指定New I/O
用到的direct buffer
的最大值。默认值是0,表示JVM
对于New I/O
用到的direct buffer
会自动选定一个值。
例如-XX:MaxDirectMemorySize=1m
将NIO
用到的direct buffer
设置为1M
。
-XX:ThreadStackSize=size
与上面的-Xss
一样。
Advanced JIT Compiler Options
这些选项控制JVM
执行的动态编译just-in-time (JIT) compilation
Advanced Serviceability Options
这些选项提供了收集系统信息和执行广泛调试的能力。
-XX:+HeapDumpOnOutOfMemoryError
当发生java.lang.OutOfMemoryError
异常时,通过heap profiler
即HPROF
启用将Java
堆heap
转储(dump
)到当前目录的文件中的能力。
可以通过-XX:HeapDumpPath
显示设置堆转储文件(heap dump file
)的路径和文件名。默认情况下,该选项是禁用的,即当发生java.lang.OutOfMemoryError
异常时是不会生成堆转储文件的。
-XX:HeapDumpPath=path
当设置了-XX:+HeapDumpOnOutOfMemoryError
,设置HPROF
提供的堆转储文件的路径和文件名。默认情况下,文件会在当前工作目录current working directory
下创建,名为java_pid${pid}.hprof
,其中${pid}
就是导致错误的进程的标识符。-XX:HeapDumpPath=./java_pid%p.hprof
也可以设置为带路径的文件,-XX:HeapDumpPath=/var/log/java/java_heapdump.hprof
Advanced Garbage Collection Options
这些选项控制了JVM
的gc
是如何执行的。
-XX:ConcGCThreads=threads
设置concurrent GC
所使用的线程数,默认值依赖于JVM
可用的CPU
数。
例如-XX:ConcGCThreads=2
将concurrent GC
所使用的线程数设置为2。
-XX:G1HeapRegionSize=size
当使用G1
收集器时,Java
堆会细分成多个region
,设置region
的大小,值在1MB
和32MB
之间。默认值依赖于堆大小。
例如-XX:G1HeapRegionSize=16m
将region
大小设置为16M
。
-XX:+G1PrintHeapRegions
开启打印关于哪些region
被分配和哪些region
被G1收集器回收的信息。默认情况下,此选项是禁用的。
-XX:G1ReservePercent=percent
设置百分之多少的堆来作为保留来避免G1收集器回收时发生失败,默认是10%,值的范围应在10%到50%。
例如-XX:G1ReservePercent=20
将其设置为20%。
-XX:InitialSurvivorRatio=ratio
设置eden
区和survivior
区的比例,默认是8。公式S=Y/(R+2)
,其中Y
就表示年轻代的大小,R
就是该ratio
,S
就是survivor
的大小。默认即是8:1:1
。其中2
表示有两个survivior
。
例如-XX:InitialSurvivorRatio=4
将ratio
设置为4。
-XX:MaxGCPauseMillis=time
设置GC
暂时时间的最大值,但是为毫秒,这是目标,实际上是没有最大值的。
-XX:MaxMetaspaceSize=size
设置可以为类metaspace
分配的最大本机内存量。默认情况下,大小是没有限制的。应用程序的元数据量取决于应用程序本身、其他正在运行的应用程序和系统上可用的内存量。
例如-XX:MaxMetaspaceSize=256m
将其设置为256M
。
-XX:MaxNewSize=size
设置年轻代的最大值。一般即用默认值。
-XX:NewRatio=ratio
新生代和年老代的堆内存占用比例。
默认值是2,则Old Generation是 Yong Generation的2倍,即Yong Generation占据内存的1/3
-XX:NewSize=size
等价于-Xmn
-XX:ParallelGCThreads=threads
设置在年轻代和老年代中做GC回收的线程数,依赖于JVM
可用的CPU
数。
-XX:+PrintGC
每个GC
都会打印信息。该选项默认是关闭的
-XX:+PrintGCDateStamps
输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintGCDetails
输出GC的详细日志
-XX:+PrintGCTimeStamps
输出GC的时间戳(以基准时间的形式)
-XX:SurvivorRatio=ratio
设置eden
区和survivior
区的比例,默认是8。
-XX:TLABSize=size
设置TLAB(thread-local allocation buffer)
的大小。
-XX:+UseConcMarkSweepGC
允许对老年代使用CMS
收集器。当使用高吞吐的-XX:+UseParallelGC
收集器无法满足应用程序的低延迟需求时,可以考虑使用CMS
收集器。当然-XX:+UseG1GC
也是另外一种选择。
默认情况下,该选项是禁止的。会根据JVM
类型和机器自动选择收集器。
当该选项开启后,-XX:+UseParNewGC
是默认开启的,你不应该禁用这个UseParNewGC
。
下面的组合-XX:+UseConcMarkSweepGC -XX:-UseParNewGC
已经过时了。
-XX:+UseG1GC
开启G1
收集器,适用于服务器,针对具有大量RAM的多处理器机器。它大概率满足GC暂时时间目标,同时保持良好的吞吐量。G1
收集器推荐用于需要使用大量堆(6GB或以上)且GC延迟要求有限(稳定且可预测的暂停时间低于0.5秒)的应用程序。
-XX:+UseParallelGC
允许使用并行清理垃圾收集器
(也称为吞吐量收集器
),通过利用多个处理器来提高应用程序的性能。
默认是关闭的,一旦开启,-XX:+UseParallelOldGC
会自动开启除非显示禁用它。
-XX:+UseParallelOldGC
对full gc
使用并行垃圾收集器
。
-XX:+UseParNewGC
对年轻代使用并行清理垃圾收集器
。默认情况是关闭的,通过设置-XX:+UseConcMarkSweepGC
来打开该选项。
-XX:+UseSerialGC
启用串行垃圾收集器
的使用。对于不需要垃圾收集任何特殊功能的小型简单应用程序,这通常是最佳选择。
Performance Tuning Examples
下面的示例展示如何使用JVM
参数来优化吞吐量或提供更低的响应时间。
- Tuning for Higher Throughput
java -d64 -server -XX:+AggressiveOpts -XX:+UseLargePages -Xmn10g -Xms26g -Xmx26g
- Tuning for Lower Response Time
java -d64 -XX:+UseG1GC -Xms26g Xmx26g -XX:MaxGCPauseMillis=500 -XX:+PrintGCTimeStamp