目前采用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方法已經執行完畢,進入死亡狀態,如果線程長時間持有可能不會被回收。