我在我的應用程序中加載大量圖像時出現內存泄漏問題。我對C#很陌生,並認爲我的內存泄漏問題已經過去了。我無法弄清楚這個問題 - 也許我正在使用一些我無法正確處理的非託管模塊?使用C加載內存泄漏圖像#
爲了說明我的問題,我簡化了導致問題的原因的核心,並將其轉移到一個乾淨的項目中。請注意,這是所有愚蠢的代碼,它並不反映它來自的原始應用程序。在測試應用程序中,我有2個按鈕,觸發兩個事件。
按鈕1 - 創建:將對象設置爲datacontext。這將加載圖像,並讓他們活着通過設置對象到DataContext:
var imgPath = @"C:\some_fixed_path\img.jpg";
DataContext = new SillyImageLoader(imgPath);
按鈕2 - 清理:我的理解是,如果我放手的參考拿着這又保持圖像的SillyImageLoader,然後這將被刪除。我也顯式地觸發垃圾收集,以便在刪除引用後立即查看內存量。
DataContext = null;
System.GC.Collect();
測試時我加載了974KB jpeg圖像。保存30位圖表示可以將我的應用程序的內存使用量從〜18MB提高到〜562MB。好。但是當我清理時,內存只能降到292MB。如果我重複創建+清理,我剩下另一個〜250MB內存。所以顯然有些東西仍然由某人持有。
這裏是SillyImageLoader代碼:
namespace MemoryLeakTest
{
using System;
using System.Drawing;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Media.Imaging;
public class SillyImageLoader
{
private BitmapSource[] _images;
public SillyImageLoader(string path)
{
DummyLoad(path);
}
private void DummyLoad(string path)
{
const int numberOfCopies = 30;
_images = new BitmapSource[numberOfCopies];
for (int i = 0; i < numberOfCopies; i++)
{
_images[i] = LoadImage(path);
}
}
private static BitmapSource LoadImage(string path)
{
using (var bmp = new Bitmap(path))
{
return Imaging.CreateBitmapSourceFromHBitmap(
bmp.GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
}
}
}
}
任何想法?該問題似乎與BitmapSource。只保存位圖沒有內存泄漏。我使用BitmapSource可以將其設置爲圖像的Source屬性。我應該這樣做嗎?如果是這樣 - 我仍然想知道內存泄漏的答案。
謝謝。
誰在調用從LoadImage返回的BitmapSource上的Dispose? – 2009-11-11 12:29:26
我以爲這,確實發佈了一個基於它的答案,但我看不到在BitmapSource上的配置(我已經刪除了答案) – 2009-11-11 12:30:28
你如何監控你的應用程序的內存使用情況?任務管理器? – 2009-11-11 12:36:13