2012-05-23 3 views
3

У меня есть приложение поворота, которое зависает после некоторого (случайного) времени. Я взял 5 нить снимки каждые 10 секунд после того, как она замерзает, и все они содержат эти те же самые строки:Анализ дампа нити (AWT-EventQueue работает, но в ожидании)

"AWT-EventQueue-0" prio=6 tid=0x0000000009949000 nid=0x7bec waiting on condition [0x000000000ebbc000] 
    java.lang.Thread.State: RUNNABLE 
     at java.math.BigInteger.valueOf(Unknown Source) 
     at java.math.BigDecimal.inflate(Unknown Source) 
     at java.math.BigDecimal.add(Unknown Source) 
     at uk.co.xx.xxx.xxxx.XXX$4.get(XXX.java:171) 

Обратите внимание, что никакого другого потока на свалке тпотоков в XXX.java. Соответствующая строка кода (XXX.java:171) выглядит несколько безобидные:

a = a.add(b.multiply(c, MATH_CONTEXT), MATH_CONTEXT); 

где:

  • a, b и c локальные переменные BigDecimal.
  • MATH_CONTEXT является public final static переменной, только доступ в XXX.java

Мои вопросы (ответ на любой из них будет большим подспорьем)

  • ли это свидетельствует о тупике или живучести вопрос (поток, похоже, не успевает, но находится в состоянии RUNNABLE)?
  • Является ли это вероятной причиной замораживания или я должен смотреть в другое место?
  • Каким будет следующий шаг для решения проблемы?
+0

- строка 171 синхронизирована (метод или уровень блока)? –

+0

@ejb_guy no - нет синхронизации вокруг этой части кода. – assylias

ответ

1

Это свидетельствует о тупике или живучести выпуска (поток не кажется, чтобы добиться прогресса, но он находится в состоянии RUNNABLE)?

Я сомневаюсь. Поскольку программа зависает, проблема явно. Однако я сомневаюсь, что есть тупик, связанный с кодом, который вы показали.

Возможно, это причина замораживания или я должен посмотреть где-то в другом месте?

Я думаю, вероятно, что это красная сельдь, и проблема кроется в другом месте.

Что будет следующим шагом для решения проблемы?

Я лично рассмотрел бы потенциальные проблемы с распределением памяти и сбором мусора. В частности, я бы удостоверился, что программа не тратит все свое время на сбор мусора и, следовательно, не в состоянии добиться прогресса.

Для этого я бы использовал профилировщик памяти.

В то время как я нахожусь на нем, я бы также отслеживал общее использование процессора и памяти в процессе и статистику сбоев страниц (чтобы увидеть, есть ли чрезмерная замена).

1

Я не вижу решения, но могу описать шаги, с которых я начну.

Я бы попробовал атташе Профилировщика и проверить, растет ли память, потому что система может обмениваться памятью и почему она, кажется, висит, но я этого не делаю.

Профилировщик также сообщает вам, если нить действительно висит, и если да, то там, где она висит.

Для профилирования я использую VisualVM.