JConsole是一个基于JMX的GUI工具,用于链接正在运行的JVM,它是Java自带的简单性能监控工具。下面以对tomcat的监控为例,带领你们熟悉Jconsole这个工具。html
Step 1,在dos/bash命令下输入:jconsole;java
Step 2,在弹出的对话框中选中apache,并点击connect(假设你的tomcat已经启动);linux
接下来,你就能使用jconsole来作一些简单的性能监控了。算法
1. 概要界面,主要显示堆内存使用状况、活动线程数、加载类数、CPU使用率四个参数的概要,能够经过下拉框来定制显示的时间范围;apache
2. 假如堆内存的图像一直在上升而没有降低的动做发生,则要怀疑是否内存泄露;健壮的项目因为GC的存在,因此它的上升和降低的幅度应该大抵相同;编程
3. CPU的图像规律跟堆内存的大体相同。windows
1. 图示为被监控程序的详细内存图;设计模式
2. 关注点1:点击右上的GC按钮能够通知JVM进行垃圾回收,实质是把垃圾回收队列的优先级提升;缓存
3. 关注点2:GC time显示了每次回收的时间、算法以及回收数,7.619 seconds是用时,Copy表示垃圾回收机制的复制算法,MarkSweepCompact表示垃圾回收机制的标记-清除-压缩算法,1426 collections表示回收的数量;tomcat
4. 右下角的图案,Heap内存区包括:年轻代Eden Space、存活代Survivor Space和老年代Tenured Gen;Non-Heap内存区包括:代码缓存区Code Cache和持久代Perm Gen;可经过改变下拉框或者直接点击图形实现切换。
1. Peak表示最大的线程数,这个数值能够经过更改<tomcat_home>/conf/server.xml下的maxThreads来更改;
2. 点击具体的Thread以后,咱们能够看到它的方法栈的详细调用状况;
3. 点击Detect Deadlock能够检测是否有死锁。
关注点:类的数量变化。
关注点1:上面几栏是关于系统和项目的概要信息;
关注点2:最下面一栏的第一项是tomcat设定的JVM参数,若是你想知道你设置的参数有没有成功启用,看这里就对了。
关注点1:Attributes显示该bean的详细细节;
关注点2:Operations显示该bean的全部方法,能够点击该按钮触发方法,但我的不推荐这么作,应该经过程序的统一入口来触发。
JVisualVM是Netbeans的profile子项目,已在JDK6.0 update 7 中自带(bin/jvisualvm.exe),可以监控线程,内存状况,查看方法的CPU时间和内存中的对象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。
Step 1,假如你手头上的Tomcat项目已经启动,在bash/dos下输入:jvisualvm,敲击回车;
Step 2,选中Tomcat,双击便可启动监控,在初始页面咱们便可看到一些概要信息和JVM参数。
关注点1:按钮“Perform GC”可通知JVM将垃圾回收动做的优先级提升;
关注点2:“Daemon”线程是指JVM的守护线程,通俗的理解为JVM的系统进程;
关注点3:按钮“Heap Dump”可生成堆内存快照,下面详细讲解Heap Dump的使用。
关注点1:红框标注的箭头处,能够凭你的点击顺序切换先后窗口;
关注点2:“Inspect”检查处能够查询最大的对象,个数可自行定制;
关注点3:点击“Show Threads”能够显示线程细节,以下所示:
关注点1:timed_waiting和runnable表示线程运行状态;
关注点2:daemon表示这个线程是守护线程,如没有标记daemon则表示它是一个用户线程,如main线程;
关注点3:prio表示该线程的优先级,在java线程中数字越大优先级越高,取值在1至10之间,默认为5;
关注点4:点击被标注成蓝色的相关类,能够在Instances界面查看细节;
关注点1:右上角的三个按钮能够对界面进行定制;
关注点2:点击“Compute Retained Sizes”可计算每一个field的保留尺寸,简言之就是它所占的byte值;
关注点3:右下角红框处标记出了,不一样的图形表明不一样的角色;
关注点1:左下角能够经过filter来过滤显示视图;
关注点2:右击某个类可让其在Instances界面显示,查看其细节;
关注点3:点击右上角红框处能够与另外一个内存快照进行比较,在比较视图中能够看出每一个类的增长和减小的状况;
关注点1:点击Saved Queries,选中具体的Query实例,在点击Execute就能够进行查询了,Save按钮能够保存你的query语句;
关注点2:比较使用的是PermGen分析语句;
关注点1:线程的颜色从绿、紫、黄、红,分别表明运行、休眠、等待和死锁;
关注点2:Timeline以时间轴显示线程状况,Table以表格显示,Details以细节的图形+表格方式显示线程状况。固然你也能够选中单个线程来显示,经过点击下拉框便可实现;
关注点3:点击Thread Dump便可生成线程快照,其功能跟2.2.1.1 Heap Dump 1)Summary中的Show Threads相似,这里很少加解释。
1. 经过settings能够对CPU的采样来源以及内存的刷新时间进行设置;
2. 点击CPU或者Memory便可开始监控,点击Stop则中止采样;
关注点1:点击Thread Dump可生成线程快照;
关注点2:点击Snapshot可生成线程的快照,快照里面包含了全部线程的调用树以及其热点编译状况,以下图所示:
关注点:点击Deltas按钮后,可记录线程的变化,功能有点相似JProfiler的“Mark Current Values”。
关注点1:Deltas、Peform GC、Heap Dump的功能与上文相似;
关注点2:点击Snapshot将生成以下的内存快照,主要显示堆内存中类的内存信息:
图为持久代的内存状况。
图为每一个线程的内存分布状况。
Profiler跟Sampler不一样在于它是对程序的实时监控,而Sampler只能说是一段时间内的统计采样。
在CPU功能模块咱们能够看到每一个热点编译方法的使用时间。
对当前存活对象的实时监控。
windows系统在catalina_home/bin/setenv.bat中加入以下配置:
set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port="9005" -Dcom.sun.management.jmxremote.authenticate="false" -Dcom.sun.management.jmxremote.ssl="false"
linux系统在catalina_home/bin/setenv.sh中加入以下配置:
export JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port='9005' -Dcom.sun.management.jmxremote.authenticate='false' -Dcom.sun.management.jmxremote.ssl='false'"
1)‘-Dcom.sun.management.jmxremote’表示启用Java Management Extensions(Java管理扩展)技术,简称JMX。JMX在Java编程语言中定义了应用程序以及网络管理和监控的体系结构、设计模式、应用程序接口以及服务。一般使用JMX来监控系统的运行状态或管理系统的某些方面,好比清空缓存、从新加载配置文件等。
2)‘9004’表示这个JMX服务的端口号;
3)‘authenticate’表示false时无需账号密码验证,如改成true(启用账号密码验证),需增长如下配置:
> 在JRE_HOME/lib/management下将'jmxremote.password.template'文件复制多一份,好比复制为'jmxremote.password',将这个复制出来的新文件底部的monitorRole和controlRole前面的注释去掉;
> monitorRole的值表示读取的密码,controlRole表示读取和写入的密码,请将两者的值更改成你想要的密码;
> 修改setenv.sh配置(windows请修改.bat)以下:
export JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port='9005' -Dcom.sun.management.jmxremote.password.file=pwdFilePath -Dcom.sun.management.jmxremote.ssl='false'"
> ‘Set file permissions so that only you can read and write the password file’,这个复制出来的密码文件需设置成只有属主具有读写权限,不然tomcat将没法正常启动;
4)-Dcom.sun.management.jmxremote.ssl='false'