1

Webアプリケーションがあり、そのインスタンスは同じTomcat(v6.0.14)インスタンスの下に複数回デプロイされます。warファイルの名前が「app.war」であるとすると、「app1.war」、「app2.war」などをデプロイします。

すべてのアプリケーションインスタンス(〜20)が正しくデプロイされます。これらのアプリケーションのサーブレットにアクセスすると、Tomcatので失敗するNoClassDefFoundErrorことがあります。以下はその一例です-ClassNotFoundExceptionWebAppClassLoader

java.lang.NoClassDefFoundError: com/xxx/APISocketServer$ClientRequestHandler
    at com.xxx.APISocketServer$APISocketServerThread.run(APISocketServer.java:143)
Caused by: java.lang.ClassNotFoundException: com.xxx.APISocketServer$ClientRequestHandler
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1358)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)
    ... 1 more

問題のあるクラスはアプリケーションコードの一部であり、ライブラリの一部ではありません。

一部のアプリケーションインスタンスは正しく実行されるため、これはクラスパスの設定ミスの場合にはなり得ません。注意すべきことの1つは、ロードに失敗するクラスは2、3しかないということです。クラスには静的初期化ブロックがないため、クラスの初期化に失敗する可能性があります。Tomcatログ(catalina.out、localhost.log)を確認しましたが、クラス初期化エラーは見つかりませんでした。

この問題のデバッグをどのように進めればよいですか?

4

1 に答える 1

3

さらに調査したところ、開いているファイル記述子の制限(1024)が原因であることが判明しました。各アプリケーションインスタンスには、クラスローダー()によって開かれたJarファイルの独自のコピーが必要ですWebappClassLoader。Jarファイルのクラスが90秒間アクセスされない場合、クラスローダーはファイルを閉じます。短時間に複数のアプリケーションインスタンスにアクセスすると、openJARs関数が失敗し、クラスが読み込まれなくなります。

WebappClassLoaderより高いログレベルでJARファイルを開く際の失敗をログに記録していた場合、エラーははるかに早く発見されたはずです。エラーはデバッグレベルでログに記録されます。のデバッグレベルを有効WebappClassLoaderにすると、問題の特定に役立ちます。

于 2013-03-05T17:02:30.057 に答える