System.OutOfMemoryException 使用线程池

System.OutOfMemoryException using ThreadPool

我在 运行 编写一些非常简单的代码时遇到意外行为。

首先,我在 i7-4770 CPU 上使用 Visual Studio 2015,32Gb 内存(22,6 免费)

我的示例代码:

        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);

        }

我不明白的是为什么如果我 运行 我的代码使用

我在第 3 次或第 4 次分配 byte[] 缓冲区后得到 System.OutOfMemoryException

如果我取消选中 "Prefer 32-bit",一切都会顺利进行。我在谷歌上四处寻找任何解释可能的限制的文档,但我没有找到任何文档。

看来您正在使用 64 位OS。

当您使用 "Any CPU" 编译并且 "Prefer 32-bit" 设置打开时。然后进程将作为 32 位进程执行,即使 OS 是 64 位。

32 位进程可以有一个大小为 2GB 的虚拟地址 space(使用 LARGEADDRESSAWARE 设置可以是 4GB)。这比您申请 运行 所需的要少得多。您的应用程序似乎分配了大约 10GB,加密 API 也会消耗一些内存。

当您取消选中 "Prefer 32-bit" 设置时,该进程将 运行 作为 64 位进程。这为您提供了一个 8 TB 的虚拟地址 space。

您没有处理 HashAlgorithm 实例,因此它们可能一直在消耗内存。

//...
using(var ha = System.Security.Cryptography.SHA1.Create())
{
    ha.ComputeHash(data);
}