2012-04-27 6 views
4

最近、ビルドディレクトリの開発、テスト、削除を行ってきました。JVMプログラムの理論的側面:クラスファイルと内部化、実行状態

Javaアプリケーションの実行中にクラスファイルのディレクトリを削除すると、何が起こるかの詳細な説明を誰かが提供できるかどうか不思議です。私はある時点では、これがアプリケーションに影響を及ぼさないと考えています(つまり、すべての操作がバイトコードとしてスタックにプッシュされているため)。しかし、いつこの時点でノーリターンになるでしょうか? JVMは、実行中のアプリケーションのすべてのクラスをキャッシュに入れたり完全所有しているため、最初の場所(つまり、最初にJavaプロセスを実行したときの.classファイルの場所)は重要ではありません。

答えて

2

クラスファイルは、最初にアクセスするときに必要です。通常はキャッシュされません。代わりに、ClassLoaderは必要なすべての情報を抽出し、.classを再度読み取ることはありません。

通常のベストプラクティスは、新しいディレクトリに書き込むことです、最後のバージョンはまだ生きている場合は、新しいバージョンを作成するときに(またはあなたがそのバージョンにロールバックする機能が必要な場合)

の削除/編集をそれが実行されている間、プログラムはシェルスクリプトとCプログラムに問題を引き起こすので、あまりにも驚くべきではありません。

@Louis Wassermanが指摘しているように、OPは期待通りに機能すると述べています。 IMHOはアプリケーションに依存します。必要なクラスがすべてロードされている場合は、すべて削除することができます。クラスを起動してから長い時間クラスをロードするアプリケーションは、このように動作しません。

+0

問題を確定的に再現するためのトレースクラスローディングについて言及してください。 –

+1

私はOPが、実行中のプログラムを削除することが、彼が期待していたよりもJavaで動いていると言っていたと思います。 –

+0

右 - 彼が痕跡をつけたら、彼はそのような主張を確認したり、偽造したりすることができました。 –

1

今日、ほとんどのJVMはクラスを「オンデマンド」でロードします。そのため、Javaプログラムを起動すると、JVMはアクティブな参照に基づいて必要に応じて.classファイルを読み込みます。一度ロードされると、ディスク上のバイトはJVM内部表現に変換され、メモリに保持されるため、もはや必要とされなくなります。(実際よりも複雑です。効果的に、クラスがロードされると、ディスク上にそれらのプログラムはもう必要ありません(まったく同じプログラムを最初から実行することはないと仮定します)。

しかし、大きなシワがあります...プログラムのすべてのクラスが実際に平均的な実行でロードされているとは限りません。奇妙な状況でのみ必要なエラークラスを想像してみてください。通常の実行ではロードされません。そのため、プログラムが正常に実行され、後でクラスのロードが必要なエラー状態になった場合、ファイルシステムからすべてを単に削除すると、JVMは、悪い方法 - 予想される例外(通常はキャッチブロックを介して処理される)を投げるのではなく、より深刻なエラーが発生し、ロジックを脱線させます。

すべてのクラスを「プリロード」することは可能ですが、これはちょっとしたハックです。通常、アプリケーション内のすべてのクラスのリストを保持し、それぞれに「Class.forName()」を実行するようにkludgesを実行します。パフォーマンス上の理由からこの方法をどのように行うかは、このSO articleを参照してください。

関連する問題