在排查线上问题的时候,我们经常使用jstat、jstack、jmap查看GC、内存、线程的信息,但是有时候我们需要获取一个整体的信息来帮助我们快速定位,类似linux中自带的top命令,简单而全面的系统信息,在网上找了些资料,发现之前有人写了个jtop的工具,能够全面获取java应用的信息,一看作者,原来是阿里的同事,原理是使用了java中的MBean,借这个机会,把MBean的东西简单了解一下。
首先这个工具如何使用:wget https://hatter-source-code.googlecode.com/svn/trunk/jtop/jtop.jar
Usage:
java -jar jtop.jar [options]<pid>[<interval>[<count>]] -OR- java -cp jtop.jar jtop [options]<pid>[<interval>[<count>]] -size <B|K|M|G|H> Size,case insensitive (default: B, H for human) -thread <N> ThreadTop N (default:5) -stack <N> StacktraceTop N (default:8) -excludes Excludes(string.contains) -includes Includes(string.contains, excludes than includes) --color Display color (default: off) --sortmem Sortby memory allocted (default: off) --summaryoff Donot display summary (default: off)
(1)直接运行jtop.jar获取的信息(sudo -u admin /java -jar jtop.jar pid 内存、线程、GC、高CPU占用线程的栈信息)
如果想把大小的信息,换算成M或者其他,可以用另外一种方式
sudo -u admin java -cp jtop.jar jtop -size M PID
(2)查看占用CPU前三的线程栈信息(sudo -u admin java -cp jtop.jar jtop -thread 3 -stack 50 --summaryoff PID)
(1)一些概念
A、MBean
通常是一个java类,它提供接口可以使这个类具有管理功能(如standard MBean,接口中定义的方法使MBean具有管理功能)。
B、MBean server
是管理MBean的一个java类,你需要向MBean server注册一个MBean后,这个MBean才会具有管理功能,MBean server还提供了查询功能和注册监听器的功能,sun提供的只是接口,不同的jmx实现中的MBean server实现也不同。
Mbean有四种常见类型:A、standard MBean;B、dynamic MBean;C、open MBean;D、model MBean
重点介绍一个standard MBean 和dynamic Mbean
standard MBean:这种类型的MBean最简单,它能管理的资源(包括属性,方法,时间)必须定义在接口中,然后MBean必须实现这个接口。它的命名也必须遵循一定的规范,例如我们的MBean为Hello,则接口必须为HelloMBean。
dynamic MBean:必须实现javax.management.DynamicMBean接口,所有的属性,方法都在运行时定义
(2)根据JDK提供的MBean获取信息
1、工厂类获取各个MBean:ManagementFactory
2、内存信息MBean:MemoryMXBean
3、线程信息MBean:ThreadMXBean,可以重点关注dumpAllThreads,把所有的线程信息down下来,然后自己进行运算
4、gc情况信息MBean:GarbageCollectorMXBean
ManagementFactory.getGarbageCollectorMXBeans()获取的是gcMbean的数组
5、类加载Mbean:ClassLoadingMXBean
http://docs.huihoo.com/java/jmx/jmx.html