【Java】Runtime.getRuntime().gc()でガベージコレクションを制御する

■ガベージコレクション

プログラム実行中に生成されるインスタンスは、ヒープ領域に格納される。
ヒープ領域の枯渇を防ぐため、不要になったインスタンスを削除し、空いた領域を再利用する仕組みを「ガベージコレクション」という。

ガベージコレクションは、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回)
|1個ずつクラスをインスタンスする。
|参照する変数を「null」に代入する。
|▼条件分岐
||【インスタンス数が1000個単位の場合】
||ガベージコレクションを実行する。
||インスタンス数と空き容量を出力する。
|▲

【コンソール】
インスタンス数
空き容量

■サンプルコード


// 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

■参考

コメント