java工具之JVM监控

一、JVM监控工具

JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、jconsole、jinfo、hprof使用详解 - 实例分析

(1)jps:用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。命令格式:jps或 jps 远程服务ip地址(默认端口1099)

(2)jstack:可以观察到jvm中当前所有线程的运行情况和线程当前状态。, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。命令格式:jstack 进程pid

当程序出现死锁的时候,使用命令:jstack进程ID > jstack.log,然后在jstack.log文件中,搜索关键字“BLOCKED”,定位到引起死锁的地方。

(3)jmap:观察运行中的jvm物理内存的占用情况(如:产生哪些对象,及其数量)。命令格式:jmap [option] pid

option参数如下:

-heap:打印jvm heap的情况

-histo:打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。

-histo:live :同上,但是只答应存活对象的情况

-permstat:打印permanent generation heap情况

使用jmap进行 heap dump的例子: jmap-dump:format=b,file=

打印内存统计图:jmap -histo:live

结果中每行显示了当前堆中每种类类型的信息,包含被分配的实例个数及其消耗的字节数。选项“live”,表示只统计存活的对象


需要注意的是,jmap不是运行分析工具,在生成统计图时JVM可能会暂停,因此当生成统计图时需要确认这种暂停对程序是可接受的。

(4)jhat也是jdk内置的工具之一。主要是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。

使用jmap等方法生成java的堆文件后,使用其进行分析

(5)jstat:一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。

(6)jconsole:一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。

(7)jinfo:观察运行中的java程序的运行环境参数:参数包括Java System属性和JVM命令行参数,java class path等信息。命令格式:jinfo 进程pid

(8)hprof能够展现CPU使用率,统计堆内存使用情况。


这些命令的使用,见官方文档:

jps:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jps.html

jstat:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html

jstack:http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstack.html

jmap:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jmap.html

jconsole:http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html



二、jps(Java Virtual Machine Process Status Tool)      

jps主要用来输出JVM中运行的进程状态信息。

语法格式如下:


如果不指定hostid就默认为当前主机或服务器。

命令行参数选项说明如下:


比如下面:


三、jstack

jstack主要用来查看某个Java进程内的线程堆栈信息。语法格式如下:

jstack [option] pid

jstack [option] executable core

jstack [option] [server-id@]remote-hostname-or-ip


命令行参数选项说明如下:


  jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep。

第一步先找出Java进程ID,服务器上的Java应用名称为mrf-center:


得到进程ID为21711,第二步找出该进程内最耗费CPU的线程,可以使用ps -Lfp pid或者ps -mp pid -o THREAD, tid, time或者top -Hp pid,我这里用第三个,输出如下:


TIME列就是各个Java线程耗费的CPU时间,CPU时间最长的是线程ID为21742的线程,用printf ‘’%x\n” 214742

得到21742的十六进制值为54ee,下面会用到。    

OK,下一步终于轮到jstack上场了,它用来输出进程21711的堆栈信息,然后根据线程ID的十六进制值grep,如下:


它是轮询任务的空闲等待代码,上面的sigLock.wait(timeUntilContinue)就对应了前面的Object.wait()。


四、jmap(Memory Map)和jhat(Java Heap Analysis Tool)

jmap用来查看堆内存使用状况,一般结合jhat使用。

jmap语法格式如下:


如果运行在64位JVM上,可能需要指定-J-d64命令选项参数。

jmap -permstat pid

打印进程的类加载器和类加载器加载的持久代对象信息,输出:类加载器名称、对象是否存活(不可靠)、对象地址、父类加载器、已加载的类大小等信息,如下图:


使用jmap -heap pid查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况。比如下面的例子:


 使用jmap -histo[:live] pid查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象


六、jstat(JVM统计监测工具)

语法格式如下:

jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]

vmid是Java虚拟机ID,在Linux/Unix系统上一般就是进程ID。interval是采样时间间隔。count是采样数目。比如下面输出的是GC信息,采样时间间隔为250ms,采样数为4:


要明白上面各列的意义,先看JVM堆内存布局:


可以看出:


现在来解释各列含义:


七、jconsole

一个图形化界面,可以观察到java进程的gc,class,内存等信息。虽然比较直观,但是个人还是比较倾向于使用jstat命令(在最后一部分会对jstat作详细的介绍)。


八、jinfo (linux下特有)

观察运行中的java程序的运行环境参数:参数包括Java System属性和JVM命令行参数

实例:jinfo 2083

其中2083就是java进程id号,可以用jps得到这个id号。

输出内容太多了,不在这里一一列举,大家可以自己尝试这个命令。s

九、hprof(Heap/CPU Profiling Tool)

hprof能够展现CPU使用率,统计堆内存使用情况。

语法格式如下:


java -agentlib:hprof[=options] ToBeProfiledClass

java -Xrunprof[:options] ToBeProfiledClass

javac -J-agentlib:hprof[=options] ToBeProfiledClass


完整的命令选项如下:

Option Name and Value  Description                    Default---------------------  -----------                    -------

heap=dump|sites|all    heap profiling                 all

cpu=samples|times|old  CPU usage                      off

monitor=y|n            monitor contention             n

format=a|b             text(txt) or binary output     a

file=            write data to file             java.hprof[.txt]

net=:      send data over a socket        off

depth=           stack trace depth              4

interval=          sample interval in ms          10

cutoff=         output cutoff point            0.0001

lineno=y|n             line number in traces?         y

thread=y|n             thread in traces?              n

doe=y|n                dump on exit?                  y

msa=y|n                Solaris micro state accounting n

force=y|n              force output to          y

verbose=y|n            print messages about dumps     y

你可能感兴趣的:(java工具之JVM监控)