はい、各スレッドには独自のスタックがあります。それは難しいことですが、スタックは、メソッドが終了した後にどこを返すかを追跡し、戻りアドレスを格納します。各スレッドは独自のコードを実行するため、独自のスタックが必要です。ローカル変数とメソッド引数もそこに格納されており、(通常は)スレッドセーフです。
ヒープ数は、より詳細に関係しています。ガベージコレクションされたヒープの数は1です。実装の観点からは完全に正しいわけではありません.3つの世代ヒープとラージ・オブジェクト・ヒープは、論理的に異なるヒープであり、最大4つまで追加します。この実装の詳細は、あまりに多く割り当てると問題になります。
管理対象コードで完全に無視できないもう1つは、静的変数を格納するヒープです。これはAppDomainに関連付けられており、静的変数はAppDomainの存続期間中存続します。一般に、.NETの文献では「ローダーヒープ」と呼ばれています。実際には3つのヒープ(高頻度、低頻度、スタブヒープ)で構成されています。ジッタコードとタイプデータもそこに保存されていますが、それは根強さを増しています。
さらに、無視リストの下には、ネイティブコードで使用されるヒープがあります。そのうちの2つはマーシャルクラスから容易に見える。デフォルトのプロセスヒープがあり、そこからWindowsが割り当てられます。Marshal.AllocHGlobal()も同様です。また、COMがデータを格納する別のヒープがあり、Marshal.AllocCoTaskMem()はそれを割り当てます。最後に、相互運用するネイティブコードには、ランタイムサポートのための独自のヒープがあります。この種のコードで使用されるヒープの数は、プロセスにロードされるネイティブDLLの数によってのみ制限されます。これらのヒープはすべて存在し、あなたはそれらを直接扱うことはほとんどありません。
したがって、最小10ヒープ。
優れたリンクをお寄せいただきありがとうございます。 – Richard