2014-03-25 24 views
0

我的應用程序使用的服務,我開始在主要活動的onCreate()方法。當我第一次在平板電腦上啓動應用程序並查看設置/應用程序/運行中運行的應用程序時,它顯示我的服務正在運行並消耗11MB的RAM。瞭解Android應用程序RAM的使用

現在,如果我通過旋轉設備循環20次活動的生命週期,然後回到設置/應用程序/運行,它表明我現在使用29MB的RAM。

起初我以爲這一定是由於內存泄漏,但在循環活動的生命週期之前和之後進行堆轉儲後,我似乎沒有泄漏任何對象。以下是MAT的屏幕截圖,其中標題爲Objects #0的列在騎車前列出了我的對象的實例,標題爲Objects #1的列列出了騎車後我的對象的實例。

My objects after cycling

,併爲所有對象

enter image description here

有沒有出現任何明顯的內存泄漏,但我不明白爲什麼在設置/應用程序的內存佔用/運行在每個定位/生命週期後增加。我在這裏錯過了什麼嗎?爲什麼我的內存使用率明顯增加,當我沒有出現任何內存泄漏?

更新

的原因,我的應用程序是消耗在每個方向上的變化更多的內存是從資產創建自定義字體的結果。我創建了一個自定義的TypefacedTextView(在上面的屏幕截圖中可以看作是一個對象),每次創建視圖時似乎都會將字體重新加載到內存中。刪除TypefacedTextViews已解決該問題。使用命令shell dumpsys meminfo my.package.com的adb工具清楚地表明瞭這個問題,其中列出了我豐富的字體Asset Allocations。

+0

「我的應用程序使用的是我在主Activity的onCreate()方法中啓動的服務,並在活動的onDestroy()方法中停止」 - 爲什麼您有服務? – CommonsWare

+0

@CommonsWare它不在'正確'的應用程序中使用。在調試過程中,我已經把它放在那裏,試圖找出爲什麼RAM會增加。在此調試過程中保持服務運行會產生相同的效果。注意:我也刪除了服務中的所有功能,但仍得到相同的結果。 –

+0

另請注意,在第一次創建活動時,我正在使用工作片段來啓動並綁定到服務。這樣就減少了每次配置發生變化時都需要等待異步的'ServiceConnection'調用(我認爲這種方法在你的一個出色的博客中有描述):) –

回答

0

有一篇簡短的博客文章,我相信它仍然有很多信息。你可以找到它here

在它你會發現,如果你錯誤地管理您的活動的引用可以/會發生什麼事的intereseting解釋:

private static Drawable sBackground; 

@Override 
protected void onCreate(Bundle state) { 
    super.onCreate(state); 

    TextView label = new TextView(this); 
    label.setText("Leaks are bad"); 

    if (sBackground == null) { 
    sBackground = getDrawable(R.drawable.large_bitmap); 
    } 
    label.setBackgroundDrawable(sBackground); 

    setContentView(label); 
} 

此代碼是非常快,也非常錯誤的;它會泄漏第一個屏幕方向更改時創建的第一個 活動。當 Drawable附加到視圖時,該視圖將設置爲 drawable的回調。在上面的代碼段,這意味着繪製有 參考其本身具有活性 (上下文),這又參考了相當多的東西 參考TextView的(取決於你的代碼。)

由於您正在討論關於方向更改的內存泄漏問題,您可能很有可能在他的帖子中犯了作者詳細信息中的錯誤。

+0

謝謝。實際上我已經通過這篇文章,很多人喜歡它。我一直非常認真地對待引用超過必要時間的對象引用,我不認爲這是MAT分析給出的問題。該問題對於使用自定義字體顯得更加微妙。關於在這個問題上打開另一個問題。 –