目前采用java进行开发的系统居多,这些系统运行在java容器中,通过对容器的监控可以了解到java进程的运行状况,分析java程序问题。目前市面上流行的中间件有很多(Tomcat、jetty、jboss、weblogic、websphere等),基本原理相似,都遵循Servlet规范。对容器的监控,实际上就是对JVM的监控,下面介绍一个Tomcat的监控工具Probe,Probe只需要一个war包就可以完成监控任务。
类别 | 计数器 | 描述 |
Tomcat | jvm内存 | 关注GC回收频率,Full GC次数越少越好 |
最大线程数 | 线程池连接数长期大于百分之八十以上,建议优化 | |
数据库连接数 | 活动连接数长期大于百分之八十以上,建议优化连接池 | |
请求数 请求状态 |
线程数、线程状态、大量Blocked状态线程可以Dump线程栈信息进行分析 |
1、下载Probe:https://github.com/psi-probe;放在tomcat的webapps目录下
2、Probe相关配置
修改tomcat下conf/tomcat-users.xml文件:
<tomcat-users>
<role rolename="manager"/>
<role rolename="tomcat"/>
<role rolename="manager-gui"/>
<user username="admin" password="admin" roles="manager,tomcat,manager-gui"/>
</tomcat-users>
开启JVM远程监控,添加set "JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote",修改tomcat下bin/catalina.bat文件:
3、RUNNABLE:系统正在运行;
WAITING:此状态指线程拥有某个锁,调用了wait方法,等待其他线程拥有者调用notify唤醒改线程继续下一步操作;
TIME_WAITING:有限制的waiting,一般出现在调用wait、join等情况,另外线程sleep后,也会进入time_waiting状态;
BLOCKED:阻塞状态,代表线程繁忙正在执行中,可能有资源等待情况,我们需要长期关注blocked状态线程,Dump线程栈以找到程序,从而分析出做什么操作,等待那些资源;
TERMINATED:表示run方法已经执行完毕,进入死亡状态,如果线程长时间持有可能不会被回收。