【发布时间】:2011-06-10 01:04:09
【问题描述】:
我的小型压力测试在循环中分配随机长度数组(每个 100..200MB),在 64 位 Win7 机器和 32 位 XP(在 VM 中)上显示不同的行为。两个系统通常首先分配尽可能多的数组以适合 LOH。然后 LOH 变得越来越大,直到可用的虚拟地址空间被填满。到目前为止的预期行为。但是,根据进一步的请求,两者的行为不同:
虽然在 Win7 上抛出了 OutOfMemoryException (OOM),但在 XP 上,堆似乎增加了,甚至交换到了磁盘 - 至少没有抛出 OOM。 (不知道,这是否与 XP 在虚拟框中运行有关。)
问题: 运行时(或操作系统?)如何决定,对于托管内存分配请求,如果它太大而无法分配,是否会生成 OOM 或大型对象堆正在增加 - 最终甚至交换到磁盘? 如果被交换,OOM 是什么时候发生的呢?
IMO 这个问题对所有生产环境都很重要,可能会处理更大的数据集。不知何故,知道系统宁愿在这种情况下(通过交换)显着减慢速度而不是简单地抛出 OOM 感觉更“安全”。至少,它应该是确定性的,对吧?
@Edit:该应用程序是 32 位应用程序,因此在 Win 7 上以 32 位模式运行。
【问题讨论】:
-
“直到物理地址空间”不是指那个进程的虚拟地址空间吗?
-
您的程序设置为 AnyCPU 还是 32BitOnly? 64 位程序中的内存不足应该不会轻易发生。我希望计算机在此之前很久就会由于过度交换而停止运行。
-
你是对的:“虚拟地址空间”的意思。是的,程序编译成 32 位应用程序,在 Win7 上运行 WOW。
标签: c# .net out-of-memory heap-memory swap