使用ThreadPool的System.OutOfMemoryException

时间:2016-01-25 12:57:28

标签: c# multithreading out-of-memory threadpool

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

首先,我在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位”,一切都会顺利进行。我一直在寻找任何解释可能限制的文档,但我没有找到任何限制。

2 个答案:

答案 0 :(得分:2)

您似乎正在使用64位操作系统。

使用&#34;任何CPU&#34;进行编译时和#34;喜欢32位&#34;设置已打开。然后,即使操作系统是64位,该过程也将以32位进程执行。

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

取消选中&#34;首选32位&#34;设置,该过程将作为64位进程运行。这为您提供了8 TB的虚拟地址空间。

答案 1 :(得分:0)

你没有处置你的HashAlgorithm实例,所以他们可能会围着消耗内存。

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