2012-01-31 130 views
3

我想监视ThreadLocals中的内存泄漏。为了获得所有线程本地对象,我使用这里的代码http://blog.igorminar.com/2009/03/identifying-threadlocal-memory-leaks-in.html。此代码使用反射来提取当前线程上的所有线程局部变量。线程池中的线程状态

我想要一个监视所有线程的后台线程。

运行所有线程(ThreadGroup上的递归调用)很简单。但是,我需要知道哪些线程当前不在运行,并且仍然使用线程本地对象。

例如: 线程A使用LocalThread A1。线程完成并返回到容器的线程池后,A1应该被释放。 线程M是我的监控线程。它遍历所有线程,并找到线程A.因此,它需要知道A是否因为上下文切换而正在运行(并且是这种情况,A1不是泄漏),或者A当前未运行,因为它被送回了泳池。

我该如何区分这些情况?顺便说一下,我的监控类需要支持任何平台(应用服务器,Web服务器,标准Java,任何供应商,Java版本1.5及以上版本)。这意味着,我需要知道线程是否是活动的,不管容器使用执行人的框架或旧的线程机制....

+0

我觉得我应该指出,使用链接文章中描述的机制与一些长时间的活动监视线程结合可以轻松地创建泄露的引用,导致您正在尝试诊断的问题。注意定期清理参考资料并轻轻一点。 – allingeek 2012-01-31 08:13:53

回答

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); 
} 

这将检测线程的确切线,以检查其未运行并且在已知点处等待。