2013-04-12 47 views
1

我们注意到Visual Studio c#中的图像资源存在一个奇怪的行为。图像资源内存不足

如果您将图像添加到您的项目资源并多次加载图像,您将很快收到内存不足异常。

它只发生在某些系统上(在我测试的每台第二台PC上)。

重现:

  1. 创建Windows窗体项目
  2. 将图像添加到项目资源(32×32 PNG)
  3. 创建一个for循环与2000年环
  4. 在循环
  5. 填补图片从资源到私人列表

    private List<image> _images = new List<image>(); 
    private void ButtonClick(object sender, EventArgs e) 
    { 
        for (int i = 0; i < 2000; i++) 
        { 
         _images.Add(Properties.Resources.myImage); 
        } 
    } 
    

每次运行循环时都会分配一些内存。 在一个健康的系统上,你可以做到这一点,直到你达到2GB(32位应用程序)。

但是在生病的系统上。该应用程序已经挂在200MB。

非常值得注意的是,一个sik系统不像一个健康的系统那样分配内存。 sik系统只在循环的一次执行中分配大约一半的内存。一个sik系统每个循环分配50MB。健康系统分配120MB。

系统完全一样。核心I7,Windows7,12GB内存,Visual Studio 2012. 在Windows8上,内存泄漏出现在每个测试系统上。

有没有人注意到同样的奇怪行为?

+0

我们不可能提供帮助,除非您可以更加努力地确定健康系统*之间的*相似性*,生病系统之间的相似性*和这两者之间的差异*组。 –

+1

如果你的循环做了'list.Add(image);',我怀疑只迭代1000次就已经占用了200MB,更不用说2GB了。毕竟,这些是*您正在添加到列表中的*引用。当然,没有**实际的**代码来分析,我只能说很多。 – Nolonar

+0

@Nonolar:刚刚测试过,从资源获取图像实际上并不仅仅添加引用。它创建一个新的evey时间图像。 (从资源中添加两个图像后:'_images [0] == _images [1]'为false。做同样的事情,但首先将图像分配给变量'_images [0] == _images [1]'为真。) – TTT

回答

0

我们发现了一些有趣的东西。

问题与到Internet Explorer 10 这也解释了为什么泄漏每Windows8的

出现

要卸载IE10没有帮助。 它可以帮助您卸载Windows Update KB2670838。

顺便说一句... 这段代码有同样的问题。

Image.FromFile("myImage.png"); 

所以这个问题接近于GDI +而不是在ResourceManager中。