tomcat cpu暴漲的緣由之一及其解決方法

當你使用tomcat部署web系統時,過了一段時間發現cpu暴漲,你不防試試下面的方法,看看是否程序內的死循環致使cpu暴漲。 

第一步:增長tomcat監控對外端口 

在你的tomcat的bin目錄下找到catalina.sh在二行加上 java

Java代碼  收藏代碼web

JAVA_OPTS='-server -Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256M -XX:NewSize=256m -XX:MaxNewSize=512m -XX:+UseParallelGC -XX:ParallelGCThreads=2 -XX:+UseAdaptiveSizePolicy'  apache

JAVA_OPTS="$JAVA_OPTS  tomcat

-Dcom.sun.management.jmxremote.port=8089  .net

-Dcom.sun.management.jmxremote.ssl=false  線程

-Dcom.sun.management.jmxremote.authenticate=false  server

-Djava.rmi.server.hostname=192.168.1.33  圖片

-Djava.util.logging.mannager=org.apache.juli.ClassLoaderLogManager  ip

-Djava.util.logging.config.file=$CATALINA_HOME/conf/logging.properties"  ssl


注意修改成本身的ip和端口 
-Dcom.sun.management.jmxremote.port=8089//對外端口 
-Djava.rmi.server.hostname=192.168.1.33//爲本機IP 

第二步:啓動tomcat 

你懂得... 

第三步:開啓jvisualvm監控 

在你本機jdk的bin目錄下找到jvisualvm.exe,例如個人目錄爲C:\Program Files (x86)\Java\jdk1.6.0_33\bin\jvisualvm.exe 
a.雙擊運行程序 
b.選擇遠程 
c.添加遠程主機,如:192.168.1.254 
d.選擇該主機 
e.添加JMX鏈接 
效果如圖: 


第四步:雙擊該JMX鏈接 

點擊線程查看線程運行狀況,通常只有main和一些監聽程序一直是運行狀態(runnable), 
加入你有http-80- 相似的線程也一直處於運行狀態,那就說明該執行該http請求有問題,甚至是死循環。 
如圖: 



這裏的http-80-25很長一段時間都處於運行狀態,注意:綠色帶便運行狀態 

第五步:點擊上面圖片標識的"線程dump",能夠查看相信信息 

經查,個人詳細信息爲: 

Java代碼  收藏代碼

  1. "http-80-25" - Thread t@101  
  2.    java.lang.Thread.State: RUNNABLE  
  3.     at com.wondertek.service.impl.FileManage.getFileOrFolderInfo(FileManage.java:278)  
  4.     at com.wondertek.web.action.FileAction.getFileOrFolderList(FileAction.java:500)  
  5.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  6.     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)  
  7.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)  
  8.     at java.lang.reflect.Method.invoke(Unknown Source)  



第六步:找到對應的程序 
發現代碼確實出現了死循環 
代碼以下: 

Java代碼  收藏代碼

  1. while (true) {  
  2.                 for (int i = 0; i < infoSearch.size(); i++) {  
  3.                     BasicDBObject infoDbObject = (BasicDBObject) infoSearch  
  4.                             .get(i);  
  5.                     globalFile = infoDbObject.getString(DBColConstants.m_id);  
  6.                     if (fileId.equals(globalFile)) {// 開始找上一層編號  
  7.                         fileId = infoDbObject  
  8.                                 .getString(DBColConstants.m_strParentID);// 下一個fileid  
  9.                         // infoDbObject.getString(fileId);  
  10.                         fileParentIds.add(infoDbObject  
  11.                                 .getString(DBColConstants.m_strParentID));  
  12.                         infoSearch.remove(i);  
  13.                         i--;  
  14.                     }  
  15.                 }  
  16.                 if (fileId.indexOf("@") > 0) {// 到根目錄查找完成  
  17.                     break;  
  18.                 }  
  19.             }  

假如fileId不包含"@"符號,程序將陷入死循環。 

相關文章
相關標籤/搜索