【发布时间】:2014-12-13 12:35:21
【问题描述】:
我曾多次开发过具有非常大的小对象(每个小于 1kb)的分支或链接结构的应用程序,要么 1)简单地创建对象,要么 2)创建和访问它们。
在这两种情况下,一旦我们用完物理可用的 RAM,应用程序要么完全停止,要么直接抛出 OutOfMemory。
我的理解是,一旦物理 RAM 用完,就会发生分页,虽然速度很慢,但程序应该继续工作。特别是我既没有尝试分配大对象,也没有使用超过 2g 对象的数组(或列表)(我不确定这个限制现在是否仍然适用)。
我写了一个小测试程序,它连续分配和存储 1GB 的内存块。由于 .NET 似乎延迟了分配,所以我也用数据填充了这些块。我发现一旦 RAM 用完,.NET 会正确地分页到磁盘,并且程序变得明显变慢,但从未崩溃或 OOM-ed。
那么,为什么 .NET 似乎在处理大量小对象时会遇到问题?这是我的配置所特有的吗?
【问题讨论】:
-
您确定您的对象总数不超过 2GB?限制不是“一个列表可以有 2GB 的对象”,而是"A 32 bit process can only have 2 to 3GB of virtual address space allocated to it total"。那将是 2,000,000 个 1kb 对象的硬性限制。尽管由于进程中所有其余对象的内存开销,您更有可能远低于该数字。在您的程序上运行分析器以查看您正在使用多少对象和多少内存。
-
将其设为 64 位进程并查看进程的私有字节计数器。还要查看系统提交费用(100% 分配失败)和物理使用情况(大致表明分页开始发生的时间)。
-
这是一个 64 位进程。
-
@usr 我会检查值
标签: .net memory out-of-memory