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