2012-01-31 2 views
3

Я хочу отслеживать утечки памяти в ThreadLocals. Чтобы получить все локальные объекты потока, я использую код отсюда http://blog.igorminar.com/2009/03/identifying-threadlocal-memory-leaks-in.html. Этот код использует отражение, чтобы извлечь все локаторы потоков в текущий поток.Состояние нити в пуле потоков

Я хочу фоновый поток, который контролирует все потоки.

Простое управление всеми потоками (рекурсивные вызовы ThreadGroup). Но мне нужно знать, какие потоки в настоящее время не выполняются и все еще используют локальные объекты потока.

Например: В Thread A используется LocalThread A1. После завершения потока и возврата в пул потоков контейнера A1 должен быть выпущен. Thread M - моя контрольная нить. Он работает по всем потокам и находит поток A. Поэтому ему нужно знать, не работает ли A в настоящее время из-за контекстного переключателя (и в этом случае A1 не является утечкой), или A в настоящее время не выполняется, потому что он был возвращен в пул.

Как я могу различать случаи?

BTW, мой класс мониторинга должен поддерживать любую платформу (серверы приложений, веб-серверы, стандартную Java, любой поставщик, версию Java версии 1.5 и выше). Это значит, что мне нужно знать, является ли активным поток, независимо от того, если контейнер использует рамки исполнителей или старый механизм резьбы ....

+0

Мне кажется, что я должен указать, что использование механизма, описанного в связанной статье, в сочетании с какой-то длинной живой мониторинговой нитью, может легко СОЗДАТЬ утечку ссылок, что вызывает проблему, которую вы пытаетесь диагностировать. Будьте осторожны, чтобы регулярно очищать ссылки и слегка проступать. – allingeek

ответ

1

образец код, надеется, что это помогает:

Thread t = getYourThread(); 
    if(t.getState() != Thread.State.RUNNABLE) { 
     //currently the thread is not running... 
    } 
3

Вы можете использовать

for(Map.Entry<Thread, StackTraceElement[]> entry : Thread.getAllStackTraces()) { 
    if (waitingOnTheRightLine(entry)) 
     checkThreadLocalValues(entry); 
} 

Это будет определять точную линию, на которой работает нить, чтобы проверить ее отсутствие и ее ожидание в известной точке.

Смежные вопросы