2016-11-20 95 views
3

我目前正試圖優化我的應用程序的內存使用情況,我注意到一種看起來很奇怪的行爲,所以我想知道這是否正常。導航期間內存增加,但堆看起來不錯?

我正在同一頁面的不同實例之間執行一系列導航,我檢查了垃圾收集器似乎工作正常,因爲每次導航後頁面實例都被正確銷燬,以及ViewModel實例和每個ViewModel中的模型實例。

但是,在每次導航後,我看到一個常量增加了內存使用量(在「調試」和「發行」模式下均進行了測試)。這裏有一個快照:

Memory usage snapshot

正如你可以在右側的內存圖表中看到,內存使用量增加,最大值約爲108MB當我開始應用,並在屏幕上它達到127MB。我的意思是這很好,應用程序運行正常,但我不確定這是否正常。 堆大小似乎是小於2MB,那麼這些內存的使用來自哪裏呢?

堆中最大的對象似乎都是系統對象(除了包含當前用戶的頭像圖像的那個UserHamburgerButtonViewModel,這就是它的大小的原因),但總之堆中對象的總大小遠低於那些20MB的內存。

如果我繼續航行,我可以看到,應用程序將需要更多或每一導航較少1MB,堆的大小保持不變,但私有內存總量不斷增加,所以我不知道這裏發生了什麼。

編輯:在回答@米哈爾這裏科莫羅夫斯基與GC電話另一屏幕,這個問題仍然存在:

enter image description here

謝謝您的幫助!

+0

在UWP應用程序中,並非所有內存都由垃圾回收器管理。您的託管堆不會增長,但總的內存會增加。這意味着增長髮生在非託管內存中,例如Windows運行時對象。這些都是參考計數,應該回收。但是那個記憶不是壓縮的。你看到的可能是非託管內存碎片的結果。或者它可能是一個真正的內存泄漏。 –

+0

@ Sergio0694看起來不錯。 CLR可能增加了堆大小,你是否也嘗試過使用'GCSettings.LargeObjectHeapCompactionMode'?您也可以添加'Debug'來輸出'GC.GetTotalMemory(true)'。無論如何,它看起來不錯。例如,WCF服務起始於〜120MB,可能會上升到300MB左右,然後永遠保持這種狀態。 –

回答

0

在圖片中,您包括在內,我看不到任何垃圾回收 - 它們用黃色指針表示。換句話說,即使內存中有未使用的對象,它們還沒有被收集(釋放),這就是內存使用增加的原因。垃圾收集通常是一個緩慢的操作,不應該太頻繁地執行。在正常情況下,只有在需要時纔會運行。

嘗試運行較長時間的應用程序,例如幾分鐘。在某些時候,你應該觀察垃圾收集,並且內存的使用將會減少。

如果您不想等幾分鐘,您可以通過調用GC.Collect()方法再做一個練習,即通過程序強制GC。 但是,作爲經驗法則,決不會在生產中使用GC.Collect()如果您需要這樣做,這意味着您的代碼有問題。

更新1

診斷工具窗口中,您有內存使用標籤。你有拍攝快照按鈕。在導航之前和導航之後點擊它。您應該看到類似的東西:

enter image description here

在這個例子中,你可以看到,4000個的附加對象是在此期間創建的。如果你點擊一個鏈接,你會看到一個新窗口,顯示實際創建了哪些類型的對象。

+0

你好,謝謝你的回答。我也會編輯我的問題來添加這個問題,但我已經嘗試過幾次調用GC.Collect()和GC.WaitForPendingFinalizers(),即使在每次導航之後,它都不會改變任何內容,保留的內存每次導航後不斷增加 – Sergio0694

+0

至於你的編輯,我已經嘗試過使用該快照功能,堆總是有大約14-15k項目(它們似乎是運行時對象,而不是我自己的代碼中的項目),大小約爲1 -1.7MB,所以不能這樣..我的意思是堆看起來很好,我不知道增加的內存來自哪裏 – Sergio0694

相關問題