• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ガーベッジコレクションについて)

ガーベッジコレクションとは?プログラムの流れと意味について教えてください

このQ&Aのポイント
  • ガーベッジコレクションについて勉強してるんですが、以下のプログラムの意味が全く理解できません。
  • 特にgetObject(); System.gc();の意味を教えてもらえるとありがたいです。
  • コンストラクタ、インスタンスなどは理解しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.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();     }   }    }

vibes53
質問者

お礼

大変遅くなりまして 申し訳ありませんでした。 おかげさまで、よく分かりました。有難うございました。

関連するQ&A