Java - высокая загрузка процессора - PullRequest
3 голосов
/ 27 октября 2010

У меня запущено производственное веб-приложение в Tomcat. Веб-приложение использует стойки 2 в качестве слоя MVC.

У нас была проблема, из-за которой один из веб-серверов работал на 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, и он просто выбирает значение из файла свойств. Я не уверен, почему так много потоков должно застрять там (потоки находятся в состоянии выполнения).

Могу ли я получить некоторую помощь в разрешении того, что могло пойти не так?

1 Ответ

9 голосов
/ 27 октября 2010

Предположение прямо из левого поля: вы не синхронизируете многопоточный доступ должным образом.

java.util.HashMap не является потокобезопасным, и если одновременный доступ осуществляется несколькими потоками, один конкретный способ отказа - бесконечный цикл в определенном сегменте .

Посмотрите на карту, о которой идет речь (обозначенную стековой трассировкой), и посмотрите, действительно ли несколько потоков могут получить к ней доступ без адекватной синхронизации.

...