首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行x86 .NET应用程序的Windows 7.NET应用程序将从内存中抛出,除非我使用GC.Collect

运行x86 .NET应用程序的Windows 7.NET应用程序将从内存中抛出,除非我使用GC.Collect
EN

Stack Overflow用户
提问于 2011-04-07 11:13:27
回答 4查看 1.1K关注 0票数 1

我已经找到了解决办法,但这种行为非常令人担忧,我想我在这里问是否还有其他人也看到了。

基本上,除非强制使用x86 (),否则运行在x64 Windows 7中的相同二进制文件(将解释为什么在x64 Windows 7中运行)将泄漏。

解释:

  1. 应用程序进行大量的位图绘制(>60 /秒)
  2. 有一个外部C++ dll (托管C++)
  3. 有两个线程(worker和ui)
  4. 有UI刷新(统计)
  5. 这种行为只发生在这台机器上,Windows7 x86很好地运行它。

应用程序将增长到超过1.5G,并最终抛出内存不足异常。(1)工作越快,异常越快。

对于那些准备射击(2)导致泄漏的人,我确实测试了删除它,泄漏仍然是+,如果我执行GC.Collect(),内存就会很好地释放,这在我的书中是一个.NET问题。

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-07 11:37:52

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

我看过和你所经历的完全一样的问题。它回到了.NET 2.0版本,但我正在处理大图像,虽然我会处理这些图像,但是内存消耗会上升--直到我手动调用GC.Collect()

还有什么相似之处?主持!我的应用程序是一个非托管EXE,它将使用COM创建一个对象,该对象是一个向COM公开的.NET类。这将导致非托管EXE承载CLR。

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

票数 0
EN

Stack Overflow用户

发布于 2011-04-07 11:19:58

您是否正确地配置了位图和包括GDI+对象在内的所有其他一次性资源?

代码语言:javascript
复制
using(Bitmap bitmap = ...)
{
    ... do your stuff
}

您需要查看应用程序才能发现问题--对于32位应用程序来说,1.5GB显然太过了。事实上,您在不同的机器上有不同的行为,不同的操作系统并不意味着您应该归咎于操作系统。

票数 0
EN

Stack Overflow用户

发布于 2011-04-07 11:21:25

您可以尽量不那么依赖垃圾收集器。如果您重写绘图代码以清理未使用的资源,则可能不会遇到所描述的场景。

Image.Dispose()

注意:始终在释放上次对图像的引用之前调用Dispose。否则,在垃圾收集器调用Image对象的Finalize方法之前,它使用的资源将不会被释放。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5580135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档