我有一个相当大、相当简单的数组,它跟踪 750,000 个条目。在 64 位 .NET 中它工作正常;但是在 32 位客户端上它失败并出现 OutOfMemory
异常。我知道我没有用完内存。需要此程序的客户端,不能使用64位版本。
以下伪代码编译(编辑:原始代码由于拼写错误未编译,已修复)并且在定位时抛出相同的异常x86 架构,在两台机器上:
- Windows XP,32 位机器,运行 4 GB RAM 和 .NET Framework 4
- 一台 Windows 7 64 位机器,运行 8 GB RAM 和 .NET Framework 4
编辑:将编译器标志切换为显式以针对 x64 架构使其能够在 Windows 7 64 位计算机上运行。
using System;
public class Storage
{
Storage futureStorage;
int count;
int years;
bool isTest;
bool isSet;
}
public static class Program
{
public static void Main()
{
Storage[] storageArray = new Storage[750000];
for (int i = 0; i < 750000; i++)
{
storageArray[i] = new Storage();
}
}
}
编辑:
这段代码运行的网络是一个封闭的网络,没有外部网络连接,所以发布更准确的代码和相关的异常细节是我正在处理的一个过程。我确实在运行 intellitrace,带有完整的调试符号和一些编译器开关,更多细节将在我将它移植到互联网连接网络后立即跟进。
在两台机器上,代码在索引 693,000 左右爆炸(确切地说,在 XP 上为 693,002,在 Windows 7 上为 693,646)。
有人对问题可能有什么想法吗?当我在代码之后进行转储和分析时,我几乎没有使用 25 MB 的 RAM。
如果它给我带来任何好处,我会切换到不安全/非托管,但我所做的唯一尝试使我无法使用我的存储类。
更新:
似乎有几个人无法重现这个问题(包括我自己在不同的机器/网络上)。
但是,我想出了一个解决方案(使用 LINQ)来缓解这个问题,它现在只抛出 1/5 次左右的异常,任何人都知道在使用这个解决方案时我是否应该注意任何问题或注意事项,以及为什么与另一个相比它在内部可能有效?
using System;
using System.Linq;
public class Storage
{
Storage futureStorage;
int count;
int years;
bool isTest;
bool isSet;
}
public static class Program
{
public IEnumerable<Storage> storageEnumerable;
public static void Main()
{
storageEnumerable = (from x in Enumerable.Range(0, 750000) select new Storage() {count = x});
foreach (Storage s in storageEnumerable)
Console.WriteLine(x);
}
}
上面的LINQ代码使用的内存少了很多,但是还是会出现异常;并且只在该网络中的机器上,而不是在网络外的其他机器上(或在 IIS 应用程序池内)。
考虑到其他用户已经报告无法重现该错误,这似乎可能是环境或硬件特定的。是否有网络监控工具或防病毒程序触发这两个代码实现?如果是这样,是否有更好/推荐的方法来初始化数组以避免这种情况?
最佳答案
关于c# - 简单的 C# 数组抛出 OutOfMemory 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8481937/