Garbage Collection API

Revised: 4th/Dec./2003; Since: Mar./3rd/2002

The GC

アプリケーション側からも、GCの動作を促すことはできます。但し、明示的に指定できるのではなく、あくまでも促すだけです。GCの起動を促す java.lang.System.gc() や、GCが回収前に呼び出す System.finalize() などのメソッドが用意されています。しかし、これらのメソッドでGCの起動タイミングを制御できるわけではないので、予期せぬ弊害を引き起こす可能性もあります。アプリケーション側で明示的に呼び出すことは避けたほうが賢明でしょう。

JVM や GC に関する詳細は、Sun の "HotSpot VM WhitePaper" や "Tuning Garbage Collection" などのドキュメントを参照してください。

Java 実行環境は、利用されなくなったオブジェクトに占有されているメモリを定期的に解放する為の GC を含んでいます。 Gatbage Collector は自動的に実行されますが、 System クラスの gc() メソッドを呼ぶことで、明示的にメモリの解放を促すことも出来ます。例えば、巨大なゴミを作ってしまったコード部分の後や、大量のメモリを消費するコード部分の前に実行したいことがあるでしょう。

但し、 gc() メソッドは必ずしも GC を実行しません。 GC のプロセスは、プログラム実行の邪魔にならないように優先度が低く設定されています。従って、他のプロセスによって制御が握られている場合、 gc() によっても garbege collector のプロセスは実行されません。

Finalization

オブジェクトが GC の対象になる前に、 GC は、オブジェクトの finalize() メソッドの呼び出しにより、 clean up の機会をオブジェクトに与えます。このプロセスは終了化 (finalization) と呼ばれます。

殆どのプログラマは、 finalize() メソッドを実装するかどうか悩まないで済みます。しかし、 native コードのような、 GC の制御下にないリソースを解放する為に、 finalize() メソッドを実装する必要があるかもしれません。

finalize() メソッドは、 Object クラスのメンバです。 Object クラスは Java プラットフォームのクラス階層のトップであり、全てのクラスのスーパークラスです。任意のクラスで、必要な終了化の処理のために finalize() メソッドをオーバーライドすることが出来ます。このメソッドをオーバーライドするときは、その処理の最後に super.finalize() を呼ぶべきです。

Summary of Creating and Using Objects

オブジェクトは、 new 演算子とコンストラクタによってクラスから作成します。 new 演算子は、作成されたオブジェクトの参照を返します。この参照は変数に代入しておきますが、直接利用することも出来ます。

クラスは、 Java プラットフォームのアクセスメカニズムによって、そのインスタンス変数やメソッドへのアクセスを制御します。定義されたクラスの外側からアクセス可能なインスタンス変数とメソッドは、限定名 (qualified name) によって参照されます。インスタンス変数の限定名は次のような形になります:

	objectReference.variableName

メソッドの限定名は次のようになります:

	objectReference.methodName(argumentList)

或いは、引数がないこともあるでしょう:

	objectReference.methodName()

GC は使われなくなったオブジェクトをメモリ上から自動的に clean up します。オブジェクトは、プログラムがそれ以上そのオブジェクトへの参照を保持しなければ利用されないと言うことになります。参照を保持している変数に null 値を代入することで、変数から参照を明示的にドロップすることも出来ます。

プログラムでは、オブジェクトの clean up をするわけではないことに注意してください。プラグラムでは、参照を null 値の代入によってドロップするだけです。こうすることで、参照されなくなったオブジェクトは Garbage Collection の対象になります。実際にメモリを解放するのは自分で作ったプログラムではなく、 Java プラットフォームの Garbage Collection です。

サンプル

次のコードは Point クラス型オブジェクトと Rectangle クラス型オブジェクトを作っています。このコードが実行された後では、何個の参照が存在するでしょうか?これらのオブジェクトは Garbage Collection の対象になるでしょうか?

...
Point point = new Point(2,4);
Rectangle rectangle = new Rectangle(point, 20, 20);
point = null;
...

Point クラス型オブジェクトも Rectangle クラス型オブジェクトも、参照は一つずつです。どちらのオブジェクトもガーベジ・コレクションに有資格ではありません。 Point クラス型オブジェクトの参照は print 変数に保持されており、これは null 値の代入によって、明示的にドロップされています。これだけならば Garbage Collection に有資格なのですが、参照がドロップされる前に、 Rectangle クラスのコンストラクタ引数に使われています。ここで作られた Point クラス型オブジェクトがメモリ上から clean up されてしまうと、 Rectangle クラス型オブジェクトが正常に動作しなくなる恐れがあるので、 GC は Point クラス型オブジェクトを clean up しません。



Copyright © 2001-2003 SUGAI, Manabu. All Rights Reserved.