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);
}
我不明白的是为什么如果我 运行 我的代码使用
- 平台目标:任何CPU
- 首选 32 位检查
我在第 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);
}
我在 运行 编写一些非常简单的代码时遇到意外行为。
首先,我在 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);
}
我不明白的是为什么如果我 运行 我的代码使用
- 平台目标:任何CPU
- 首选 32 位检查
我在第 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);
}