【Java】クラスインスタンス生成後、残りのヒープサイズをfreeMemory()を使用して確認する

■スタックとヒープ

Javaのプログラムを実行する際、必要となる情報を格納する領域をメモリ領域と呼ぶ。

メモリ領域には、スタックとヒープの2種類が存在する。

・スタック領域に格納される情報
メソッドの呼び出し履歴
メソッド内のローカル変数の値
★メソッドの処理が終了すると、そのメソッドはスタック領域から削除される。

・ヒープ領域に格納される情報
クラスを生成したインスタンス
★生成したインスタンスは、呼び出したメソッドが終了しても、呼び出し元のメソッドで使用するため残り続ける。
すなわち、ヒープ領域に格納されているクラスのインスタンスは、呼び出したメソッドが終了しても、単純に削除されることはなく、適切なタイミング(※)で削除される。

(※)ヒープ領域に格納されているクラスのインスタンスが、適切なタイミングで削除される仕組みをガベージコレクションという。

■freeMemory()

ヒープ領域の空きサイズ(バイト)がどれくらい残っているか、確認するには、以下のメソッドを使用する。

Runtime.getRuntime().freeMemory()

■作成するプログラムの概要

・String型の値を100個格納する配列を作成し、1個ずつに「Hello」を設定するクラスを作成する。

・上記クラスを10000個インスタンスし、ヒープ領域の空きサイズが、どのくらい減るのか確認する。

■フローチャート

▼String型のデータを100個作成するクラス

▼メインクラス

■プログラム仕様

▼String型のデータを100個作成するクラス

・100個の配列に「Hello」を格納する処理

処理名100個の配列に「Hello」を格納する処理
処理概要100個の配列に「Hello」の文字列を設定する。
引数なし
戻り値なし
入力処理内容出力
■ループ処理:配列の要素数分繰り返し(100回)
|配列の要素1つずつに「Hello」を代入する。

▼メインクラス

処理名メインクラス
処理概要・処理開始前の空き容量を出力する。
・10000個の「String型のデータを100個作成するクラス」をインスタンスする。
・インスタンス数が1000個単位で、現在の空き容量を出力する。
引数なし
戻り値なし
入力処理内容出力

処理開始前の空き容量を出力する。

【コンソール】
空き容量

10000個の「String型のデータを100個作成するクラス」を格納する配列を用意。

■ループ処理:配列の要素数分繰り返し(10000回)
|1個ずつクラスをインスタンスする。
|100個の配列に「Hello」を格納する。
|▼条件分岐
||【インスタンス数が1000個単位の場合】
||インスタンス数と空き容量を出力する。
|▲

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

■サンプルコード


// String型のデータを100個作成するクラス
class MakeData{
	private String[] hello_data = new String[100];
	
	// 100個の配列に「Hello」を格納する
	public void insert_hello() {
		for(int i = 0; i < hello_data.length; i++) {
			hello_data[i] = "Hello";
		}
	}
}

// メインクラス
public class ChkFreeMemory {
	public static void main(String[] args) {
		// 処理開始前の空き容量を確認
		System.out.println("開始前空き容量:" + 
				Runtime.getRuntime().freeMemory());
		
		//String型のデータを100個作成するクラスを10000個用意する
		MakeData[] mk_data = new MakeData[10000];
		
		// 10000回ループ処理
		for(int i = 0; i < mk_data.length; i++) {
			// 1個ずつインスタンスする
			mk_data[i] = new MakeData();
			
			// 100個の配列に「Hello」を格納する
			mk_data[i].insert_hello();
			
			// インスタンス1000個ごとに空き容量を出力
			if((i + 1 ) % 1000 == 0) {
				System.out.println("--------------");
				System.out.println("インスタンス数:" + (i + 1));
				System.out.println("空き容量:" + 
						Runtime.getRuntime().freeMemory());
			}
		}
	}
	
}

■実行結果

・実行前とクラスを10000個インスタントした際の空き容量の差は「4470192」バイトである。
すなわち、「4470192」使用していることがわかる。

開始前空き容量:134766080
--------------
インスタンス数:1000
空き容量:134262784
--------------
インスタンス数:2000
空き容量:133987696
--------------
インスタンス数:3000
空き容量:133441616
--------------
インスタンス数:4000
空き容量:132939120
--------------
インスタンス数:5000
空き容量:132666080
--------------
インスタンス数:6000
空き容量:132165632
--------------
インスタンス数:7000
空き容量:131617504
--------------
インスタンス数:8000
空き容量:131344464
--------------
インスタンス数:9000
空き容量:130841968
--------------
インスタンス数:10000
空き容量:130295888
タイトルとURLをコピーしました