Java - 高CPU使用率
问题描述:
我有一个运行在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标记,只是从属性文件中获取值。我不知道为什么这么多的线程应该卡在那里(线程处于可运行状态)。
我能否在解决可能出错的问题上得到一些帮助。
答
左边的猜测:你没有正确地同步多线程访问。
java.util.HashMap
不是线程安全的,如果多线程同时访问,一种特定的失败模式是infinite loop within a particular bucket。
查看有问题的地图(用堆栈跟踪表示),并查看多个线程是否实际上能够在没有足够的同步的情况下访问它。
这听起来对我的耳朵。我认为一个并发的Hashmap存在于蝙蝠之外。或者你可能多次访问同一个文件并锁定自己。 – 2010-10-27 14:19:01
@Kdansky - yep,'java.util.concurrent.ConcurrentHashMap'。但是地图存在于第三方类中,因此这可能是由于错误地共享某个更高级别的组件而不是选择错误的地图实现。 – 2010-10-27 14:37:25
我在这里有一个疑问。即使这意味着同步问题,线程应该等待一些东西。为什么在可运行状态下有这么多的线程。此外,所有这些线程只有在试图从该映射中检索特定键时才处于此状态。当试图获取任何其他密钥时,我看不到处于可运行状态的转储中的任何线程。 – Sushman 2010-10-27 14:47:11