我目前正試圖優化我的應用程序的內存使用情況,我注意到一種看起來很奇怪的行爲,所以我想知道這是否正常。導航期間內存增加,但堆看起來不錯?
我正在同一頁面的不同實例之間執行一系列導航,我檢查了垃圾收集器似乎工作正常,因爲每次導航後頁面實例都被正確銷燬,以及ViewModel實例和每個ViewModel中的模型實例。
但是,在每次導航後,我看到一個常量增加了內存使用量(在「調試」和「發行」模式下均進行了測試)。這裏有一個快照:
正如你可以在右側的內存圖表中看到,內存使用量增加,最大值約爲108MB當我開始應用,並在屏幕上它達到127MB。我的意思是這很好,應用程序運行正常,但我不確定這是否正常。 堆大小似乎是小於2MB,那麼這些內存的使用來自哪裏呢?
堆中最大的對象似乎都是系統對象(除了包含當前用戶的頭像圖像的那個UserHamburgerButtonViewModel
,這就是它的大小的原因),但總之堆中對象的總大小遠低於那些20MB的內存。
如果我繼續航行,我可以看到,應用程序將需要更多或每一導航較少1MB,堆的大小保持不變,但私有內存總量不斷增加,所以我不知道這裏發生了什麼。
編輯:在回答@米哈爾這裏科莫羅夫斯基與GC電話另一屏幕,這個問題仍然存在:
謝謝您的幫助!
在UWP應用程序中,並非所有內存都由垃圾回收器管理。您的託管堆不會增長,但總的內存會增加。這意味着增長髮生在非託管內存中,例如Windows運行時對象。這些都是參考計數,應該回收。但是那個記憶不是壓縮的。你看到的可能是非託管內存碎片的結果。或者它可能是一個真正的內存泄漏。 –
@ Sergio0694看起來不錯。 CLR可能增加了堆大小,你是否也嘗試過使用'GCSettings.LargeObjectHeapCompactionMode'?您也可以添加'Debug'來輸出'GC.GetTotalMemory(true)'。無論如何,它看起來不錯。例如,WCF服務起始於〜120MB,可能會上升到300MB左右,然後永遠保持這種狀態。 –