我的应用程序因内存不足异常而崩溃,有时其他异常也可能是由内存不足引起的。
我用这个简单的代码重现了这个问题:
for (int i = 0; i < 100000; i++)
var bmp = new RenderTargetBitmap(256, 256, 96, 96, PixelFormats.Default);
理论上这段代码不应该崩溃,因为位图应该被自动垃圾收集,但在 32 位模式下运行时它会持续崩溃。
问题可以这样解决:
for (int i = 0; i < 100000; i++)
{
var bmp = new RenderTargetBitmap(256, 256, 96, 96, PixelFormats.Default);
if (i % 500 == 0)
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
当然,这个解决方案与您不应显式调用 GC.Collect 的常识相悖,但我怀疑这是一个它确实有意义的场景。
任何人都可以对此提供任何知情的见解吗?有没有更好的方法来解决这个问题?
最佳答案
RenderTargetBitmap 很可能有与其关联的 native 资源。您有足够的托管内存(每分配 X 字节就会调用 GC)- 托管对象本身可能没有足够的内存使用,因此根本没有意义。所以它一定是非托管部分 - 我希望它有一个 DirectX 纹理(或类似的东西)底层,只有在执行终结器时才会释放。
但是,由于永远不会有足够的托管内存压力,GC 实际上根本不会被调用, native 资源也不会被释放。
奇怪的是 RenderTargetBitmap 不是 IDisposable。这意味着您无法尽快正确处理 native 资源。因此,与 .NET 本身相比,它更像是 WPF 中的错误。
不过,这只是一个假设。
为了解决评论问题,GC 绝对不会等待方法先退出。将 RenderTargetBitmap 替换为 byte[] 表明在不涉及 native 资源时此功能正常工作。
编辑:我终于在 BCL 源代码中找到了它。要处理 RenderTargetBitmap 的 native 资源,您必须调用 Clear。它会被释放最终即使没有那个( native 资源在一个安全的句柄上),但如果你只是分配和解除分配RenderTargetBitmap,你将要运行早在你让 GC 运行之前,纹理/ native 内存就用完了。因此,要回答您的现实问题,只需在不再需要位图时调用 Clear,它就不会再占用内存了。
2015 年 7 月:
看来原来的错误已得到修复 - 查看 4.5.2 源代码,正确应用内存压力并分配大量 RenderTargetBitmap 现在应该会导致 GC 正确收集。不过,仍然没有 IDisposable 实现。
关于c# - 由于非托管内存处理的延迟导致内存不足?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22639146/
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame
你好,我无法成功如何在散列中删除key后释放内存。当我从哈希中删除键时,内存不会释放,也不会在手动调用GC.start后释放。当从Hash中删除键并且这些对象在某处泄漏时,这是预期的行为还是GC不释放内存?如何在Ruby中删除Hash中的键并在内存中取消分配它?例子:irb(main):001:0>`ps-orss=-p#{Process.pid}`.to_i=>4748irb(main):002:0>a={}=>{}irb(main):003:0>1000000.times{|i|a[i]="test#{i}"}=>1000000irb(main):004:0>`ps-orss=-p
是否可以在所有delayed_job任务之前运行一个方法?基本上,我们试图确保每个运行delayed_job的服务器都有我们代码的最新实例,所以我们想运行一个方法来在每个作业运行之前检查它。(我们已经有了“check”方法并在别处使用它。问题只是关于如何从delayed_job中调用它。) 最佳答案 现在有一种官方方法可以通过插件来做到这一点。这篇博文通过示例清楚地描述了如何执行此操作http://www.salsify.com/blog/delayed-jobs-callbacks-and-hooks-in-rails(本文中描述