繁体   English   中英

除非我执行GC.Collect,否则运行x86 .NET应用程序的Windows 7 x64将耗尽内存。

[英]Windows 7 x64 running a x86 .NET app will throw Out of memory unless I do GC.Collect

我已经找到了解决方案,但是这种行为令人担忧,并以为我在这里问是否有人也看到过。

基本上,除非我强制使用GC.Collect(),否则固定在x64 Windows 7中运行的x86中内置的相同二进制文件(将在下面解释原因)将泄漏。

解释:

  1. 该应用程序执行大量位图渲染(> 60 per / sec)
  2. 有一个外部C ++ dll(托管C ++)
  3. 有两个线程(worker和ui)
  4. UI刷新(统计信息)
  5. 此行为仅在此计算机上发生,Windows 7 x86可以正常运行。

该应用程序将增长到超过1.5G,并最终抛出“内存不足”异常。 速度越快(1),异常处理就越快。

对于那些准备拍摄(2)引起泄漏的,我做了测试取出和泄漏仍然是内存得到释放的罚款,如果我这样做GC.Collect的(),这在我的书是一个.NET的问题。

谢谢。

您是否正确处理了位图-以及包括GDI +对象在内的所有其他一次性资源?

using(Bitmap bitmap = ...)
{
    ... do your stuff
}

您需要查看您的应用程序才能发现问题-显然,对于32位应用程序,1.5 GB过多。 在具有不同操作系统的不同计算机上获得不同行为的事实并不意味着您应该将操作系统归咎于此。

您可以尝试不那么依赖垃圾收集器。 如果重写绘图代码以清理未使用的资源,则可能不会遇到上述情况。

Image.Dispose()

注意在释放对图像的最后引用之前,请始终致电Dispose。 否则,除非垃圾回收器调用Image对象的Finalize方法,否则不会释放正在使用的资源。

停止使用位图时,必须对其进行.Dispose()。 即使您没有显式调用.Dispose(),GC最终也会收集该内存(运行终结器时)-但是,GC并不是解决内存过度分配的灵丹妙药,如果您这样做速度更快,则GC可以使用GC无法直接控制的资源来收集它们(非托管资源正是这样)-GC机制无法为您提供帮助。

通过调用GC.Collect(0),您将强制GC处理对象树并调用所有终结器,如果您不调用它,则GC会在认为合适的时候运行,到那时为时已晚(由于高分配率)。

好吧,这是值得的,这是我的收获。

我已经看到了您遇到的同一问题 它回到.NET 2.0,但是我正在处理大图像,尽管我会处理这些图像 ,但是内存消耗会增加-直到我手动调用GC.Collect()为止。

还有什么相似之处? 托管! 我的应用程序是一个不受管理的EXE,它将使用COM创建一个对象,该对象是暴露给COM的.NET类。 这将导致非托管EXE承载CLR。

在Windows X64上,X32应用程序将以WOW (Windows上的Windows)模式加载,这是一个类似的主机,我相信它可能会出现类似的问题 在托管环境中, GC似乎无法完全理解内存消耗。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM