文章目录

  • 语法介绍
  • 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]
选项 描述
options 空格分隔的命令行options
classname 用于启动的类的全限定名
filename 将被调用的JAR文件,只能和-jar联合使用
args 传递给main()方法的参数, 用空格分隔

java命令通过启动一个Java Runtime Environment (JRE)来运行Java程序,加载指定的类和调用该类的main()方法。该方法必须是publicstatic的,必须不返回任何值,必须接收一个String数组作为参数。方法声明可参考这个例子:public static void main(String[] args)

对于java命令第一种用法,会根据classname指定的类来启动。
对于java命令第二种用法即指定了-jar,会根据JAR文件里的META-INF/MANIFEST.MFMain-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大小,也可以使用kK表示KB,使用mM表示MB,使用gG表示GB。譬如向指定一个8G大小的内存,可以用8g, 8192m, 8388608k, or 8589934592

如果想表示百分比,可以使用01的小数,如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/41/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=1mNIO用到的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 profilerHPROF启用将Javaheap转储(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

这些选项控制了JVMgc是如何执行的。

-XX:ConcGCThreads=threads

设置concurrent GC所使用的线程数,默认值依赖于JVM可用的CPU数。
例如-XX:ConcGCThreads=2concurrent GC所使用的线程数设置为2。

-XX:G1HeapRegionSize=size

当使用G1收集器时,Java堆会细分成多个region,设置region的大小,值在1MB32MB之间。默认值依赖于堆大小。
例如-XX:G1HeapRegionSize=16mregion大小设置为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就是该ratioS就是survivor的大小。默认即是8:1:1。其中2表示有两个survivior
例如-XX:InitialSurvivorRatio=4ratio设置为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

参考网址

Oracle Jdk8 Java命令介绍
GC日志分析
JVM内存参数
关于classpath和jar

Java命令详解(根据官网)相关推荐

  1. Linux显示文件目录分屏显示,Linux分屏显示文件内容-linux more命令详解-嗨客网

    Linux分屏显示文件内容(more)教程 在使用 more 命令时,最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能(与 Linu ...

  2. linux下awk命令详解,Linux文件处理awk命令-linux awk命令详解-嗨客网

    Linux文件处理awk命令详解教程 Linux awk命令说明 awk 是一个强大的文本分析工具,相对于 awk 有 3 个不同版本: awk.nawk 和 gawk,未作特别说明,一般指 gawk ...

  3. linux 移动剪切命令,Linux移动剪切文件和目录命令-Linux重命名文件和目录命令-Linux mv命令详解-嗨客网...

    Linux移动或重命名文件或目录(mv)教程 在 mv 命令会根据第二个参数类型的不同(是目标文件还是目标目录),将文件重命名或将其移至一个新的目录中.当第二个参数类型是文件时,mv 命令完成文件重命 ...

  4. linux显示当前目录下文件,Linux显示当前目录有哪些文件命令-linux ls命令详解-嗨客网...

    Linux显示当前目录文件(ls)教程 在 Linux ls命令详解 功能 显示当前目录或指定路径下面的文件列表. 语法 ls [options] [dirname] 参数 参数 描述 options ...

  5. java命令详解 java -D

    2019独角兽企业重金招聘Python工程师标准>>> JAVA 命令参数详解: 1.-D<name>=<value> set a system proper ...

  6. javac和java命令详解

    javac 是java语言编程编译器.全称java compiler.相信大家在学习java编程的时候,一定使用过javac和java这两个命令.大家在安装JDK的时候,验证是否安装成功,都会在命令行 ...

  7. Mock.js详解(结合官网)

    文章目录 安装 Mock.mock()拦截与响应 rurl rtype template Mock.mock( template ) Mock.mock( rurl, template ) Mock. ...

  8. java 远程shell脚本_java通过ssh连接服务器执行shell命令详解及实例

    java通过ssh连接服务器执行shell命令详解 java通过ssh连接服务器执行shell命令:JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转 ...

  9. 把java文件打包成.jar (jar命令详解)

    把java文件打包成.jar (jar命令详解) 先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1. ...

最新文章

  1. 【人尽其才】颠覆思维☞合理分配工作
  2. python里面ca_Python SSL服务器提供中间CA证书
  3. java检测按键_java – 在控制台中检测按键
  4. php请求aspx,PHP用curl函数POST请求到ASP页面提示无效请求
  5. dede login.php,DedeCms会员登录成功,又跳转到登录页面
  6. AI:神经网络调参(数据、层数、batch大小,学习率+激活函数+正则化+分类/回归)并进行结果可视化
  7. python中递归函数特点,Python递归函数特点及原理解析
  8. redis操作帮助类
  9. Oracle迁移数据库
  10. 大数据学习笔记27:MR案例——多输入源处理成绩
  11. BUG缺陷管理工具--测试用例执行
  12. 程序员撕开京东 618 大促压测的另一面 | 原力计划
  13. 使用java concurrent处理异步加载图片功能
  14. Grails Quartz插件,定时调度任务
  15. X Chen笔记---Centos安装使用xmr-stack-cpu教程
  16. 量化投资学习——股指期货研究(五)
  17. macOS - 安装 swig 、PCRE
  18. 解决win10没Wifi功能了,无线网卡驱动异常代码56的问题
  19. [欧洲之行]比利时布鲁塞尔
  20. Linux安装-gedit

热门文章

  1. jQuery知识点今日总结
  2. 转载]“不能打开暂存盘文件,因为该文件已锁定”解决办法
  3. bdsup2sub java_蓝光原盘压制Remux和Rip、Re 图文实例教程
  4. CSS:标准文档流、浮动、绝对定位—(解决有时候父元素不能自动扩展)
  5. 视频主观质量评价和视频客观质量评价
  6. 我的ArchLinux使用反馈--(更新暂停-入Mac)
  7. 矢量叉乘能否反求矢量
  8. ES6 -- find 详解
  9. 机器视觉 OpenCV—python 多目标跟踪与视频分析
  10. CSS实现button按钮的点击效果