我想监控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及以上)。这意味着我需要知道线程是否处于活动状态,无论容器使用的是执行器框架还是旧的线程机制……
发布于 2012-01-31 16:59:50
您可以使用
for(Map.Entry<Thread, StackTraceElement[]> entry : Thread.getAllStackTraces()) {
if (waitingOnTheRightLine(entry))
checkThreadLocalValues(entry);
}这将检测线程所在的确切行,以检查其未运行和在已知点的等待。
发布于 2012-01-31 15:52:12
示例代码,希望它能有所帮助:
Thread t = getYourThread();
if(t.getState() != Thread.State.RUNNABLE) {
//currently the thread is not running...
}https://stackoverflow.com/questions/9076020
复制相似问题