Jconsole(Java Monitoring and Management Console)是从
java5开始,在JDK中自带的java监控和管理控制台,用于对JVM中内存,线程和类等的监控,是一个基于JMX(java management extensions)的GUI性能监测工具。jconsole使用jvm的扩展机制获取并展示虚拟机中运行的应用程序的性能和资源消耗等信息。
jdk5和jdk6中jconsole的主要区别
JDK 5中 Java应用(JVM)启动时
必须将JMX注册到 MBeanServer中,JConsole才能监控到该JVM。即Java应用启动时要加 -Dcom.sun.management.jmxremote 启动参数。
JDK 6中 JConsole可以从%TMP%/hsperfdata_user ( user 为当前登录用户名)目录下得到启动的JVM的信息。因此Java应用启动时可以
不用添加 -Dcom.sun.management.jmxremote 启动参数。鉴于目前大多数程序都是jdk6或以上,所以这里也不再强调jdk5上该程序的使用了。
一.(jdk6或以上)启动JConsole
我们可以在JDK_HOME/bin找到jconsole程序,可以直接在命令行或双击jconsole.exe文件来启动它。
JConsole可以用来监控
本地应用(也就是说和jconsole运行在同一台机器上的应用)或
远程应用程序(也就是和jconsole运行在不同系统或用户下的程序)。
注意:在开发环境或创建原形系统时使用Jconsole来监控本地应用非常有用。但
不建议在生产环境下使用jconsole来监控本地应用,因为jconsole本身也会消耗重要的系统资源。此时
推荐使用jconsole远程监控应用,保持jconsole和被监控的程序隔离。
1.1 启动本地监控
可以在命令行启动jconsole,如果jconsole已经在系统路径下可以直接输入:
>jconsole
就可以启动,否则可以输入全路径来启动。
只要jconsole启动,就会弹出选项包含所有和jconsole在同一个用户下的应用,选择某一个来连接。
如果我们已经知道想要监控的应用的进程id(pid),我们也可以在命令行里直接指定,此时这个pid
必须和jconsole运行在同一个用户下(因为管理和监控系统使用操作系统的文件许可),命令行如下:
>jconsole pid
获取进程id的方法:
1)在unix或linux下可以使用ps命令查找java应用的pid。
2)windows下可以使用资源管理器(Task Manager),在查看>选择列…>pid即可。
3)无论什么系统,还可以使用jdk自带的jps命令查看所有java应用的pid。
1.2 启动远程监控
可以使用命令行启动远程监控:
>jconsole hostName:portNum
hostName是被监控应用的主机名,portNum是启动jvm时指定的jmx代理的端口号。
如果应用允许被远程监控,那么启动jvm时
必须指定系统属性:
com.sun.management.jmxremote.port=portNum
注意要使用未被使用过的端口。
如在jboss的配置文件中添加远程服务端口:
JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=$HOSTNAME"
或在tomcat的catalina.bat里加入:
set JAVA_OPTS= -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=7999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
参考:
http://docs.oracle.com/javase/6/docs/technotes/guides/management/agent.html#gdenl
1.3 启动安全远程监控
还可以启用使用ssl(Secure Sockets Layer)安全连接的jconsole。
可以参考:
http://docs.oracle.com/javase/6/docs/technotes/guides/management/agent.html#gdevo
1.4 连接示例
如果不带任何参数的启动jconsole,我们会看到下面的对话框:
local process选项里列出的是所有和jconsole在同一个用户下的本地应用程序,如果显示为灰色的则不能连接,有可能是在jdk5上启动的应用并且没有指定-Dcom.sun.management.jmxremote 或 com.sun.management.jmxremote.port选项。其他非灰色的列表项选择其中一个并点击右下角的connect就可以连接。
如果要监控remote process,则需要提供hostName:portNum和用户名/密码。如:
二. 功能介绍
jconsole一旦连接上应用,就可以看到6个tab页。分别是:
概述(overview):展示监控到的jvm概述信息。
内存(memory):内存使用的详细统计信息。
线程(threads):线程使用信息。
类(classes):类加载信息。
vm摘要(vm):jvm的信息摘要。
Mbeans: mbeans信息。
可以使用菜单栏的菜单选项随时退出或重新连接。
2.1 概述
这里图形化的同时展示了堆内存使用情况,线程,类,cpu使用情况。
可以在每个图形上面右键选择展示的时间段和保存数据。
2.2 内存使用情况
这里有个”
Perform GC”(执行GC)的按钮,可以随时点击触发GC。
这个tab页上展示了堆内存,非堆内存和特定内存池的内存使用情况,可以在
”Chart”和”Time Range”上选择展示哪个内存区域哪个时间段内的使用情况。
对于HotSpot jvm,内存大致分为heap区和非heap区。heap区是分代管理的,堆内存大致又分为新生代和老年代。新生代分为Eden space和Survivor space。老年代就是Tenured Gen。
非heap区又分:Code Cache(代码缓存区)、Perm Gen(永久代)、Jvm Stack(java虚拟机栈)、Local Method Statck(本地方法栈)。具体可以参考jvm相关资料。
在这个图上可以选择其中某个区域来观测。
在左下角的”
Detail”部分可以看到几个内存度量值:
1)已使用:当前已经使用的内存,包括所有对象占用的,可达的不可达的部分。
2)分配:当前应用jvm可以使用的内存,这个值会随时间变化。因为jvm可能会释放内存。分配的内存值总会大于或等于已使用的内存。
3)最大值:当前可使用的最大值。这个值也会随时间变化,因为jvm可能会尝试扩展内存。jvm里配置的内存可能是个范围,当内存不够用时会尝试扩展内存直到达到设置的最大值。
4)GC时间:gc累计花费的时间和调用的次数。这个可能会有多行,分别代表jvm使用的gc算法的统计。
图的右下角的柱状图展示的堆和非堆内存使用情况,正常情况下展示的是绿色,如果设置了内存使用阀值(在Mbeans的tab页中可以设置属性MemoryMXBean来指定内存的UsageThreshold值),超过阀值就会显示红色。
2.3 线程使用
左下角“Threads”列出的是所有活动的线程,点击某个线程名字可以展示线程名字,状态和堆栈信息。可以在最下面的”Filter”框中输入模糊匹配字符串过滤线程。图的上面部分展示了红色线代表线程的峰值。蓝色代表当前的线程数。
此外,Mbeans标签页的java.lang>threading>操作下面提供了一系列线程相关功能,比如:
findMonitorDeadlockedThreads:检测死锁,返回死锁的线程id数组,如果没有则返回null.
getThreadInfo:返回线程信息。包括线程名称,堆栈信息,如果线程阻塞,则展示阻塞在哪个锁上,并且哪个线程持有这个锁。
还可以点击本tab页最下面的
“Detect DeadLock”来检测是否有死锁。
2.4 类加载监控和vm信息
这两部分信息比较明显,从名字上都能看出统计的信息。
2.5 监控和管理MBeans
最后这个标签页展示了所有注册的MBeans。
左边的树展示了当前所有运行的MBean,选择展开其中一个,就会它的所有描述,如属性,操作或通知。所有平台MXBean和各种操作和属性都可以通过JConsole的MBeans选项卡访问。
目前个人对于MBean的使用还不多,理解也很肤浅,暂时不多介绍了,以后再补充。
在查阅资料过程中发现
jvisualvm,可以参考:
http://developer.51cto.com/art/200906/130424_all.htm
http://www.ibm.com/developerworks/cn/java/j-lo-visualvm/
参考资料:
http://docs.oracle.com/javase/6/docs/technotes/guides/management/jconsole.html
http://blog.csdn.net/zyxnetxz/article/details/4771031