c# - 默认堆栈大小在 .NET 3.5 和 4.x 之间变化?

标签 c# .net winapi

<分区>

考虑以下示例:

 static void DoNothing()
 {
     signal.WaitOne();
 }

 static void Main(string[] args)
 {
     signal = new ManualResetEvent(false);
     List<Thread> threads = new List<Thread>();
     try
     {
         while (true)
         {
             Console.WriteLine($"{threads.Count}, Memory:{Process.GetCurrentProcess().PrivateMemorySize64 / (1024 * 1024)}");
             var thread = new Thread(DoNothing);
             thread.Start();
             threads.Add(thread);
         }
     }
     catch (OutOfMemoryException)
     {
         Console.WriteLine($"Out of memory at: {threads.Count}");
         signal.Set();
     }
     threads.ForEach(t => t.Join());
     Console.WriteLine("Finished.");
     Console.ReadLine();
 }

代码被编译为 32 位进程。

我发现它在为 .NET 3.5 和 4.x 编译时表现不同。我只更改了 Target 框架的版本。

为 NET 3.5 编译时,内存大约耗尽。每个线程创建 1 MB。这是预期的,因为默认堆栈大小为 1MB ( https://msdn.microsoft.com/en-us/library/windows/desktop/ms686774(v=vs.85).aspx )

但是,当为 .NET 4.x 编译时,内存消耗的速度约为。每个线程创建 100KB,即 1MB 的 1/10。

默认堆栈大小在 .NET 3.5 和 4.x 之间是否发生了变化?

我是在Windows 10上做实验,会不会和Windows版本有关?

最佳答案

与此同时,我找到了答案。

堆栈大小没有变化,所有版本都是 1 MB。

改变的显然是内存的提交方式。在 .NET 4.x 中,每个堆栈似乎只有 100K 实际被提交(即消耗,更多信息可以在 Tomes of Wisdom 中找到)。其余的只是保留以备日后实际需要时使用。无论框架版本如何,该应用程序仍会丢失 1MB 的虚拟内存并在创建大约 1450 个线程时崩溃。

感谢Hans Passant提示: https://stackoverflow.com/a/28658130/383426

关于c# - 默认堆栈大小在 .NET 3.5 和 4.x 之间变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41101798/

相关文章:

c# - IronPython 可以向 C# 类动态添加方法吗?

c# - WPF,Caliburn.Micro和Dapper组合框

C#,将数组作为函数参数传递

java - 我可以使用隐藏字段在 java 和 dot net Web 应用程序之间传递数据吗?

c++ - Windows XP 用户文件夹的 CSIDL 常量

windows - Windows 服务可以接收 Windows 消息吗?

c# - Html 敏捷包不加载 url

c# - 将数据的详细信息分组为一个,价格字段应该用分号分隔

windows - 打开主菜单总是模态操作吗?

C# 和 Zip 文件操作