JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jstat (1)

本文详细介绍了JVM监控工具,包括jstack、jconsole、jinfo、jmap、jdb、jstat和jps,重点讲解了jstat命令的使用方法及参数解释,提供了实例演示,并附上了常见命令的输出内容,帮助开发者更有效地监控和诊断Java程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[b]jstack [/b]-- 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。目前只有在solaris和linux的jdk版本里面才有。
[b]jconsole [/b]– jconsole是基于<a class="channel_keylink" href="http://java.chinaitlab.com/" target="_blank"><span style="color: #0000ff;">java</span></a> management extensions (jmx)的实时图形化监测工具,这个工具利用了内建到jvm里面的jmx指令来提供实时的性能和资源的监控,包括了<a class="channel_keylink" href="http://java.chinaitlab.com/" target="_blank"><span style="color: #0000ff;">java</span></a>程序的内存使用,heap size, 线程的状态,类的分配状态和空间使用等等。
[b]jinfo [/b]– jinfo可以从core文件里面知道崩溃的java应用程序的配置信息,目前只有在solaris和linux的jdk版本里面才有。
[b]jmap [/b]– jmap 可以从core文件或进程中获得内存的具体匹配情况,包括heap size, perm size等等,目前只有在solaris和linux的jdk版本里面才有。
[b]jdb [/b]– jdb 用来对core文件和正在运行的java进程进行实时地调试,里面包含了丰富的命令帮助您进行调试,它的功能和sun studio里面所带的dbx非常相似,但 jdb是专门用来针对java应用程序的。
[b]jstat [/b]– jstat利用了jvm内建的指令对java应用程序的资源和性能进行实时的命令行的监控,包括了对heap size和垃圾回收状况的监控等等。
[b]jps [/b]– jps是用来查看jvm里面所有进程的具体状态, 包括进程id,进程启动的路径等等。 
[url=http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstatd.html]<span style="color: #0010ff;">[b]jstatd[/b]</span>[/url]<br>启动jvm监控服务。它是一个基于rmi的应用,向远程机器提供本机jvm应用程序的信息。默认端口1099。<br>实例:jstatd -j-djava.security.policy=my.policy<br><br>my.policy文件需要自己建立,内如如下:<br>grant codebase "file:$java_home/lib/tools.jar" {<br> permission java.security.allpermission;<br>};<br>这是安全策略文件,因为jdk对jvm做了jaas的安全检测,所以我们必须设置一些策略,使得jstatd被允许作网络操作
上面的操作没有通过,出现:
<span style="color: #ff0000;">could not create remote object<br>access denied (java.util.propertypermission java.rmi.server.ignoresubclasses write)<br>java.security.accesscontrolexception: access denied (java.util.propertypermission java.rmi.server.ignoresubclasses write)<br>        at java.security.accesscontrolcontext.checkpermission(accesscontrolcontext.java:323)<br>        at java.security.accesscontroller.checkpermission(accesscontroller.java:546)<br>        at java.lang.securitymanager.checkpermission(securitymanager.java:532)<br>        at java.lang.system.setproperty(system.java:727)<br>        at sun.tools.jstatd.jstatd.main(jstatd.java:122)</span>
create in your usr/java/bin the jstatd.all.policy file, with the content must be
<pre><ol class="dp-xml"><li class="alt"><span><span>grant codebase "file:${java.home}/../lib/tools.jar" {  </span></span></li>[*]<span>permission java.security.allpermission;  </span>
<li class="alt"><span>}; </span></li></ol></pre><br>[b][url=http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jps.html]<span style="color: #0010ff;">jps</span>[/url][/b]<br>列出所有的jvm实例<br>实例:<br>jps<br>列出本机所有的jvm实例<br><br>jps 192.168.0.77<br>列出远程服务器192.168.0.77机器所有的jvm实例,采用rmi协议,默认连接端口为1099<br>(前提是远程服务器提供jstatd服务)<br><br>输出内容如下:<br>jones@jones:~/data/ebook/java/j2se/jdk_gc$ jps<br>6286 jps<br>6174  jstat<br><br>[b]<span style="color: #0010ff;">jconsole</span>[/b]<br>一个图形化界面,可以观察到java进程的gc,class,内存等信息。虽然比较直观,但是个人还是比较倾向于使用jstat命令(在最后一部分会对jstat作详细的介绍)。<br><br>[b][url=http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jinfo.html]<span style="color: #0010ff;">jinfo</span>[/url][/b](linux下特有)<br>观察运行中的java程序的运行环境参数:参数包括java system属性和jvm命令行参数<br>实例:jinfo 2083<br>其中2083就是java进程id号,可以用jps得到这个id号。<br>输出内容太多了,不在这里一一列举,大家可以自己尝试这个命令。<br><br>[b][url=http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstack.html]<span style="color: #0010ff;">jstack</span>[/url][/b](linux下特有)<br>可以观察到jvm中当前所有线程的运行情况和线程当前状态<br>jstack 2083<br>输出内容如下:<br><img src="http://www.517sou.net/attach/month_1001/lmfqgl_085350_1.png" alt="" width="432" height="180"><br><br>[b][url=http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jmap.html]<span style="color: #0010ff;">jmap</span>[/url][/b](linux下特有,也是很常用的一个命令)<br>观察运行中的jvm物理内存的占用情况。<br>参数如下:[b]<br>-heap[/b]:打印jvm heap的情况<br>[b]-histo:[/b]打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。<br>[b]-histo:live :[/b]同上,但是只答应存活对象的情况<br>[b]-permstat:[/b]打印permanent generation heap情况<br><br>命令使用:<br>jmap -heap 2083<br>可以观察到new generation(eden space,from space,to space),tenured generation,perm generation的内存使用情况<br>输出内容:<br><img src="http://www.517sou.net/attach/month_1001/5rlawx_085353_2.png" alt="" width="248" height="230"><br><br>jmap -histo 2083 | jmap -histo:live 2083<br>可以观察heap中所有对象的情况(heap中所有生存的对象的情况)。包括对象数量和所占空间大小。<br>输出内容:<br><img src="http://www.517sou.net/attach/month_1001/z9zlmt_085354_3.png" alt="" width="436" height="286"><br>写个脚本,可以很快把占用heap最大的对象找出来,对付内存泄漏特别有效。<br><br>[b][url=http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html]<span style="color: #0010ff;">jstat</span>[/url]<br>[/b]最后要重点介绍下这个命令。<br>这是jdk命令中比较重要,也是相当实用的一个命令,可以观察到classloader,compiler,gc相关信息<br>具体参数如下:<br>-class:统计class loader行为信息<br>-compile:统计编译行为信息<br>-gc:统计jdk gc时heap信息<br>-gccapacity:统计不同的generations(不知道怎么翻译好,包括新生区,老年区,permanent区)相应的heap容量情况<br>-gccause:统计gc的情况,(同-gcutil)和引起gc的事件<br>-gcnew:统计gc时,新生代的情况<br>-gcnewcapacity:统计gc时,新生代heap容量<br>-gcold:统计gc时,老年区的情况<br>-gcoldcapacity:统计gc时,老年区heap容量<br>-gcpermcapacity:统计gc时,permanent区heap容量<br>-gcutil:统计gc时,heap情况<br>-printcompilation:不知道干什么的,一直没用过。<br><br>一般比较常用的几个参数是:<br>jstat -class 2083 1000 10 (每隔1秒监控一次,一共做10次)<br>输出内容含义如下:
<table style="width: 500px; height: 144px;" border="1" cellspacing="2" cellpadding="2" align="left"><tbody><tr><td>loaded</td><td>number of classes loaded.</td></tr><tr><td>bytes</td><td>number of kbytes loaded.</td></tr><tr><td>unloaded</td><td>number of classes unloaded.</td></tr><tr><td>bytes</td><td>number of kbytes unloaded.</td></tr><tr><td>time</td><td>time spent performing class load and unload operations.</td></tr></tbody></table><br><br><br><br><br><br><br><br>jstat -gc 2083 2000 20(每隔2秒监控一次,共做10)<br>输出内容含义如下:
<table style="width: 500px; height: 144px;" border="1" cellspacing="2" cellpadding="2" align="left"><tbody><tr><td>s0c</td><td>current survivor space 0 capacity (kb).</td></tr><tr><td>ec</td><td>current eden space capacity (kb).</td></tr><tr><td>eu</td><td>eden space utilization (kb).</td></tr><tr><td>oc</td><td>current old space capacity (kb).</td></tr><tr><td>ou</td><td>old space utilization (kb).</td></tr><tr><td>pc</td><td>current permanent space capacity (kb).</td></tr><tr><td>pu</td><td>permanent space utilization (kb).</td></tr><tr><td>ygc</td><td>number of young generation gc events.</td></tr><tr><td>ygct</td><td>young generation garbage collection time.</td></tr><tr><td>fgc</td><td>number of full gc events.</td></tr><tr><td>fgct</td><td>full garbage collection time.</td></tr><tr><td>gct</td><td>total garbage collection time.</td></tr></tbody></table><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>输出内容:<br><img class="magplus" title="点击查看原始大小图片" src="http://www.517sou.net/attach/month_1001/spyqva_085355_4.png" alt="" width="700" height="145"><br>
<h3> <span class="link_title"><a title="jvm监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jstat " href="http://blog.youkuaiyun.com/kelly859/article/details/5827365">jvm监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jstat </a></span> </h3>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值