![]() ![]() ![]() ![]() | オブジェクト、クラス、インタフェース |
他の多くのオブジェクト指向の言語では、作成するすべてのオブジェクトを記録したり、それらが不必要になった時に破棄する必要がある。 このようにしてメモリを管理するためにコードを書き込むことは、退屈でありしばしばエラーのきっかけになる。 Java では、(システムが処理できる限り)希望するだけオブジェクトを作成しても、それらを破棄する必要のないようにすることができる。 オブジェクトがもう使用されていないと判断すると、Java 実行環境ではオブジェクトを削除する。 このプロセスはガベージコレクションとして知られている。そのオブジェクトへの参照がない時に、オブジェクトはガベージコレクションの資格を有する。変数で保持されるオブジェクト参照は、変数がスコープから外れた時に自然にドロップされる。 あるいは、データ型が
null
への参照型である変数の値を設定することによって、明示的にオブジェクト参照をドロップすることができる。終了
オブジェクトがガベージコレクトする前に、 Java 実行時システムはオブジェクトのfinalize()
メソッドを呼び出して、オブジェクトにクリーンアップする機会を与える。 このプロセスは終了として知られている。 オブジェクトがガベージコレクトされる前に、オブジェクトで終了が発生する。 他の保証はない。 「保留:オブジェクトがコレクトされる前に、終了が呼び出されるように保証する?}終了の間に、オブジェクトは順にガベージコレクションの資格を有するように、ファイルやソケットなどのシステム資源を開放したり、他のオブジェクトへの参照をドロップしたいことがある。
finalize()
メソッドは java.lang.Object クラスのメンバである。 その型のオブジェクトに必要な終了を実行するために、クラスはfinalize() メソッド
を上書きしなくてはならない。 後述する finalize() メソッドの書き方 では、クラスのためのfinalize() メソッド
の書き方を説明する。ガベージコレクタ
Java 実行環境は、不必要なオブジェクトが使用するメモリを周期的に解放するガベージコレクタを持っている。 Java ガベージコレクタは、参照されるオブジェクトをマークしながら、オブジェクトに対する Java のダイナミックメモリ領域を走査する、マークを一掃するガベージコレクタである。 オブジェクトへの可能なパスをすべて調査した後、マークされていない(つまり、参照されない)オブジェクトはガベージとなってコレクトされる。 ( Java のガベージコレクションアルゴリズムをうまく説明すると「若干の保守的な走査をして、簡潔にマークを一掃するコレクタ」であるかも知れない。)ガベージコレクタは低優先度スレッドで実行して、状況と Java が実行しているシステムに依存して、同期および非同期に実行する。
ガベージコレクタは、システムがメモリ不足あるいは Java プログラムから要求にがある時、同期的に実行する。 Java プログラムは
System.gc()
を呼び出して、いつでも実行するようにガベージコレクタに要求することができる。 ガベージコレクタはタスクを完了するのにおよそ20ミリ秒が必要なので、パフォーマンスの影響がなく、プログラムがガベージコレクタがジョブを終了するのに十分なアイドル期間を持てるときにだけガベージコレクタを実行するように注意する必要がある。注釈: ガベージコレクションを実行するように要求しても、オブジェクトがガベージコレクトされることは保証しない。
Java 実行時に、スレッドが始まる時を指摘して、(ウインドウ95のような)別のスレッドが割り込むことができるシステム上では、 Java ガベージコレクタは、システムがアイドルの時は非同期に実行する。 別のスレッドがアクティブになるとすぐに、ガベージコレクタは整合性のある状態になり、終了するように要求される。
![]() ![]() ![]() ![]() | オブジェクト、クラス、インタフェース |