メモリ領域とガベージコレクション

PG基礎

0. はじめに

プログラムのメモリ領域とガベージコレクションについてまとめました。

1. メモリ領域の種類

プログラム実行時のメモリ領域は「静的領域」「ヒープ領域」「スタック領域」に分類される。

1-1. 静的領域

格納する情報

  • グローバル変数やプログラムの命令、クラス情報など

格納するタイミング

  • C++では、アプリケーション開始時に全てのクラス情報を一括格納する。
    • メリット・・・プログラムの動作によって変化しないため、実行性能が良い。
    • デメリット・・・メモリ使用量が大きくなる。
  • Javaや.NETでは、クラスが必要となった時点で逐次格納する。そのため、静的領域ではなくメソッドエリアと呼ばれることが多い。
    • メリット・・・新しいクラスを読み込む度にオーバーヘッドが発生するため、実行性能が悪くなる。
    • デメリット・・・メモリ使用量を減らすことができる。

1-2. ヒープ領域

格納する情報

  • 生成したインスタンスなど。

格納するタイミング

  • プログラムの実行時。

1-3. スタック領域

格納する情報

  • メソッドの引数、ローカル変数、戻り値など。

格納するタイミング

  • メソッド呼び出し時。

2. ガベージコレクション

  • ヒープ領域のインスタンスが不要になったら自動で解放する仕組み。
  • ガーベッジコレクタがというプログラムが制御を行う。
  • プログラミング言語(Javaの場合、Java VM)が提供する。
  • 自動で解放するとはいえ、一時的に数万~といった大量のインスタンスを作った場合は、当然メモリを大きく消費するので注意。
  • 削除対象となるのは、静的領域、ヒープ領域から辿れない、孤立したインスタンス。

3. 参考文献