Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 运行测试时特定计算机上的OutOfMemoryException_C#_.net_Out Of Memory_Gdi_Handles - Fatal编程技术网

C# 运行测试时特定计算机上的OutOfMemoryException

C# 运行测试时特定计算机上的OutOfMemoryException,c#,.net,out-of-memory,gdi,handles,C#,.net,Out Of Memory,Gdi,Handles,我们对NUnit测试进行了测试,这些测试在特定机器上出现OutOfMemory异常 经过调查,这似乎不是内存问题,而是句柄问题(我们分配了太多位图对象,而没有释放它们) 问题是,这在一台特定的机器上运行良好,而在另一台机器上由于此错误而失败 出现故障的计算机是具有Windows7 x64(6 GB ram)的Hyper-V虚拟机 工作机器是物理机器Windows XP(2 GB ram) 我知道最好的解决方案是清理代码以处理任何位图对象,但我想知道为什么这两台机器在执行相同代码时行为不同?阅读以

我们对NUnit测试进行了测试,这些测试在特定机器上出现OutOfMemory异常

经过调查,这似乎不是内存问题,而是句柄问题(我们分配了太多位图对象,而没有释放它们)

问题是,这在一台特定的机器上运行良好,而在另一台机器上由于此错误而失败

  • 出现故障的计算机是具有Windows7 x64(6 GB ram)的Hyper-V虚拟机
  • 工作机器是物理机器Windows XP(2 GB ram)
  • 我知道最好的解决方案是清理代码以处理任何位图对象,但我想知道为什么这两台机器在执行相同代码时行为不同?

    阅读以下内容:


    您将发现不同版本的Windows在GDI堆方面的差异表。简短回答:XP=3Mb限制,Win7R2x64=20Mb限制。可用RAM不重要,这些都是硬限制。

    这不太可能,Windows允许您在对程序的行为方式感到不安并拒绝让您分配更多之前泄漏10000个句柄。到那时,位图中的像素数据已经消耗了大量虚拟内存空间。存储在非托管内存中,垃圾收集器不知道它。除非调用Dispose()或垃圾收集器通过运行终结器来处理,否则不会释放的VM空间

    GC通常不会完成任务,位图类是一个非常小的对象,不足以单独触发GC。你必须分配大约60000个来触发GC。除非位图非常小,否则将首先耗尽VM空间,然后再处理。调用Dispose()是可选的,但这对于位图来说不再是可选的,因为终结器无法及时完成任务


    RAM的数量与此无关,一个.NET程序总是轰炸它,无法在VM地址空间中找到一个足够大的洞来满足请求的大小。位图也有一个问题,它们往往需要大洞。只需要在一个笨拙的基址加载一个DLL,就可以将一个漂亮的大洞一分为二。否则问题很容易解决,只需将程序的目标平台设置为AnyCPU即可。测试程序具有相应的配置值。在那台Win7机器上工作。当然,这不是跳过Dispose()调用的有效理由。

    嗯,.NET framework可能是相同的,但底层操作系统不是。位图等资源仍由操作系统处理。Windows 7处理资源的方式与Windows XP不同,因此在不同版本的Windows上得到不同的结果也就不足为奇了。Windows拒绝再发布之前可能泄漏的句柄数是可配置的。也许其中一台机器的配置不同。谢谢@eric。你知道这可以从哪里控制吗?@麦角酸:这是一个问答网站。把这个问题当作一个问题来问!这与事实不符,在XP上它不会崩溃,在Win7上它会崩溃:(可以发誓你的情况与现在相反