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, это означает, что поток завершен.