JAVA相关命令

jps

jps用于展示当前系统中该用户有权访问的所有java进程情况。

jps语法如下:
  • jps [options] [hostid]。options为命令行参数,hostid指特定主机,可以是ip地址、域名, 也可以指定具体协议和端口。
jps的options参数如下:
              
-q 只输出PID。
-m 输出传递给 main 方法的参数。对于嵌入式 JVM,输出可能为空。
-l 输出应用程序主类的完整包名或应用程序 JAR 文件的完整路径名。
-v 输出传递给 JVM 的参数。
-V 通过 flags 文件(.hotspotrc 文件或 -XX:Flags=<filename> 参数指定的文件)输出传递给 JVM
  的参数。本参数不常用。              
-J[option] 将选项传递给jps调用的java启动器。例如,-J-Xms48m是将启动内存设置为 48 兆字节。
              
            
原理

java程序在启动以后,会在java.io.tmpdir指定的目录下,就是临时文件夹里,生成一个类似于hsperfdata_UserName的文件夹,这个文件夹里(在Linux中为/tmp/hsperfdata_{userName})有几个名字为java进程的pid的文件。因此,列出当前运行的java进程,只是把这个目录里的文件名列一下而已。 至于系统的参数什么,解析这几个文件就可以获得。

失效的情况

现象:可能在服务器上会出现用“ps -ef | grep java”可以看到启动的java进程,用jps却查看不到该进程的pid。

分析:jps、jconsole、jvisualvm等工具的数据来源就是上面说到的java.io.tmpdir参数指定的目录下的文件(如/tmp/hsperfdata_userName/pid)。当该文件不存在,或者无法读取时就会出现jps无法查看该进程号,jconsole无法监控等问题。

具体原因可能是:

  • 磁盘读写、目录权限问题。 若该用户没有权限写/tmp目录或是磁盘已满,则无法创建/tmp/hsperfdata_userName/pid文件。或该文件已经生成,但用户没有读权限。
  • 临时文件丢失,被删除或是定期清理。 对于linux机器,一般都会存在定时任务对临时文件夹进行清理,导致/tmp目录被清空。常用的可能定时删除临时目录的工具为crontab、redhat的tmpwatch、ubuntu的tmpreaper等等
  • java进程信息文件存储地址被设置为不在/tmp目录下。 通过-Djava.io.tmpdir设置的目录不是/tmp,而jps、jconsole都只会从/tmp目录读取,而无法从设置后的目录读物信息。

参考: jps命令详解 【知乎】


jstat

jstat可以查看Java程序运行时相关信息,可以通过它查看堆信息的相关情况

jstat语法如下:
  • jstat -<options> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
jstat的options参数如下:

-class:显示ClassLoader的相关信息 
-compiler:显示JIT编译的相关信息 
-gc:显示与GC相关信息
-gccapacity:显示各个代的容量和使用情况
-gccause:显示垃圾收集相关信息(同-gcutil),同时显示最后一次或当前正在发生的垃圾收集的诱发原因
-gcnew:显示新生代信息 
-gcnewcapacity:显示新生代大小和使用情况 
-gcold:显示老年代信息
-gcoldcapacity:显示老年代大小 
-gcpermcapacity:显示永久代大小 
-gcutil:显示垃圾收集信息
-printcompilation:输出JIT编译的方法信息 
-t:在输出信息前加上一个Timestamp列,显示程序的运行时间
-h:可以在周期性数据输出后,输出多少行数据后,跟着一个表头信息 
interval:用于指定输出统计数据的周期,单位为毫秒
count:用于指定一个输出多少次数据
            

上图各列的含义:

S0C:0号Survive区域的总大小
S0U:0号Survive区域当前已用大小
EC:新生代Eden区域的总大小
EU:新生代Eden区域已用的大小
OC:老年代区域的总大小
OU:老年代区域已用的大小
MC:方法区的总大小
MU:方法区已用的大小
YGC:新生代GC的次数
YGT:新生代GC的总耗时
FGC:Full GC的次数
FGT:Full GC的总耗时
            

jinfo

jinfo可以实时地查看和调整虚拟机各项参数。前面的jps只能够查看虚拟机启动时的 显式 指定参数,对于未被显式指定的参数的系统默认值,就可以通过jinfo的-flag进行查看了。

jinfo语法如下:
              jinfo [option] pid
              
            
jinfo的option参数如下:
no option: 打印命令行标志和系统属性的【name-value】对。
-flag name: 打印指定命令行标志的【name-value】对。 
-flag [+|-] name: 启用或禁用指定的命令行标志。表示启用,- 表示禁用。
-flag name=value: 将指定的命令行标志设置为指定的值。
-flags: 打印传递给JVM的命令行标志。
-sysprops: 以【name-value】对的形式打印Java系统属性。
-h or help
            

jmap

jmap是用于生成堆转储快照即dump文件的命令

jmap语法如下:
jmap [option] vmid
jmap的option如下:

jhat

jhat是Sun JDK提供的一款虚拟机堆转储快照分析工具,用于与jmap搭配使用来对我们生成的dump文件进行分析但事实上,这款工具并没有那么好用,所以如果不是我们手上没有其他工具可用,一般是不对直接使用jhat来分析dump文件的。


jstack

jstack用于生成虚拟机当前时刻的线程快照(线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合)。生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待都是导致线程出现长时间停顿的常见原因。线程出现停顿时通过jstack来查看各个线程的调用堆栈,就可以直到没有相应的线程到底在后台做些什么事情,或者等待什么资源。

jstack语法如下:
jstack [option] vmid
jstack的option如下:
-F	当正常输出的请求不被响应时,强制输出线程堆栈
-l	除堆栈外,显示关于锁的附加信息
-m	如果调用本地方法的话,可以显示C/C++的堆栈

需要注意的是,jstack中记录的线程id是16位的(vmid仍是10位的),但top、jps获得是10位的,所以中间需要进行转换。
你也可以使用jstack > filename 将jstack内容存入文件,再从文件中进行查找。