Java方法停止被调用

时间:2013-02-14 11:51:22

标签: java tomcat

我有一台运行大型应用程序的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

2 个答案:

答案 0 :(得分:1)

是否有可能存在涉及您未粘贴的某些代码的线程死锁错误?您的ClassB.methodB方法为synchronized。您可能有一些其他线程持有并且未释放synchronized上的ClassB.class锁定,从而阻止正在执行日志记录的线程获取该锁并输入该方法。

答案 1 :(得分:0)

  1. 启用调试模式并在代码中指定断点。使用IDE(最好是eclipse)一步一步。
  2. Eclipse有像findbugs或PMD这样的插件来扫描代码并找出可能的错误。
  3. 手动完成各种条件,方法调用,循环以查看缺陷。
  4. 如果您已经编写完整的应用程序,那么您就会知道在哪里查看。如果没有,检查所有写的

    仍然是好的