【齐全】Java自带的性能监测工具用法简介——jstack、jconsole、jinfo、jmap、jdb、jsta、jvisualvm
- 格式:doc
- 大小:328.00 KB
- 文档页数:10
Java自带的性能监测工具用法简介——jstack、jconsole、jinfo、jmap、jdb、jsta、jvisualvm在开始介绍之前,先介绍几篇写的比较详细的博客,咱们不求最精,一定最全,最省事。
/fenglibing/article/details/6411924一、jstatd启动jvm监控服务。
它是一个基于rmi的应用,向远程机器提供本机jvm应用程序的信息。
默认端口1099。
实例:jstatd -J-Djava.security.policy=my.policymy.policy文件需要自己建立,内如如下:Java代码1.grant codebase "file:${java.home}/../lib/tools.jar" {2. permission java.security.AllPermission;3.};这是安全策略文件,因为jdk对jvm做了jaas的安全检测,所以我们必须设置一些策略,使得jstatd被允许作网络操作二、jps列出所有的jvm实例实例:jps列出本机所有的jvm实例jps 192.168.0.77列出远程服务器192.168.0.77机器所有的jvm实例,采用rmi协议,默认连接端口为1099(前提是远程服务器提供jstatd服务)输出内容如下:jones@jones:~/data/ebook/java/j2se/jdk_gc$ jps6286 Jps6174 Jstat详细请看连接:/aoxj/archive/2007/12/29/171447.html三、jconsole图形工具,必须在图形界面上执行用法: jconsole [ -interval=n ] [ -notile ] [ -pluginpath ] [ -version ] [ connection ...]-interval 将更新间隔时间设置为 n 秒(默认值为 4 秒)-notile 最初不平铺显示窗口(对于两个或更多连接)-pluginpath 指定 jconsole 用于查找插件的路径-version 输出程序版本connection = pid || host:port || JMX URL (service:jmx:://...)pid 目标进程的进程 IDhost 远程主机名或 IP 地址port 用于远程连接的端口号-J 对正在运行 jconsole 的 Java 虚拟机指定输入参数在cmd中输入命令:jconsole 3980[java进程号] 弹出下图四、jinfo用法:jinfo [ option ] pidjinfo [ option ] executable corejinfo [ option ] [server-id@]remote-hostname-or-IP参数:pid 进程号executable 产生core dump的java executablecore core fileremote-hostname-or-IP 主机名或ipserver-id 远程主机上的debug server的唯一id选项:no option 打印命令行参数和系统属性-flags 打印命令行参数-sysprops 打印系统属性-h 帮助观察运行中的java程序的运行环境参数:参数包括Java System属性和JVM命令行参数实例:jinfo 2083其中2083就是java进程id号,可以用jps得到这个id号。
我在windows上尝试输入这个命令,但是不管用,于是我输入了下面这个命令:jinfo -flag MaxPermSize 3980显示如下:-XX:MaxPermSize=67108864五、jstack该命令应该如何使用呢?首先需要用jstack命令产生java进程的dump文件,然后分析dump文件中的数据,下面的连接是一篇讲述如何分析jstack产生的dump文件数据的文章,写的非常不错:/jzone/articles/303979.html命令格式:jstack [ option ] pid基本参数:-F当’jstack [-l] pid’没有相应的时候强制打印栈信息-l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.-m打印java和native c/c++框架的所有栈信息.-h | -help打印帮助信息pid 需要被打印配置信息的java进程id,可以用jps查询.具体用法jstack -l 进程ID六、jmap(linux下特有,也是很常用的一个命令)观察运行中的jvm物理内存的占用情况。
Usage:jmap [option] <pid>(to connect to running process)jmap [option] <executable <core>(to connect to a core file)jmap [option] [server_id@]<remote server IP or hostname>(to connect to remote debug server)where <option> is one of:<none> to print same info as Solaris pmap-heap to print java heap summary-histo[:live] to print histogram of java object heap; if the "live"suboption is specified, only count live objects-permstat to print permanent generation statistics-finalizerinfo to print information on objects awaiting finalization-dump:<dump-options> to dump java heap in hprof binary formatdump-options:live dump only live objects; if not specified,all objects in the heap are dumped.format=b binary formatfile=<file> dump heap to <file>Example: jmap -dump:live,format=b,file=heap.bin <pid>-F force. Use with -dump:<dump-options> <pid> or -histoto force a heap dump or histogram when <pid> does notrespond. The "live" suboption is not supportedin this mode.-h | -help to print this help message-J<flag> to pass <flag> directly to the runtime system参数如下:-heap:打印jvm heap的情况-histo:打印jvm heap的直方图。
其输出信息包括类名,对象数量,对象占用大小。
-histo:live :同上,但是只答应存活对象的情况-permstat:打印permanent generation heap情况命令使用:jmap -heap 2083可以观察到New Generation(Eden Space,From Space,To Space),tenured generation,Perm Generation的内存使用情况jmap -histo 2083 | jmap -histo:live 2083可以观察heap中所有对象的情况(heap中所有生存的对象的情况)。
包括对象数量和所占空间大小。
jmap -histo java进程id可以查看java进程中的所有实例、实例的个数,可用于查询单例对象是否真的只生成了一个实例。
在控制台,输入命令“jmap -histo 7329 > histo_dump”,得到如下结果:Java代码1.num #instances #bytes class name2.---------------------------------------------3.1: 60534868849960 [C4.2: 160973451511488 java.util.concurrent.ConcurrentHashMap$Segment5.3: 161002238640528 java.util.concurrent.locks.ReentrantLock$NonfairSync6.4: 7078431478168 [I7.5: 21822427628072 <constMethodKlass>8.6: 160973426423552 [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;9.7: 4037924430792 [B10.8: 21822419211544 <methodKlass>11.9: 60284814468352 ng.String12.10: 1937411640184 <constantPoolKlass>13.11: 23695011451216 <symbolKlass>14.12: 28374611349840 java.util.concurrent.ConcurrentHashMap$ValueIterator15.13: 193748826272 <instanceKlassKlass>16.14: 1006138048728 [Ljava.util.concurrent.ConcurrentHashMap$Segment;17.15: 850367332664 [ng.Object;18.16: 155596614824 <constantPoolCacheKlass>19.17: 789196313520 ng.reflect.Method20.18: 1033774962096 com.sun.tools.javac.zip.ZipFileIndexEntry21.19: 519984324096 [Ljava.util.HashMap$Entry;22.20: 1006134024520 java.util.concurrent.ConcurrentHashMap23.21: 1571363771264 java.util.concurrent.ConcurrentHashMap$HashEntry24.22: 359323736928 info.dbm.core.bean.monitor.FlowService25.23: 359323736928 info.dbm.core.bean.monitor.FlowService该命令通常用来分析内存泄漏OOM,通常做法是,首先配置JVM启动参数,让JVM在遇到OutOfMemoryError时自动生成Dump文件:Java代码1.-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path然后使用命令:Java代码1.jmap -dump:format=b,file=/path/heap.bin 进程ID如果只dump heap中的存活对象,则加上选项-live,如下:Java代码1.jmap -dump:live,format=b,file=/path/heap.bin 进程ID最后在eclipse中安装MAT插件(/mat/),然后在eclipse中,file---->open,打开这个文件heap.bin,利用现成的OOM工具进行分析。