我在运行一些非常简单的代码时遇到了意外行为。
首先,我在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);
}
我不明白为什么如果我使用
运行我的代码在第3次或第4次分配byte []缓冲区后,我得到一个System.OutOfMemoryException
如果我取消选中“首选32位”,一切都会顺利进行。我一直在寻找任何解释可能限制的文档,但我没有找到任何限制。
答案 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);
}