2011-05-06 55 views
2

我一直在調試我的應用程序,並檢查內存分配和碰到,我認爲,一個奇怪的事情。通常會問一個問題,如何最好地管理內存等等,我的問題是在一個簡單的應用程序中最低的默認內存邊界是什麼?所以我去創建了一個簡單的Hello World世界項目,它爲8級(2.2)API提供了簡單的Hello World編寫。Android最低內存量

然後我看了一下DDMS中的Heap選項卡。分配爲2.318 MB,510 Kb免費(使用82%)。所以我想爲什麼它在一個簡單的Hello World測試中使用了82%的允許(?)堆。深入挖掘我做了一個堆轉儲並在eclipse中通過MAT運行。作爲第一個例子中,我有一個看看dominator_tree(按大小排序的所有對象)這裏是我發現:

  1. TrustManagerImpl(176.616保留堆) - 9.83%, - 我想這就是很重要的安全

  2. com.ibm.icu4jni.util.Resources $ DefaultTimeZones(165.432保留堆) - 9.21% - 爲什麼?我查看了它的內容,它是一個包含561個成員的單個String數組,每個數組都有一個關於時區的信息?我不需要那真的嗎?並且需要10%的堆。

  3. android.text.Html $ HtmlParser(126.592 Retained Heap) - 7.05% - 我猜這是我的TextView的HTML解析器,它具有Hello World。雖然爲什麼?我不解析HTML,爲什麼Parser甚至在那裏?實際上,HTMLSchema佔據了對象的99.9%。

還有更多,但意義不大,因爲我可以看到(這可能是錯誤的)。任何人對我上面提到的3個實例有任何想法?我的意思是,我想念這裏的東西嗎?我不認爲內存使用率應該這麼高。這個問題表明,如果每個應用都有這個基線,它如何擴展?可能不太好?它應該是固定的,並因此導致更好的Android內存管理?我在HTC Desire 2.2上運行這個。

亞歷

回答

2

分配爲2.318 MB,510 Kb免費(使用82%)。所以我想爲什麼它在一個簡單的Hello World測試中使用了82%的允許(?)堆。

請記住,根據設備不同,可用堆的範圍將從16MB到32MB(或更高)。

我不需要那個嗎?

在過去的兩年裏,優化時區處理一直在發展,爲CPU處理RAM。預載此信息可消除應用程序運行時不必要的暫停。而且,這個數字最多隻有0.1%。

我不解析HTML,爲什麼Parser甚至在那裏?

推測出於同樣的原因,時區現在是預加載的 - 交易一點RAM以節省CPU執行時間。這也不到你堆的0.1%。

我不認爲內存使用率應該這麼高。

歡迎您的意見。我認爲你浪費了你生命中的幾個小時,可以更好地優化你的代碼。一個位圖可能會使用更多的RAM,這些構造中的任何一個都會讓您覺得太過分了。

+3

嗯,我想如果你認爲更好地理解系統的工作原理以及它在底層做了什麼,從長遠來看,意味着你可以編寫更好的代碼,這是浪費時間,那麼歡迎你的意見。 – Alex 2011-05-06 11:09:10

+0

我認爲問題是這些決定是正確的*如果應用程序實際上曾經使用時區。創建微小(所以他們很快啓動)即使你從來沒有真正創建一個可見的活動,Android服務仍然會由於內存膨脹而負擔。 – qdot 2011-05-06 11:15:08

+1

@Alex,馬克的觀點並不是要更好地理解Android的低級行爲是浪費時間,而是考慮到我們談論的內存有多少,這不值得擔憂。請記住,谷歌花費了大量的時間優化Dalvik資源再利用,所以0.1%的堆不一定意味着每個進程0.1%。 – RivieraKid 2011-05-06 11:44:12