Eclipse MAT не показывает стек для многих потоков

У меня есть утечка в моем коде, и у меня есть дамп памяти, который я смотрю с помощью потрясающего инструмента Eclipse Memory Analyzer.

Используя Thread_Overview, я вижу, что у меня слишком много потоков. Тем не менее, только несколько шоу стеков. Большинство из них (которые, вероятно, являются моими утечками) показывают состояние 2 (ЗАБЛОКИРОВАНО), но не имеют стеков.

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

(Java 6 на Windows 2K, если что-то меняет)

1 ответ

Решение

Это означает, что поток завершен. Вот почему нет стека.

Что меня выкинуло так: статус 2 НЕ заблокирован, а прекращен. Это потому что поле threadStatus это битовое поле, которое декодируется sun.misc.VM.toThreadState(), Я думал, что ThreadStatus был перечислением состояния потока, но это не так. Вы должны прочитать этот метод, чтобы увидеть, каково реальное состояние. На окнах это так:

public static Thread.State toThreadState(int paramInt)
{
 if ((paramInt & 0x4) != 0)
   return Thread.State.RUNNABLE;
 if ((paramInt & 0x400) != 0)
   return Thread.State.BLOCKED;
 if ((paramInt & 0x10) != 0)
   return Thread.State.WAITING;
 if ((paramInt & 0x20) != 0)
   return Thread.State.TIMED_WAITING;
 if ((paramInt & 0x2) != 0)
   return Thread.State.TERMINATED;
 if ((paramInt & 0x1) == 0) {
   return Thread.State.NEW;
 }
 return Thread.State.RUNNABLE;
}

Итак, когда threadStatus 2, это означает, что поток завершен.

Другие вопросы по тегам