2016-03-02 49 views
4

我想了解我的應用在哪裏使用內存,以及在哪裏可以使其在這方面更加高效。使用Android Studio的內存使用情況分析

在Android Studio的Android監視器部分,我已經拋棄了Java堆,並且正在查看生成的hprof。

而且我看到FinalizerReference下分類頗多:

enter image description here

這是什麼?我怎樣才能更好地理解導致它的原因,以及如何保持它?研究「實例」面板對我沒有多大幫助......沒有多大意義。

我已經試過看this,但這一切都略微超過了我的頭。

此外,內存監視器正在報告(在實時圖表部分)10.58 MB的分配內存。但在我的設備上,在「應用程序管理器」>「運行進程」中,我的應用程序顯示的內存使用量爲44MB。爲何差異?如果我想嘗試減少〜33MB,我在Android Studio中看不到它,所以沒有真正的希望確定它是什麼?

+0

如果你有內存泄漏,看看這是否有幫助。 FinalizerReference很好,不應該有GC根。 http://ramannanda.blogspot.com/2015/04/analyzing-memory-leaks-in-android.html?m=1 –

回答

0

對於FinalizerReference內存使用情況,可能沒有太多可以做的事情。有關更多詳細信息,請參閱此question - 基本上,某些對象實現finalize(),這些處理有點不同,以至於它們最終可能會長時間滯留。我沒有仔細研究它,但我懷疑有些android sdk對象可以做到這一點,除了調整對象緩存/回收以減少它之外,您可以做的事情很少。

我不確定這是否有助於FinalizerReference,但我想跟蹤內存泄漏的一件事是找到可疑對象與GC根目錄的連接。

如果你現在使用Eclipse HPROF分析(獨立於實際的Eclipse IDE的;使用Android Studio生成hprofs作品),這是訪問的方式之一:

  • 概述
  • 直方圖
  • 用鼠標右鍵單擊「對象列表」
  • 右鍵單擊您懷疑泄漏的對象,「路徑GC根所」

現在您應該可以看到從GC根目錄返回到您的對象的嵌套引用列表。

我不完全確定是什麼原因導致的差異 - 這裏是similar question。顯然,內存監視器工具可能只報告Java代碼所做的堆分配,而設備報告整個進程的內存使用情況。