Java Virtual Machine(JVM)はインスタンスの生成が行われた時など、メモリーを厳密に監視しています。
これによって後で、どのメモリー(インスタンス)が参照されていて必要なのか、あるいはもう参照されなくなって
不必要になったのかを調べることができるようにしています。
しかし不必要になったデータを探すのは、アプリケーションが大きくなればなるほど、時間がかかる処理に
なります。したがってJVMはデータが不必要になったらすぐにガーベージコレクトを行うのではなく、暇な時に
ガーベージコレクトを行うようにしています。
実際にガーベージコレクトが行われるタイミングはJVMの実装に任されており、プログラマやユーザーが
そのタイミングを関知しなくても良いことになっています。このような理由によってC++にはデストラクタが
ありますがJavaにはありません。(デストラクタがいつ実行されるかはわからないからです。)
Javaのメリットはプラットフォーム(OS)を選ばないことです。パソコンのようなメモリーの比較的豊富な
プラットフォームで実行している分にはメモリーのことをそれほど意識しなくても良いのですが、携帯電話など
比較的リソースの乏しいプラットフォームでJavaを実行する場合は、メモリーをできるだけケチって使いたい
場合があります。このような場合、ガーベージコレクトをJVMに任せていてはメモリーが足りなくなってしまいます。
もちろんメモリーを使用したい時に残りのメモリーが足りなくなればJVMはガーベージコレクターを起動させますが、
もし、時間的に余裕がない時に実行されてしまっては困ります。そこで、プログラマがガーベージコレクタを起動させる
タイミングを指定することができます。
それには、Systemクラスのgc()メソッドを使用します。
このメソッドはガーベージコレクタを起動させて欲しいとJVMに伝えるだけで、いつ実行させるかはJVM次第です。
よくJavaの解説書のこのメソッドの説明に「ガーベージコレクタを実行する」とありますが、これは間違えです。
あくまでもできるだけ早くガーベージコレクタを実行させて欲しいとJVMに要求するだけです。