我想知道是否可以获取给定类的正在运行的实例的句柄。触发此问题的特定问题是应用程序由于存在大量正在运行的线程而无法正常退出。
是的,我知道您可以对 thead 进行守护进程,然后它们就不会阻止应用程序退出。但这确实让我想知道这是否可能。我能做的最接近的是类加载器(受保护!)查找加载类 http://java.sun.com/javase/6/docs/api/java/lang/ClassLoader.html#findLoadedClass(java.lang.String),尽管您必须运行自己的类加载器才能执行此操作。
与此相关的是,这是分析工具跟踪对象句柄的方式吗?通过运行他们自己的自定义类加载器?还是有一些我没有看到的巧妙的方法?
您确实可以通过使用转储到标准输出的所有正在运行的线程的堆栈跟踪kill -QUIT <pid>
在 *NIX 之类的操作系统上,或者通过在 Windows 控制台中运行应用程序并按Ctrl-Pause
(正如另一张海报所指出的。)
但是,您似乎正在要求以编程方式来执行此操作。因此,假设您真正想要的是当前调用堆栈中包含给定类中的一个或多个方法的所有线程的集合......
我能发现的最好的事情是检查所有正在运行的线程的堆栈,而不涉及对 JVMTI 的调用。我还没有尝试过这个,但它应该可以在 Java 1.5 及更高版本中工作。请记住,根据定义,这根本不是线程安全的(正在运行的线程列表 - 以及它们当前的堆栈跟踪 - 将在你的下面不断变化......实际使用时需要很多偏执的东西在此列表中。)
public Set<Thread> findThreadsRunningClass(Class classToFindRunning) {
Set<Thread> runningThreads = new HashSet<Thread>();
String className = classToFindRunning.getName();
Map<Thread,StackTraceElement[]> stackTraces = Thread.getAllStackTraces();
for(Thread t : stackTraces.keySey()) {
StackTraceElement[] steArray = stackTraces.get(t);
for(int i = 0;i<steArray.size();i++) {
StackTraceElement ste = steArray[i];
if(ste.getClassName().equals(className)) {
runningThreads.add(t);
continue;
}
}
}
return runningThreads;
}
让我知道这种方法是否适合您!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)