JVM は、.jar
実行時間の長いプログラムのためにディスクからファイルを 2 回以上読み取りますか? それとも、読み取りは 1 回だけで、JVM が終了するまでイメージ全体がメモリ内にありますか?
約 26 時間かかるジョブを実行していましたが、終了間際にNoClassDefFoundError
未定義のオブジェクト例外 (.jar
アプリケーションの実行中に、ディスク上の古いディスクと同じ場所に新しいディスクを作成しました。
いいえ、JVMは新しいクラスをロードする必要があるたびにjarから読み取ります。
フラグ-verbose:class
を指定してコードを実行すると、クラスのロードが非常に遅いことがわかります。JVM は、絶対に実行する必要があるクラスだけをロードします。プログラムの最後で、以前はまったく必要とされなかったクラスを必要とする何かを実行している場合、そのクラスはその時点でロードされます。
これは、発生したエラーを非常によく説明しており、まさにその理由で、実行中の jar (またはクラス) ファイルを置き換えてはならないことに注意してください。
クラスのインポートと通常の使用を使用している場合は、クラスごとに 1 回だけです。
クラスローダーで遊んでいる場合、リフレクションは余分な読み取りと「計画されていない動作」を行うことができます-これは、クラスごとに何度も発生することを意味します。