JVM命令大全
jps
Java版的ps命令,查看java进程及其相关的信息,如果你想找到一个java进程的pid,那可以用jps命令替代linux中的ps命令了,简单而方便。
命令格式:
jps [options] [hostid]
options参数解释:
- -l : 输出主类全名或jar路径
- -q : 只输出LVMID
- -m : 输出JVM启动时传递给main()的参数
- -v : 输出JVM启动时显示指定的JVM参数
最常见示例:
jps -l `输出jar包路径,类全名`
jps -m `输出main参数`
jps -v `输出JVM参数`
便捷查询java进程路径
# 查看java进程(PID)
[root@hd208 console-api]# jps -l |grep dataapi
15766 ./bdata-dataapi-server-1.0.0.jar
# 查到PID后,通过pwdx ${PID}查看路径
[root@hd208 console-api]# pwdx 15766
15766: /opt/bdata/app/bdata-api/data-service
jinfo
jinfo是用来查看JVM参数和动态修改部分JVM参数的命令
命令格式:
jinfo [option] <pid>
options参数解释:
- -flag
打印指定名称的参数 - -flag [+|-]
打开或关闭参数 - -flag
= 设置参数 - -flags 打印所有参数
- -sysprops 打印系统配置
打印上面两个选项
最常用示例:
其中1为pid
查看JVM参数和系统配置
jinfo 11666``jinfo -flags 11666``jinfo -sysprops 1
查看打印GC日志参数
jinfo -flag PrintGC 11666``jinfo -flag PrintGCDetails 1
打开GC日志参数
jinfo -flag +PrintGC 11666``jinfo -flag +PrintGCDetails 1
关闭GC日志参数
jinfo -flag -PrintGC 11666``jinfo -flag -PrintGCDetails 1
还可以使用下面的命令查看那些参数可以使用jinfo命令来管理:
java -XX:+PrintFlagsFinal -version | `grep` manageable
jstat
jstat命令是使用频率比较高的命令,主要用来查看JVM运行时的状态信息,包括内存状态、垃圾回收等。
命令格式:
jstat [option] LVMID [interval] [count]
其中LVMID是进程id,interval是打印间隔时间(毫秒),count是打印次数(默认一直打印)
option参数解释:
- -class class loader的行为统计
- -compiler HotSpt JIT编译器行为统计
- -gc 垃圾回收堆的行为统计
- -gccapacity 各个垃圾回收代容量(young,old,perm)和他们相应的空间统计
- -gcutil 垃圾回收统计概述
- -gccause 垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因
- -gcnew 新生代行为统计
- -gcnewcapacity 新生代与其相应的内存空间的统计
- -gcold 年老代和永生代行为统计
- -gcoldcapacity 年老代行为统计
- -gcpermcapacity 永生代行为统计
- -printcompilation HotSpot编译方法统计
jstack
jstack是用来查看JVM线程快照的命令,线程快照是当前JVM线程正在执行的方法堆栈集合。使用jstack命令可以定位线程出现长时间卡顿的原因,例如死锁,死循环等。jstack还可以查看程序崩溃时生成的core文件中的stack信息。
命令格式:
jstack [-l] <pid>
(连接运行中的进程)
jstack -F [-m] [-l] <pid>
(连接挂起的进程)
jstack [-m] [-l] <executable> <core>
(连接core文件)
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(连接远程debug服务器)
option参数解释:
- -F 当使用jstack
无响应时,强制输出线程堆栈。 - -m 同时输出java和本地堆栈(混合模式)
- -l 额外显示锁信息
常用示例:
jstack -l 1 | more
jmap
jmap是用来生成堆dump文件和查看堆相关的各类信息的命令,例如查看finalize执行队列,heap的详细信息和使用情况。
命令格式:
**jmap [option] <pid>
(连接正在执行的进程)**a
jmap [option] <executable <core>
(连接一个core文件)
jmap [option] [server_id@]<remote server IP or hostname>
(链接远程服务器)
option参数解释:
to print same info as Solaris pmap - -heap 打印java heap摘要
- -histo[:live] 打印堆中的java对象统计信息
- -clstats 打印类加载器统计信息
- -finalizerinfo 打印在f-queue中等待执行finalizer方法的对象
- -dump:
生成java堆的dump文件
dump-options:
live 只转储存活的对象,如果没有指定则转储所有对象
format=b 二进制格式
file=
- -F 强制选项
常用示例:
jmap -dump:live,format=b,file=dump.hprof 1
jhat
jhat是用来分析jmap生成dump文件的命令,jhat内置了应用服务器,可以通过网页查看dump文件分析结果,jhat一般是用在离线分析上。
命令格式:
jhat [option] [dumpfile]
option参数解释:
- -stack false: 关闭对象分配调用堆栈的跟踪
- -refs false: 关闭对象引用的跟踪
- -port
: HTTP服务器端口,默认是7000 - -debug
: debug级别
0: 无debug输出
1: Debug hprof file parsing
2: Debug hprof file parsing, no server
- -version 分析报告版本
常用示例:
jhat dump.hprof
jar
JAR 文件以 ZIP 文件格式打包,因此您可以将它们用于无损数据压缩,归档,解压缩和归档解压缩等任务。常见jar操作如下:
Operation | Command |
---|---|
创建 jar | jar cf jar-file input-file(s) |
查看 jar 文件内容 | jar tf jar-file |
提取/解压 jar 文件内容 | jar xf jar-file |
提取指定文件 | jar xf jar-file archived-file(s) |
运行 jar(需要 Main-class 清单头文件) | java -jar app.jar |
jar参数释意:
创建jar
创建 JAR 文件的基本格式是:
jar cf jar-file input-file(s)
参数解释:
- c : 表示要创建一个 jar 文件
- f : 表示要输出到一个文件中
- jar-file : 生成 jar 文件的具体名称。惯例是 xxx.jar,后缀名称不是强制的
- input-file(s) : 可以输入一个或多个文件,包含
*
通配符,如果是一个目录则递归添加到 jar 归档中
c 和 f 选项可以按任意顺序出现,但是它们之间不应该有任何空格。
这个命令将生成一个压缩 JAR 文件并将其放入当前目录中。该命令还将为 JAR 存档生成一个默认的清单文件。
注意: JAR 文件中的元数据,例如条目名称、注释和清单的内容,必须是 UTF8 编码。
您可以将这些附加选项添加到基本命令的cf选项中:
option | 描述 |
---|---|
v | 输出每个被添加到 jar 中的文件详细路径 |
0 | 不压缩 jar 文件 |
M | 不生成默认的清单文件 |
m | 使用现有清单文件,命令格式 jar cmf jar-file existing-manifest input-file(s) ; 清单文件必须以 newLine 或则回车结束,否则不会正确解析 |
-c | 在执行命令期间更改目录。后面有例子解说 |
TIP
当你创建一个 JAR 文件时,创建的时间存储在 JAR 文件中。因此,即使 JAR 文件的内容没有改变, 当您多次创建 JAR 文件时,产生的文件也不是完全相同的。当您在构建环境中使用 JAR 文件时,您应该意识到这一点。 建议您在清单文件中使用版本化信息,而不是创建时间,来控制 JAR 文件的版本。请参阅设置包版本信息部分。
查看jar
查看 JAR 文件内容的命令的基本格式是:
jar tf jar-file
参数说明:
- t : 表示要查看 jar 文件的内容
- f : 表示从一个文件查看
- jar-file : 具体的文件路径
- v : 显示文件的大小和上次修改日期信息
同样,tf 没有固定顺序,但是中间不能有空格.
TIP 一个例子
$ jar tf TicTacToe.jar META-INF/ META-INF/MANIFEST.MF TicTacToe$1.class TicTacToe.class TicTacToe.java audio/ audio/beep.au audio/ding.au audio/return.au audio/yahoo1.au audio/yahoo2.au example1.html images/ images/cross.gif images/not.gif 加 v 输出详细信息 $ jar tvf TicTacToe.jar 0 Fri May 11 15:19:34 GMT+08:00 2018 META-INF/ 68 Fri May 11 15:19:34 GMT+08:00 2018 META-INF/MANIFEST.MF 550 Thu Mar 29 07:39:22 GMT+08:00 2018 TicTacToe$1.class 3705 Thu Mar 29 07:39:22 GMT+08:00 2018 TicTacToe.class 9584 Thu Mar 29 07:39:22 GMT+08:00 2018 TicTacToe.java 0 Fri May 11 15:09:34 GMT+08:00 2018 audio/ 4032 Thu Mar 29 07:39:22 GMT+08:00 2018 audio/beep.au 2566 Thu Mar 29 07:39:22 GMT+08:00 2018 audio/ding.au 6558 Thu Mar 29 07:39:22 GMT+08:00 2018 audio/return.au 7834 Thu Mar 29 07:39:22 GMT+08:00 2018 audio/yahoo1.au 7463 Thu Mar 29 07:39:22 GMT+08:00 2018 audio/yahoo2.au 424 Thu Mar 29 07:39:22 GMT+08:00 2018 example1.html 0 Fri May 11 15:09:34 GMT+08:00 2018 images/ 157 Thu Mar 29 07:39:22 GMT+08:00 2018 images/cross.gif 158 Thu Mar 29 07:39:22 GMT+08:00 2018 images/not.gif
提取/解压 Jar
用于提取 JAR 文件内容的基本命令是:
jar xf jar-file [archived-file(s)]
命令和参数:
- x : 表示要提取;extract 的缩写
- f : 从文件
- jar-file : 具体的文件
- archived-file(s) : 可选参数,要提取的指定文件由空格隔开,不指定则提取所有的文件
解压到当前文件路径,需要小心,如果当前文件有同名文件则会被覆盖;
更新Jar文件
Jar 工具提供了一个 u 选项,您可以通过修改它的清单或添加文件来更新现有 Jar 文件的内容。
jar uf jar-file input-file(s)
命令和参数:
- u : 表示更新现有的 jar
- f : 通过文件指定
- jar-file : 文件路径
- input-file(s) : 空格分割的多个文件或单个文件
把指定的文件添加到现有的 jar 文件红,jar 中已有文件将被覆盖;也可以指定新添加的文件添加到 jar 中的哪个目录下
JVM参数
标准参数
标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
通过命令 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>
使用指定的图像显示启动屏幕
非标准参数(-X)
非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
通过命令 java -X
,如下
java -X
-Xmixed 混合模式执行(默认)
-Xint 仅解释模式执行
-Xbootclasspath:<用 : 分隔的目录和 zip/jar 文件>
设置引导类和资源的搜索路径
-Xbootclasspath/a:<用 : 分隔的目录和 zip/jar 文件>
附加在引导类路径末尾
-Xbootclasspath/p:<用 : 分隔的目录和 zip/jar 文件>
置于引导类路径之前
-Xdiag 显示附加诊断消息
-Xnoclassgc 禁用类垃圾收集
-Xincgc 启用增量垃圾收集
-Xloggc:<file> 将 GC 状态记录在文件中(带时间戳)
-Xbatch 禁用后台编译
-Xms<size> 设置初始 Java 堆大小
-Xmx<size> 设置最大 Java 堆大小
-Xss<size> 设置 Java 线程堆栈大小
-Xprof 输出 cpu 分析数据
-Xfuture 启用最严格的检查,预计会成为将来的默认值
-Xrs 减少 Java/VM 对操作系统信号的使用(请参阅文档)
-Xcheck:jni 对 JNI 函数执行其他检查
-Xshare:off 不尝试使用共享类数据
-Xshare:auto 在可能的情况下使用共享类数据(默认)
-Xshare:on 要求使用共享类数据,否则将失败。
-XshowSettings 显示所有设置并继续
-XshowSettings:system
(仅限 Linux)显示系统或容器
配置并继续
-XshowSettings:all
显示所有设置并继续
-XshowSettings:vm 显示所有与 vm 相关的设置并继续
-XshowSettings:properties
显示所有属性设置并继续
-XshowSettings:locale
显示所有与区域设置相关的设置并继续
非Stable参数(-XX)
非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用(但是,这些参数往往是非常有用的). 通过命令java -XX:+PrintFlagsFinal
也可以通过-XX:+PrintCommandLineFlags
。这个参数的作用是显示出VM初始化完毕后所有跟最初的默认值不同的参数及它们的值。
这个参数至少在Sun JDK 5上已经开始支持,Oracle/Sun JDK 6以及Oracle JDK 7上也可以使用。
再下来,-XX:+PrintFlagsInitial 。这个参数显示在处理参数之前所有可设置的参数及它们的值,然后直接退出程序。
jvm参数说明
参数 | 说明 |
---|---|
-XX:+PrintVMOptions | jvm添加该参数,可以在程序运行时,打印虚拟机接受到的命令行显示参数(打印出我们显示指定的) |
-XX:+PrintCommandLineFlags | 可以打印出传递给虚拟机的显示和隐式参数,隐式参数未必是通过命令行直接给出的,它可能是由虚拟机启动时自行设置的 |
-XX:+PrintFlagsFinal | 它会打印所有的系统参数的值,通常我们会用来查看jvm参数的默认值 |
-Xms | 初始堆大小,默认为物理内存的1/64(<1GB);默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制 |
-Xmx | 最大堆大小,默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制 |