■ガベージコレクション
プログラム実行中に生成されるインスタンスは、ヒープ領域に格納される。
ヒープ領域の枯渇を防ぐため、不要になったインスタンスを削除し、空いた領域を再利用する仕組みを「ガベージコレクション」という。
ガベージコレクションは、Java仮想マシン(JVM)によって自動で行われるが、処理に時間がかかり、一時的にプログラムの処理が停止する。
任意のタイミングでガベージコレクションを実行するには、「Runtime.getRuntime().cs()」もしくは「System.cs()」を使用する。
■作成するプログラムの概要
・int型の値を1000個格納する配列を作成するクラスを作成する。
・メイン処理にて、上記のクラスを10000個インスタンスしした後、「null」(※)を格納する。
インスタンス数が1000個単位で「Runtime.getRuntime().cs()」を実行し、空き容量を確認する。
(※)「null」を格納することで、インスタンスがどこからも参照されないようにする。
■フローチャート
▼int型の値を1000個格納する配列を作成するクラス
▼メイン処理
■プログラム仕様
▼int型の値を1000個格納する配列を作成するクラス
処理名 | int型の値を1000個格納する配列を作成する処理 |
---|---|
処理概要 | int型の値を1000個格納する配列を作成する |
引数 | なし |
戻り値 | なし |
入力 | 処理内容 | 出力 |
---|---|---|
– | int型の値を1000個格納する配列を作成する。 int data[] = new int[1000]; | – |
▼メインクラス
処理名 | メインクラス |
---|---|
処理概要 | ・処理開始前の空き容量を出力する。 ・10000個の「int型の値を1000個格納する配列を作成するクラス」をインスタンスする。 ・インスタンス数が1000個単位で、ガベージコレクションを実行し、現在の空き容量を出力する。 |
引数 | なし |
戻り値 | なし |
入力 | 処理内容 | 出力 |
---|---|---|
– | 処理開始前の空き容量を出力する。 | 【コンソール】 空き容量 |
– | 10000個の「int型の値を1000個格納する配列を作成するクラス」を格納する配列を用意。 | – |
– | ■ループ処理:配列の要素数分繰り返し(10000回) | 【コンソール】 インスタンス数 空き容量 |
■サンプルコード
// int型の値を1000個格納する配列を作成するクラス
class DataSet{
int data[] = new int[1000];
}
public class Control_GC {
public static void main(String[] args) {
// 処理開始前の空き容量を確認
System.out.println("開始前空き容量:" +
Runtime.getRuntime().freeMemory());
// int型の値を1000個格納する配列を作成するクラスを
// 格納する配列を10000個用意する
DataSet[] ds = new DataSet[10000];
// 10000回ループ処理
for(int i = 0; i < ds.length; i++) {
// クラスをインスタンス
ds[i] = new DataSet();
ds[i] = null;
// インスタンス1000個ごとに空き容量を出力
if((i + 1 ) % 1000 == 0) {
// ガベージコレクションを実行
Runtime.getRuntime().gc();
// 空き容量を確認
System.out.println("--------------");
System.out.println("インスタンス数:" + (i + 1));
System.out.println("空き容量:" +
Runtime.getRuntime().freeMemory());
}
}
}
}
■実行結果
・ガベージコレクションを実行することにより、空き容量が徐々に減少することなく、増加したり減少したりする挙動が見受けられる。
開始前空き容量:134766080
--------------
インスタンス数:1000
空き容量:9306256
--------------
インスタンス数:2000
空き容量:9266888
--------------
インスタンス数:3000
空き容量:9267216
--------------
インスタンス数:4000
空き容量:9267264
--------------
インスタンス数:5000
空き容量:9267296
--------------
インスタンス数:6000
空き容量:9266912
--------------
インスタンス数:7000
空き容量:9267464
--------------
インスタンス数:8000
空き容量:9267080
--------------
インスタンス数:9000
空き容量:9267424
--------------
インスタンス数:10000
空き容量:9267232
■補足
▼Java仮想マシン(JVM)によるガベージコレクション
「Runtime.getRuntime().gc()」を使用せず、Java仮想マシン(JVM)によるガベージコレクションの挙動は、インスタンス数が3000から4000個あたりで、空き容量が増加していることがわかる。
なお、「■実行結果」と空き容量に大きな差が生じているのは、1000回単位で「Runtime.getRuntime().gc()」を実行する処理を削除したため。
開始前空き容量:134766080
--------------
インスタンス数:1000
空き容量:130563760
--------------
インスタンス数:2000
空き容量:126646096
--------------
インスタンス数:3000
空き容量:122451792
--------------
インスタンス数:4000
空き容量:131922584
--------------
インスタンス数:5000
空き容量:127728280
--------------
インスタンス数:6000
空き容量:123533976
--------------
インスタンス数:7000
空き容量:119339672
--------------
インスタンス数:8000
空き容量:115665640
--------------
インスタンス数:9000
空き容量:111471336
--------------
インスタンス数:10000
空き容量:107277032
コメント