「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>仮想メモリ管理]]

* 目次 [#d312e77a]
#contents

*概要 [#yb9ceb34]
-スタック・オーバーフローはなぜ起きるのか?~
と言えば、OSが確保したスレッドのスタックが、~
再帰呼出し等によって、領域超過を起こすため。

-スレッドのスタックには、

--各関数のスタック・フレームが
---引数、戻り値、ローカル変数
---戻り先の呼出し元へのポインタ

--各関数の呼出し履歴分

>積まれることになる。

*詳細 [#eacb9c3e]

**基礎 [#rdffbdda]
基本的に1スレッド1MBのメモリ(アドレス空間)を消費する。

スレッドのスタックのメモリ予約・確保については、
-OSがスレッド作成時にスタックを予約する(基本1MB)。
-OSが関数呼び出しの際にスタックを積む(コミット)。

という動作になる。ユーザによる制御は不要。

スタックの最上位のページは既にコミットされており、~
スタックに最上位まで積まれ二重にコミットしようとした~
場合にスタックオーバーフローという例外が発生する。

スタックの成長はメモリの成長とは(アドレス空間から)逆方向になる。
-メモリの成長 : 0 ---> 4GB(16TB) の方向
-スタックの成長 : 4GB(16TB)---> 0 の方向

※ 関数の呼び出し規則によって積まれ方の詳細は若干は違う。

**スタック・サイズの変更 [#r85913bc]
-/STACKのリンカ・オプションで予約サイズなどを変更可能。

-EDITBINツールを使用して変更可能
--C#(WPF)アプリのスタックサイズの変更方法 - Qiita~
https://qiita.com/hiroed1218/items/d2caf33378961b02ec9e

--Stack sizes in IIS – affects ASP.NET – ASP.NET Debugging~
https://blogs.msdn.microsoft.com/tom/2008/03/31/stack-sizes-in-iis-affects-asp-net/

**IISのスタック [#x0341f29]
サイズが小さいらしい。
**IIS上でのスタック・サイズ [#x0341f29]
IIS上ではスタック・サイズが小さいらしい。

-Issue #341 · OpenTouryoProject/OpenTouryo~
Change the implementation of recursion to loop for suppress stack overflow in BaseDam.~
https://github.com/OpenTouryoProject/OpenTouryo/issues/341

----
Tags: [[:Windows]], [[:メモリ管理]], [[:障害対応]], [[:性能]], [[:デバッグ]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS