1

約 30 個の jar を含むクラスパス ディレクトリがあります。私の単純なコンソール アプリケーションでは、これらすべての jar を指す sURLClassLoaderのリストで初期化する場所を作成しています。URL

URL[] urls = new URL[] {
    new URL("jar:file:/D:/Work/temp/jars/antlr-2.7.7.jar!/"),
    new URL("jar:file:/D:/Work/temp/jars/aopalliance-1.0.jar!/"),
    new URL("jar:file:/D:/Work/temp/jars/c3p0-0.9.1.jar!/"),
    ...
}
URLClassLoader cl = new URLClassLoader(urls, getClass().getClassLoader());
Class<?> c = cl.loadClass(...);
etc...

このように、すべてが正常に機能しており、 my から単一のクラスをロードするのに数ミリ秒かかりますURLClassLoader

次に、このコード スニペットを取り、Tomcat で実行します。たとえば、サーブレット内の単純な Web リクエストでトリガーされますdoGet()。驚くべきことに、平均的なクラスをロードするのにかかる時間は 10 ~ 15 倍長くなり、初期化時間全体が受け入れられなくなります。この問題は、少なくとも Tomcat バージョン 6 と 7 の両方で発生します。

何か案は?

4

2 に答える 2

0

ばかげていますが、マシンを再起動した後、問題はなくなりました:) Windows 7、Oracle JDK 1.6/1.7、Tomcat 6/7を実行していますが、これらの組み合わせで問題が解決しませんでした。プロファイラーは、すべてのものを遅くしているのはsun.net.www.protocol.jar.URLJarFile'sであることを示していました。<init>おそらく、jar キャッシュに問題が発生したため、jar から要求されたすべてのクラスに対して不要な初期化が実行されました。

更新: マシンを再起動しない限り、クラスの読み込みが非常に遅く、さらに遅くなるという問題を解決する方法を見つけました。使用する代わりに

new URL("jar:file:/D:/Work/temp/jars/antlr-2.7.7.jar!/")

私はもう試した

new URL("file:/D:/Work/temp/jars/antlr-2.7.7.jar")

URLClassloader、「jar」プロトコルが指定されていなくても、この種の URL を jar として適切に処理します。しかし、それは劇的にパフォーマンスを向上させました!それでも、この動作の正確な理由はわかりません。

于 2013-08-02T13:18:59.530 に答える