我有一台运行大型应用程序的Tomcat服务器。它有两个类似于这个例子的类:
public abstract class ClassA {
private static final Logger LOGGER = Logger.getLogger(ClassA.class);
// ...
public File methodA(ICancellable cancel) {
URL request = new URL("an URL");
LOGGER.debug("Calling ClassB.methodB(type)");
File f = classB.methodB(request, "type", cancel);
LOGGER.debug("The call to ClassB.methodB(type)"
+ " returned the File==" + f);
// ...
}
}
public class ClassB {
private static final Logger LOGGER = Logger.getLogger(ClassB.class);
// ...
public static synchronized File methodB(URL url, String type,
ICancellable cancel)
{
final String thisMethodsName = "ClassB.methodB(url: " + url
+ ", type:" + type + ", cancel: " + cancel + ")";
LOGGER.debug("Entering method: " + thisMethodsName);
// ...
return f;
}
}
应用程序正常运行,ClassA.methodA()
最初成功调用ClassB.methodB()
,正如我在日志文件中看到的那样:
[...]
14/02/2013 12:34:56 DEBUG ClassA:123 - Calling ClassB.methodB(type)
14/02/2013 12:34:56 DEBUG ClassB:456 - Entering method: ClassB.methodB(url: anURL, type: type, cancel: @1234);
[...]
14/02/2013 12:34:56 DEBUG ClassA:125 - The call to ClassB.methodB(type) returned the File=="aFile".
[...]
我的问题是在服务器工作一段时间后,它停止调用ClassB.methodB()
。应用程序挂起,它只是将其写入日志:
[...]
14/02/2013 12:34:56 DEBUG ClassA:123 - Calling ClassB.methodB(type)
这是日志文件的最后一行。实际上并没有调用ClassB.methodB()
。
我怀疑这可能是由于打开的资源没有关闭,但我正在尝试找到所有代码,并且在修复之后,它仍然会发生。
导致这种情况的原因是什么?我怎样才能继续寻找原因?
JVM版本:1.6.0_13 Tomcat版本:6.0.18
答案 0 :(得分:1)
是否有可能存在涉及您未粘贴的某些代码的线程死锁错误?您的ClassB.methodB
方法为synchronized
。您可能有一些其他线程持有并且未释放synchronized
上的ClassB.class
锁定,从而阻止正在执行日志记录的线程获取该锁并输入该方法。
答案 1 :(得分:0)
如果您已经编写完整的应用程序,那么您就会知道在哪里查看。如果没有,检查所有写的
仍然是好的