■スタックとヒープ
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回) | 【コンソール】 インスタンス数 空き容量 |
■サンプルコード
// 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
コメント