Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java—高cpu使用率_Java_Text_Struts_Cpu Usage - Fatal编程技术网

Java—高cpu使用率

Java—高cpu使用率,java,text,struts,cpu-usage,Java,Text,Struts,Cpu Usage,我有一个在Tomcat中运行的生产web应用程序。web应用程序使用struts 2作为MVC层 我们遇到了一个问题,其中一个web服务器的cpu使用率达到了100%。这个问题持续了几个多小时。我进行了线程转储,看到数百个线程处于可运行状态,并且转储显示了大多数线程的相同堆栈跟踪 TP-Processor2" daemon prio=10 tid=0x00002aab80880c00 nid=0x5b4f runnable [0x0000000043bff000..0x0000000043c05

我有一个在Tomcat中运行的生产web应用程序。web应用程序使用struts 2作为MVC层

我们遇到了一个问题,其中一个web服务器的cpu使用率达到了100%。这个问题持续了几个多小时。我进行了线程转储,看到数百个线程处于可运行状态,并且转储显示了大多数线程的相同堆栈跟踪

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
不是线程安全的,如果由多个线程并发访问,则一种特定的故障模式是线程安全


看一看有问题的地图(由stacktrace指示),看看是否有多个线程实际上能够在没有足够同步的情况下访问它。

听起来不错。我认为并发Hashmap是现成的。或者您可能多次访问同一文件并将自己锁定。@Kdansky-yes,
java.util.concurrent.ConcurrentHashMap
。但是映射存在于第三方类中,所以这可能是由于错误地共享了一些更高级别的组件,而不是选择了错误的映射实现。即使这意味着同步问题,线程也应该一直在等待一些东西。为什么有那么多线程处于可运行状态。此外,只有在尝试从该映射检索特定密钥时,所有这些线程才处于该状态。我在转储中没有看到任何线程在尝试获取任何其他密钥时处于可运行状态。如果代码最终只从HashMap中获取本地化文本,那么在这些线程通过读取操作访问映射的同时,似乎不太可能修改映射。即使API规范没有保证,java.util.HashMap#get(key)的当前实现也是线程安全的。@Sushman-听起来和我描述的问题一模一样。听起来你对线程安全故障“看起来”有些成见——如果你阅读了我提供的链接,这将有望澄清这一点。我所说的失败将HashMap置于一种状态,在这种状态下,遍历给定bucket中某个特定点的线程(即,对于一小部分键)进入无限循环(即,在100%CPU下处于可运行状态)。具有讽刺意味的是,这正是你在不相信它的理由中所描述的。:-)