🖼️
【図示】プログラムのメモリアーキテクチャ
図示: プログラムのメモリアーキテクチャ
プログラムのメモリアーキテクチャについて図示してみました
プログラムの要素

「プログラムは以下の要素で構成されている:TEXT/Data/BSS、ヒープ、スタックなど」
※TEXT=プログラムコード、Data/BSS=グローバル変数
スレッドごとに独立したスタック領域が割り当てられるため、
スレッド数が増えると、プログラム全体で必要となるスタックメモリの総量も増加する
動的か静的か

「コンパイル時に、Text/Data/BSS領域は静的に割り当てらる」
スライドが間違っていて、ヒープとスタックのMAXSIZEはコンパイル時に決まりません。
ヒープ内の使われ方

「ヒープメモリは、プログラム実行中に動的に割り当てられる」
関数はスタックに積まれるが、内部でヒープが使われることも普通にある
OOMの原因:ヒープの枯渇

「OOMは、多くの場合ヒープの枯渇によって引き起こされる」
OOM=Out Of Memory
OOMでヒープが枯渇するのはこのような場合
- 使われなくなったメモリを回収するGCの処理が間に合わない
- メモリへの参照が残り続ける(メモリリーク)のためGCで回収されないものが積み上げられた結果
- 多くの処理でヒープを同時に使っていて容量不足になっている
スタックオーバーフロー:スタックの枯渇

「スタックオーバーフローは、スタックの枯渇によって引き起こされる」
スタックオーバーフローが起きるのはこのような場合
- 再帰呼び出しが深い
- 大きなローカル変数がある
Discussion