『プログラム』が実行されるときに『メモリ』はどう使われているか-Javaの場合
ソフトウェアを開発するに当たって、プログラムが実行されるときにメモリがどのように使われているのかを知るのは非常に大事なことと思われます。
今回はJava:意外と教わる機会の少ないメモリ管理のお話で学習したことの覚え書きです。
メモリ空間について
Java仮想マシン上では、プログラムは以下の三つのメモリ空間で実行される。
- スタック領域
- ヒープ領域
- パーマネント領域
スタック領域
実際に処理されるデータを格納する領域です。名前の通り、処理対象のデータはFILO(先入れ後出し)方式でデータを管理し、処理が完了したデータはスタックから破棄されます。
ローカル変数はここに展開される。
ローカル変数とはメソッドやメソッド内のfor、if等のスコープで定義される変数のことで、スタック変数とも呼ばれます。
ヒープ領域
必要な時に、必要なサイズを指定して領域が確保できる自由度の高いメモリ領域です。ただし、確保したメモリは必ず解放する必要があります。
クラスのインスタンスはここに展開される。
スタックと比べて領域が大きく、自由に使うことができる。
パーマネント領域
クラスはここに展開される。クラス変数(static)はここで管理される(実体はヒープ領域)。
一般的なコンピュータシステムにおけるスタティック領域とプログラム領域の二つの役割を兼ねる役割を持っている。
スタティック領域
静的領域とも呼ばれ、プログラムの開始から終了までメモリ空間は保持し続けられる特徴をもっています。
プログラム領域
プログラムの実行コードそのものが保管される場所となります。
まとめ(かたつむりはこう思った)
ローカル変数、メンバー変数、クラス変数の寿命がその展開されているメモリ領域に見事に対応していることに感動しました。