好吧,這是我第一次嘗試對.NET應用程序進行內存配置(我已經完成了CPU調整),在這里我碰到了一些麻煩。我的應用程序中有一個視圖,該視圖每頁加載40張圖像(最多),每張圖像大約運行3MB。頁面的最大數量為10。由于我不想一次在內存中保留400張圖像或1.2GB,因此在更改頁面時將每個圖像設置為null。現在,起初我以為我必須對這些圖像有陳舊的引用。我下載了ANTS profiler(很棒的工具BTW)并進行了一些測試。對象生命周期圖告訴我,除了父類中的單個引用外,我沒有對這些圖像的任何引用(這是設計使然,也通過精心組合代碼來確認):父類SlideViewModelBase在緩存中永遠存在,但是在MacroImage更改頁面時,該屬性設置為null。我看不到任何跡象表明這些對象的存放時間應比預期的更長。接下來,我通常查看大對象堆和內存的使用情況。查看三頁圖像后,我分配了691.9MB的非托管內存,而LOH上的分配為442.3MB。 System.Byte[],這是從我System.Drawing.Bitmap到BitmapImage轉化所占用的大部分LOH空間。這是我的轉換代碼:public static BitmapSource ToBmpSrc( this Bitmap b ){ var bi = new BitmapImage(); var ms = new MemoryStream(); bi.CacheOption = BitmapCacheOption.OnLoad; b.Save( ms, ImageFormat.Bmp ); ms.Position = 0; bi.BeginInit(); ms.Seek( 0, SeekOrigin.Begin ); bi.StreamSource = ms; bi.EndInit(); return bi;}我很難找到所有這些非托管內存的去向。System.Drawing.Bitmap起初我懷疑這些物體,但是ANTS并沒有顯示它們粘在周圍,并且我還進行了一項測試,在此過程中,我完全確定所有物體都已處置并且沒有任何影響。所以我還沒有弄清楚所有這些非托管內存的來源。我目前的兩個理論是:H碎片。如果我離開頁面視圖并單擊幾個按鈕,則將回收大約1.5GB的一半。仍然太多,但是仍然很有趣。WPF綁定有些奇怪。我們確實使用數據綁定來顯示這些圖像,并且我對這些WPF控件的工作原理一無所知。如果有人有任何理論或分析技巧,我將非常感激,因為(當然)我們的截止日期很緊,我正在加緊努力以完成最后一部分并開始工作。我認為跟蹤C ++中的內存泄漏已使我寵壞了……誰會想到?如果您需要更多信息或希望我嘗試其他事情,請詢問。對不起這里的貼圖文字,我試圖盡量保持簡潔。
- 3 回答
- 0 關注
- 666 瀏覽
添加回答
舉報
0/150
提交
取消