2010-10-27 178 views
3

我有一個運行在Tomcat中的生產Web應用程序。 Web應用程序使用struts 2作爲MVC層。Java - 高CPU使用率

我們遇到了一個問題,其中一個Web服務器尖刺到100%的CPU使用率。這個問題持續了幾個小時。我使用了線程轉儲,並在可運行狀態下查看了數百個線程,並且轉儲對大多數線程顯示相同的堆棧跟蹤。

TP-Processor2" daemon prio=10 tid=0x00002aab80880c00 nid=0x5b4f runnable [0x0000000043bff000..0x0000000043c05d90] 
    java.lang.Thread.State: RUNNABLE 
     at java.util.HashMap.get(HashMap.java:303) 
     at com.opensymphony.xwork2.util.LocalizedTextUtil.buildMessageFormat(LocalizedTextUtil.java:620) 
     at com.opensymphony.xwork2.util.LocalizedTextUtil.getDefaultMessage(LocalizedTextUtil.java:588) 
     at com.opensymphony.xwork2.util.LocalizedTextUtil.findText(LocalizedTextUtil.java:461) 
     at com.opensymphony.xwork2.TextProviderSupport.getText(TextProviderSupport.java:224) 
     at com.opensymphony.xwork2.ActionSupport.getText(ActionSupport.java:99) 
     at org.apache.struts2.components.Text.end(Text.java:158) 
     at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:43) 
     at org.apache.jsp.parts.myjsp_jsp._jspx_meth_s_005ftext_005f2(myjsp_jsp.java:296) 
     at org.apache.jsp.parts.myjsp_jsp._jspService(myjsp_jsp.java:94) 

現在有問題的代碼使用struts s:text標記,只是從屬性文件中獲取值。我不知道爲什麼這麼多的線程應該卡在那裏(線程處於可運行狀態)。

我能否在解決可能出錯的問題上得到一些幫助。

回答

9

左邊的猜測:你沒有正確地同步多線程訪問。

java.util.HashMap不是線程安全的,如果多線程同時訪問,一種特定的失敗模式是infinite loop within a particular bucket

查看有問題的地圖(用堆棧跟蹤表示),並查看多個線程是否實際上能夠在沒有足夠的同步的情況下訪問它。

+0

這聽起來對我的耳朵。我認爲一個併發的Hashmap存在於蝙蝠之外。或者你可能多次訪問同一個文件並鎖定自己。 – 2010-10-27 14:19:01

+0

@Kdansky - yep,'java.util.concurrent.ConcurrentHashMap'。但是地圖存在於第三方類中,因此這可能是由於錯誤地共享某個更高級別的組件而不是選擇錯誤的地圖實現。 – 2010-10-27 14:37:25

+0

我在這裏有一個疑問。即使這意味着同步問題,線程應該等待一些東西。爲什麼在可運行狀態下有這麼多的線程。此外,所有這些線程只有在試圖從該映射中檢索特定鍵時才處於此狀態。當試圖獲取任何其他密鑰時,我看不到處於可運行狀態的轉儲中的任何線程。 – Sushman 2010-10-27 14:47:11