4

私たちの Web アプリでは、一部のページの最初の読み込みに、クラスの読み込みのためにわずかではありますがかなりの時間がかかります。起動時に Web アプリケーション クラスを JVM にプリロードする賢い方法はありますか?


更新: 現在行っていることは、完全なクラス名の束 (700) を db テーブルに格納することです。起動時にテーブルを読み取り、Class.forName() を実行します。それはうまくいきますが、もっと賢いアプローチがあるかもしれないと思いました。プロファイラーを使用して、起動時に参照された 700 クラスを特定しました。

4

6 に答える 6

2

静的イニシャライザ コードを 1 つのダミー クラスに記述して、起動時にそのクラスをロードすることもできます。その静的初期化子は、他のクラスをロードするいくつかのキー オブジェクトを作成します (これを再帰的に実行して、コードのモジュール性を向上させることができます)。これははるかに短くて簡単だと思います (そして、DB の問題について心配する必要はありません)。

おそらくより良いアプローチは、起動時に読み込みの遅いページのいくつかにヒットし、結果を破棄するサーブレットを作成することです。これにより、クラスのロードが強制されます。これらのページを何度もロードすると、実行されるジャストインタイム コンパイルの量が増加します (コードの速度が向上し、JIT コンパイルのコストが削減されます)。他にも利点があります。これは「パワーオン セルフ テスト」であり、1 回限りの起動タスクが実行され、さまざまなキャッシュがかなりの程度準備される可能性があります。

于 2009-05-21T13:48:46.847 に答える
2

load-on-startup仕様の一部であるため、あまり巧妙ではありませんが、 のサーブレット定義に要素を追加することで、Web アプリの開始時にサーブレットを開始することができますweb.xml

<servlet>
  <description>....</description>
  <display-name>....</display-name>
  <servlet-name>....</servlet-name>
  <servlet-class>....t</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

代表的な一連のサービス、または必要なすべてをプリロードできる 1 つのサーブレットに対してこれを行うと、目標を達成できます。

これで十分でない場合、たとえば、クラスを意味のある方法で実際に初期化せずに JAR ファイルからクラスをロードしたい場合、および JAR ファイルの場所がわかっているか、JAR ファイルの場所を特定できる場合は、次のようにします。この JCP フォーラムの投稿「List classes in package」またはそのスレッドの後の投稿のいくつかのコードのようなものを使用できます。クラスのリストから Class オブジェクトを取得できます。これにより、実際にインスタンスをインスタンス化することなくクラスをロードできます。

于 2009-03-19T21:37:55.967 に答える
1

スレッド内の Class.forName を使用すると、速度が向上する可能性があります。ヒットする可能性が高い最初のページにあるものから始めます。

スレッド化すると、起動が速くなり (戻りが早くなります)、可能性の高いクラスを最初にロードし始めるため、ページがヒットするまでにそれらがロードされることが期待されます。他の同じ取引については、ページがヒットする前に読み込まれることを願っています。

さらに、クラスのグループごとにスレッドを開始することもできます (特定のページで必要なクラスはグループになります)。ディスクからの読み取りを並列化できるため、速度が向上する可能性があります(ただし、速度が低下する可能性もあります)。

これは、ページの最初の読み込みで速度が低下しないことを保証するものではありませんが、調査する価値があります。

于 2009-03-20T00:03:05.837 に答える
1

Class.forName() は、私が考えることができる唯一のものです。私は確かに、より賢い代替案を聞くことに興味があります.

もう 1 つのオプションは、一連の URL を選択し、起動時にスクリプトを実行してそれらの URL にアクセスすることです。

于 2009-03-19T21:35:50.980 に答える
0

700 クラスを jar ファイルに変換し、おそらく jar をブート クラス パスに配置することで、プリロードにいくつかの方法を適用できます (動作するかどうかはわかりませんが、ヒントを与えるだけです)。

于 2009-03-20T07:11:08.007 に答える
0

Jasper などのサードパーティの jsp コンパイラを使用して、JSP ページをデプロイする前にプリコンパイルすることができます。

于 2009-03-19T21:36:44.190 に答える