メモリ領域とガベージコレクション
PG基礎
0. はじめに
プログラムのメモリ領域とガベージコレクションについてまとめました。
1. メモリ領域の種類
プログラム実行時のメモリ領域は「静的領域」「ヒープ領域」「スタック領域」に分類される。
1-1. 静的領域
格納する情報
- グローバル変数やプログラムの命令、クラス情報など
格納するタイミング
- C++では、アプリケーション開始時に全てのクラス情報を一括格納する。
- メリット・・・プログラムの動作によって変化しないため、実行性能が良い。
- デメリット・・・メモリ使用量が大きくなる。
- Javaや.NETでは、クラスが必要となった時点で逐次格納する。そのため、静的領域ではなくメソッドエリアと呼ばれることが多い。
- メリット・・・新しいクラスを読み込む度にオーバーヘッドが発生するため、実行性能が悪くなる。
- デメリット・・・メモリ使用量を減らすことができる。
1-2. ヒープ領域
格納する情報
- 生成したインスタンスなど。
格納するタイミング
- プログラムの実行時。
1-3. スタック領域
格納する情報
- メソッドの引数、ローカル変数、戻り値など。
格納するタイミング
- メソッド呼び出し時。
2. ガベージコレクション
- ヒープ領域のインスタンスが不要になったら自動で解放する仕組み。
- ガーベッジコレクタがというプログラムが制御を行う。
- プログラミング言語(Javaの場合、Java VM)が提供する。
- 自動で解放するとはいえ、一時的に数万~といった大量のインスタンスを作った場合は、当然メモリを大きく消費するので注意。
- 削除対象となるのは、静的領域、ヒープ領域から辿れない、孤立したインスタンス。