🖼️

【図示】プログラムのメモリアーキテクチャ

に公開

図示: プログラムのメモリアーキテクチャ

プログラムのメモリアーキテクチャについて図示してみました

プログラムの要素

プログラムは以下のコンポーネントで構成されています:TEXT/Data/BSS、ヒープ、スタックなど
「プログラムは以下の要素で構成されている:TEXT/Data/BSS、ヒープ、スタックなど」
※TEXT=プログラムコード、Data/BSS=グローバル変数

スレッドごとに独立したスタック領域が割り当てられるため、
スレッド数が増えると、プログラム全体で必要となるスタックメモリの総量も増加する

動的か静的か

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

ヒープ内の使われ方

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

OOMの原因:ヒープの枯渇

OOMは、多くの場合ヒープの枯渇によって引き起こされる
「OOMは、多くの場合ヒープの枯渇によって引き起こされる」
OOM=Out Of Memory

OOMでヒープが枯渇するのはこのような場合

  • 使われなくなったメモリを回収するGCの処理が間に合わない
  • メモリへの参照が残り続ける(メモリリーク)のためGCで回収されないものが積み上げられた結果
  • 多くの処理でヒープを同時に使っていて容量不足になっている

スタックオーバーフロー:スタックの枯渇

スタックオーバーフローは、スタックの枯渇によって引き起こされる
「スタックオーバーフローは、スタックの枯渇によって引き起こされる」

スタックオーバーフローが起きるのはこのような場合

  • 再帰呼び出しが深い
  • 大きなローカル変数がある

Discussion