「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
- スタック・オーバーフローはなぜ起きるのか?
と言えば、OSが確保したスレッドのスタックが、
再帰呼出し等によって、領域超過を起こすため。
- 各関数のスタック・フレームが
- 引数、戻り値、ローカル変数
- 戻り先の呼出し元へのポインタ
積まれることになる。
詳細 †
基礎 †
基本的に1スレッド1MBのメモリ(アドレス空間)を消費する。
スレッドのスタックのメモリ予約・確保については、
- OSがスレッド作成時にスタックを予約する(基本1MB)。
- OSが関数呼び出しの際にスタックを積む(コミット)。
という動作になる。ユーザによる制御は不要。
スタックの最上位のページは既にコミットされており、
スタックに最上位まで積まれ二重にコミットしようとした
場合にスタックオーバーフローという例外が発生する。
スタックの成長はメモリの成長とは(アドレス空間から)逆方向になる。
- メモリの成長 : 0 ---> 4GB(16TB) の方向
- スタックの成長 : 4GB(16TB)---> 0 の方向
※ 関数の呼び出し規則によって積まれ方の詳細は若干は違う。
スタック・サイズの変更 †
- /STACKのリンカ・オプションで予約サイズなどを変更可能。
IIS上でのスタック・サイズ †
IIS上ではスタック・サイズが小さいらしい。
Tags: :Windows, :メモリ管理, :障害対応, :性能, :デバッグ