0

大規模なアプリケーションを実行しているTomcatサーバーがあります。この例に似た2つのクラスがあります。

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

4

2 に答える 2

1

貼り付けなかったコードに関連するスレッドデッドロックのバグがある可能性はありますか?あなたのClassB.methodB方法はsynchronizedです。synchronizedおそらく、ロックを保持していて解放していない他のスレッドがありClassB.class、ロギングを行っているスレッドがそのロックを取得してメソッドに入るのを防いでいます。

于 2013-02-14T12:15:52.230 に答える
0
  1. デバッグモードを有効にして、コードにブレークポイントを割り当てます。IDE(できればEclipse)を使用して、ステップバイステップで進みます。
  2. Eclipseには、コードをスキャンして考えられるバグを見つけるためのfindbugsやPMDなどのプラグインがあります。
  3. すべての条件、メソッド呼び出し、ループを手動で調べて、欠陥を確認します。

完全なアプリを作成した場合は、どこを見ればよいかわかります。そうでない場合でも、書かれていることをすべて確認するのは良いことです

于 2013-02-14T12:20:50.903 に答える