我想监视ThreadLocals中的内存泄漏。要获取所有线程本地对象,我使用此处的代码http://blog.igorminar.com/2009/03/identifying-threadlocal-memory-leaks-in.html。此代码使用反射来提取当前线程上的所有线程本地。
我想要一个监视所有线程的后台线程。
运行所有线程(ThreadGroup上的递归调用)很简单。但是,我需要知道哪些线程当前没有运行,仍然使用线程本地对象。
例如: 线程A使用LocalThread A1。线程完成并返回到容器的线程池后,应该释放A1。 线程M是我的监控线程。它运行在所有线程上,并找到线程A.因此,它需要知道A是否因为上下文切换而当前没有运行(并且是这种情况,A1不是泄漏),或者A当前没有运行,因为它被送回了游泳池。
我如何区分案件?
BTW,我的监控类需要支持任何平台(app服务器,web服务器,标准java,任何供应商,java 1.5及以上版本)。这意味着我需要知道线程是否处于活动状态,无论容器是否使用Executors框架或旧线程机制....答案 0 :(得分:3)
您可以使用
for(Map.Entry<Thread, StackTraceElement[]> entry : Thread.getAllStackTraces()) {
if (waitingOnTheRightLine(entry))
checkThreadLocalValues(entry);
}
这将检测线程所在的确切行,以检查其未运行及其在已知点的等待。
答案 1 :(得分:1)
示例代码,希望它有所帮助:
Thread t = getYourThread();
if(t.getState() != Thread.State.RUNNABLE) {
//currently the thread is not running...
}