System.OutOfMemoryException using ThreadPool
本文关键字:ThreadPool using OutOfMemoryException System | 更新日期: 2023-09-27 18:31:50
我在运行一些非常简单的代码时遇到了意外的行为。
首先,我在i7-4770 CPU,32Gb内存(22,6免费)上使用Visual Studio 2015
我的示例代码:
int length = 10;
for (int i = 0; i < length; i++)
{
int j = i;
//ThreadPool.QueueUserWorkItem(ThreadProc_CLR, j);
Task.Factory.StartNew(() => { ThreadProc_CLR(j); });
}
public void ThreadProc_CLR(object parameter)
{
int i = Convert.ToInt32(parameter);
byte[] data = new byte[1000000000];
new Random().NextBytes(data);
System.Security.Cryptography.SHA1.Create().ComputeHash(data);
}
我不明白的是,为什么如果我使用
- 平台目标:任何 CPU
- 首选 32 位检查
我在第 3 次或第 4 次分配 byte[] 缓冲区后得到一个 System.OutOfMemoryException
如果我取消选中"首选 32 位",一切顺利。我已经在谷歌上搜索任何解释可能限制的文档,但我没有找到任何文档。
您似乎正在 64 位操作系统上工作。
当您使用"任何 CPU"进行编译并且"首选 32 位"设置处于打开状态时。然后,即使操作系统是 64 位,该进程也将作为 32 位进程执行。
32 位进程可以具有大小为 2GB 的虚拟地址空间(使用 LARGEADDRESSAWARE 设置可以是 4GB)。这比运行应用程序所需的要少得多。您的应用程序似乎分配了大约 10GB,并且加密 API 也将消耗一些内存。
取消选中"首选 32 位"设置时,该进程将作为 64 位进程运行。这为您提供了 8 TB 的虚拟地址空间。
您没有释放 HashAlgorithm 实例,因此它们可能会占用内存。
//...
using(var ha = System.Security.Cryptography.SHA1.Create())
{
ha.ComputeHash(data);
}