Swen 2010-09-27
这里向大家描述一下JVM监控工具的用法,比如jstatd,启动jvm监控服务。它是一个基于rmi的应用,向远程机器提供本机jvm应用程序的信息。默认端口1099。
JVM监控工具介绍
jstatd
此JVM监控工具用来启动jvm监控服务。它是一个基于rmi的应用,向远程机器提供本机jvm应用程序的信息。默认端口1099。
实例:jstatd-J-Djava.security.policy=my.policy
my.policy文件需要自己建立,内如如下:
grantcodebase"file:$JAVA_HOME/lib/tools.jar"{ permissionjava.security.AllPermission; };
这是安全策略文件,因为jdk对jvm做了jaas的安全检测,所以我们必须设置一些策略,使得jstatd被允许作网络操作
JVM监控工具之jps
列出所有的jvm实例
实例:jps
列出本机所有的jvm实例
jps192.168.0.77
列出远程服务器192.168.0.77机器所有的jvm实例,采用rmi协议,默认连接端口为1099
(前提是远程服务器提供jstatd服务)
输出内容如下:
jones@jones:~/data/ebook/java/j2se/jdk_gc$jps 6286Jps 6174Jstat
JVM监控工具之jconsole
一个图形化界面,可以观察到java进程的gc,class,内存等信息。虽然比较直观,但是个人还是比较倾向于使用jstat命令(在最后一部分会对jstat作详细的介绍)。
JVM监控工具之jinfo(linux下特有)
观察运行中的java程序的运行环境参数:参数包括JavaSystem属性和JVM命令行参数
实例:jinfo2083
其中2083就是java进程id号,可以用jps得到这个id号。
输出内容太多了,不在这里一一列举,大家可以自己尝试这个命令。
JVM监控工具之jstack(linux下特有)
可以观察到jvm中当前所有线程的运行情况和线程当前状态
jstack2083
输出内容如下:
JVM监控工具之jmap(linux下特有,也是很常用的一个命令)
观察运行中的jvm物理内存的占用情况。
参数如下:
-heap:打印jvmheap的情况
-histo:打印jvmheap的直方图。其输出信息包括类名,对象数量,对象占用大小。
-histo:live:同上,但是只答应存活对象的情况
-permstat:打印permanentgenerationheap情况
命令使用:
jmap-heap2083
可以观察到NewGeneration(EdenSpace,FromSpace,ToSpace),tenuredgeneration,PermGeneration的内存使用情况
输出内容:
jmap-histo2083|jmap-histo:live2083
可以观察heap中所有对象的情况(heap中所有生存的对象的情况)。包括对象数量和所占空间大小。
输出内容:
写个脚本,可以很快把占用heap最大的对象找出来,对付内存泄漏特别有效。
JVM监控工具之jstat