- ベストアンサー
ガーベッジコレクションとは?プログラムの流れと意味について教えてください
- ガーベッジコレクションについて勉強してるんですが、以下のプログラムの意味が全く理解できません。
- 特にgetObject(); System.gc();の意味を教えてもらえるとありがたいです。
- コンストラクタ、インスタンスなどは理解しています。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 よりわかりやすくするため、ちょっと、コードを変えています。 いちおう説明のコメントを入れてみました。 また、実行するときに java -verbose:gc Garbage01Use などとすると、ガーベージコレクションの動きがよくわかると思います。 ------------------------------------------------------------------ class Garbage01{ //このクラスのインスタンスがいくつメモリ上に //生き残っているかを表すクラス変数。 static int num = 0; public Garbage01(){ //numはクラス変数なので、このコンストラクタが //呼び出されるたびに1づつ増えていく。 num++; } //Objectクラスのfinalizeメソッドをオーバーライドしている。 //finalizeメソッドはインスタンスがガーベージコレクションにより //メモリから削除される直前に呼び出される。 public void finalize(){ //わかりやすくするため、↓を追加 System.out.println("finalize!"); //インスタンスがメモリから削除されるときにnumも1減らす。 num--; } } --------------------------------------------------------------------- public class Garbage01Use{ public static void main(String[] args){ Garbage01 g = null; //Garbage01クラスのインスタンスを10個作る for(int i = 0 ; i < 10; i++){ //が、10個分の変数を用意していないため、 //新しいインスタンスを作成するたびに、 //前のインスタンスが参照されなくなる。 g = new Garbage01(); } //このとき、Garbage01のインスタンスは、 //変数gによって参照されているものが1個、 //あとの9個は、どこからも参照されていない状態。 //しかし、まだ、ガーベージコレクションがおこなれていないため、 //10個全部がメモリ上に生き残っている。 //よってnumは10 System.out.println(Garbage01.num); //ガーベージコレクションを誘発するためgetObject()メソッドを呼んでみる。 getObject(); //何度もガーベージコレクションが行われ、いくつかGarbage01の //インスタンスは消えているはず。 //しかし、ここでのnumの値は、環境によって違うはず。 //私の場合(ver. 1.5.0_06)は、まだフルガーベージコレクションが発生しておらず、 //numの値は8でした。 System.out.println(Garbage01.num); //手動でガーベージコレクションを発動させる。 System.gc(); //フルガーベージコレクションがおきて、無参照のインスタンスは全滅。 //numの値は、変数gに参照されているものだけが残って1。 System.out.println(Garbage01.num); } private static void getObject(){ //特に意味もなく無参照のObjectクラスのインスタンスをたくさん作成し、 //ガーベージコレクションを誘発している。 for(int i = 0 ; i < 100000000 ; i++){ new Object(); } } }
お礼
大変遅くなりまして 申し訳ありませんでした。 おかげさまで、よく分かりました。有難うございました。