初心者向けのJava講座です。一緒にJavaを勉強しませんか?
はじめてのJava入門初心者向けのJava講座 |
ガーベジコレクション
javaはクラスからオブジェクトを作成するとメモリを消費します。
メモリには限りがあり、オブジェクトを次々に作成していくと当然メモリ不足になります
カーベジコレクションとはオブジェクトがどこからも参照されなくなりメモリ内で不要に
なったメモリ領域を開放する役割をします。
下の例で説明します。
ここでは、オブジェクトを作成していて、参照変数objは今Sample61を参照されています。
しかし、そのobjにnullを代入したらどうなるでしょうか?
また、聞きなれない言葉が出てきましたがnullとはつまり何も値を代入していないと言うことになります。
obj = null;
つまり、objにnullを代入したことによりその参照変数objには今何も参照されていないことになります。 このような状態になり参照変数objはガーベジコレクションの対象になります。しかし、ここで注意があります。あくまでもガーベジコレクションの対象になっただけですぐに実行はされません。
サンプルプログラム(Sample61.java )
class Sample61{
public static void main(String args[]){
Super61 obj = new Super61();
obj.method();
obj = null;
}
}
class Super61{
void method(){
System.out.println("ようこそ!javaの世界へ");
}
}
プログラムをコピーする場合すべて選択をクリックしてください。
Sponsored link
コンパイル・実行してみます。
このプログラムでは、Super61オブジェクトを作成して
obj.method()でSuper61クラスのmethod()を呼び出していますが、
その後にobj = null;によりSuper61 はどこからも参照されなくなっています。
したがって、この時点でガベージコレクションの対象になっています。
ためしにもうひとつプログラムを見ていきます。
サンプルプログラム(Sample61_1.java)
class Sample61_1{
public static void main(String args[]){
Super61_1 obj = new Super61_1();
obj.method();
obj = null;
obj.method();
}
}
class Super61_1{
void method(){
System.out.println("ようこそ!javaの世界へ");
}
}
プログラムをコピーする場合すべて選択をクリックしてください。
Sponsored link
コンパイル・実行してみます。
今度はコンパイルは成功しましたが、例外というエラーが出力されました。
つまり、最初のobj.method();は通常通り呼び出されていますが、その後で
obj = null;によりobjはどこからも参照されなくなりました。
しかしその後でまた,method()を呼び出そうとしているのでこのようなエラーがでます。
System.gc()メソッド
javaは通常は、メモリが足りなくなれば、自動的にガベージコレクションを行います。
しかし、プログラムの中では強制的にガベージコレクションを行いたいときがあります。
そのとき使用するメソッドがjava.lang.Systemクラスのメソッドgcメソッドです。
ちなみにjava.langパッケージのクラスはインポートしなくても使えるので
System.gc();と書くだけで使用できます。
gcメソッドを呼び出すと、現在占有しているメモリを再利用するためにJava仮想マシンを
使用しないオブジェクトのリサイクルを実行します。
メソッドの呼び出しから制御が戻るのは、Java仮想マシンが、メモリ領域を最適化した後です
また、System.gc()メソッドでガベージコレクションを実行しても、即座に処理が行われるかどうかは保証されません。
ガ-ベジコレクションのまとめ
ガベージコレクションの呼び出し方法自動ガベージコレクション(JavaVMの自動判断)
System.gc()メソッドによる強制的呼び出し
ガベージコレクションの特徴
- 任意のオブジェクトを明示的に指定したメモリ開放はできない
- 呼び出された時点で十分なメモリが利用可能であれば開放されないこともある。
- 必ず必要なメモリを確保できるとは限らない。
- 自動ガベージコレクションではすべてのガベージを開放せずとも、ある程度のメモリが確保された時点で終了
- System.gc()メソッドでの呼び出しの場合は全てのガベージを開放する