我們注意到Visual Studio c#中的圖像資源存在一個奇怪的行爲。圖像資源內存不足
如果您將圖像添加到您的項目資源並多次加載圖像,您將很快收到內存不足異常。
它只發生在某些系統上(在我測試的每臺第二臺PC上)。
重現:
- 創建Windows窗體項目
- 將圖像添加到項目資源(32×32 PNG)
- 創建一個for循環與2000年環 在循環
填補圖片從資源到私人列表
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上,內存泄漏出現在每個測試系統上。
有沒有人注意到同樣的奇怪行爲?
我們不可能提供幫助,除非您可以更加努力地確定健康系統*之間的*相似性*,生病系統之間的相似性*和這兩者之間的差異*組。 –
如果你的循環做了'list.Add(image);',我懷疑只迭代1000次就已經佔用了200MB,更不用說2GB了。畢竟,這些是*您正在添加到列表中的*引用。當然,沒有**實際的**代碼來分析,我只能說很多。 – Nolonar
@Nonolar:剛剛測試過,從資源獲取圖像實際上並不僅僅添加引用。它創建一個新的evey時間圖像。 (從資源中添加兩個圖像後:'_images [0] == _images [1]'爲false。做同樣的事情,但首先將圖像分配給變量'_images [0] == _images [1]'爲真。) – TTT