内容
メモリに関する知識をメモ書きしています。
今までメモリに関して雑な理解しかしていなかったので、理解を深める意図で纏めます。
静的なメモリ管理
コンパイル時にメモリの割り当てや解放が決定され、実行時には変化しないメモリ管理のことを指す。
スタック領域
静的なメモリ管理によって割り当てられるメモリ領域。
関数の呼び出しやローカル変数の保存などに使用される。
関数が呼び出されるたびにその関数のためのスタックフレームがスタックにプッシュされる。
関数が終了すると、そのスタックフレームがポップされてスタックが縮小される。
スタック領域は比較的小さなサイズであり、スタックオーバーフローが発生する可能性がある。
スタックオーバーフロー
スタック領域が限界に達すると発生するエラー。
スタックオーバーフローは、再帰関数の深さが深すぎる場合や、無限ループが発生した場合に起こる事がある。
大きなデータ構造をスタックに確保しようとする場合なども、スタックオーバーフローの原因となる。
動的なメモリ管理
プログラム実行中に必要なメモリを動的に割り当てたり、解放する方法。
ヒープ領域
動的なメモリ管理によって割り当てられるメモリ領域。
ヒープ領域はソフトウェア側が自由に確保、解放することができる。
プログラムの実行時には、OSからソフトウェアに対して一定量のヒープ領域が与えられる。
ヒープ領域はメモリフラグメンテーション(空き領域が分断されること)が起こりやすく、不適切な使用方法によりメモリリークが発生する可能性がある。
メモリリーク
参照型の変数がヒープ上のオブジェクトを指すが、そのオブジェクトへの参照がなくなった場合に、適切に解放されずにメモリリークが発生する。
メモリ枯渇
ヒープ領域で使いたいメモリが枯渇してプログラムが異常終了する状態。
ガベージコレクション
どの変数からも参照されていないオブジェクトやメモリリークなどを検出し、それらを解放してメモリを効率的に管理する仕組み。
ヒープ領域で行われる。
値型と参照型のメモリの使い方の違い
値型
値型のローカル変数は、スタック上に割り当てられる。
値型のローカル変数は、その値そのものが格納される。
ローカル変数がスコープを抜けると自動的にメモリが解放される。
値型のフィールド(クラスのメンバ変数)はヒープ上に格納される場合もある。
参照型
参照型の変数は、スタック上に割り当てられる。
スタック上の変数は、ヒープ上のオブジェクトへのアドレスを持つ。
実際の値はヒープ領域に格納される。
つまり、参照型の変数自体はスタック上にあるが、実際のデータはヒープ上にある。
オブジェクトが削除されるまでメモリを占有し続ける。