亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

.NET內存加載約40張圖像時出現問題,未回收內存,可能是由于LOH碎片導致

.NET內存加載約40張圖像時出現問題,未回收內存,可能是由于LOH碎片導致

神不在的星期二 2019-11-18 13:10:49
好吧,這是我第一次嘗試對.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 回答

  • 3 回答
  • 0 關注
  • 666 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號