2013-04-12 97 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中。