2011-08-30 78 views
23

我工作的一個應用程序從互聯網流媒體音樂...我的應用程序做很多事情,它在結構是這樣的:我有一個標籤視圖,每個視圖在每次內存中,以便分配我瀏覽標籤我再次發現以前的狀態(每個標籤也可以打開一個webview來查找有關歌曲,新聞等在互聯網上的信息)..所有這些增長的內存佔用,但使應用程序非常用戶友好......在注意後爲了避免遵循Android指南發生內存泄漏,我試圖查看堆佔用情況,並且發現我的應用程序分配了最大3.5MB的內存,並且分配的堆大小爲4.5 - 4.6 MB ...我正在模擬器上工作。他們都沒有這麼多,我想,但有時我的應用程序是在重新啓動logcat中成立像Android的成長堆斷枝情況下

Grow heap (frag case) to 3.373 for 19764-byte allocation 
一個奇怪的消息

這是什麼?一個模擬器的問題?或者是其他東西?我是否使用太多內存?

預先感謝您的幫助:)

回答

35

最大堆大小取決於設備(你可以通過調用Runtime.getRuntime().maxMemory()該值),但它可能是32MB左右。爲了節省內存,Android不會自動爲每個應用程序分配最大內存。相反,它會等到應用程序需要更多內存,然後根據需要爲它提供更多堆空間,直到達到最大值。我相信那是你看到的Grow heap消息。

如果你做了很多的內存分配和釋放的,你可能會遇到碎片問題。維基百科有一個體面的描述here,但基本上意味着你可能有所需的內存,只是不是在一個塊。因此需要增加堆。

所以要回答你的問題,這可能不是一個模擬器問題,它只是程序的本質,這聽起來有點沉重。然而,這不是一件壞事。我不認爲使用3-5MB的多個標籤與Webviews是太多了。

+0

哦謝謝你的回答^^爲什麼它不是壞事?我的應用在這種情況發生時退出......我認爲這很糟糕......我的錯?我收到另一條消息:heapworker是楔形的:在Landroid/media/MediaPlayer中花費了13129ms; .finalize()V ...你知道這是什麼嗎? – Erenwoid

+0

是的,如果你的應用正在退出,那很糟糕。我的意思是在多個網頁中使用只有〜4MB的堆也不錯。 我不太瞭解'HeapWorker'問題。通常它會跟蹤分配的內存,並在未使用的對象上運行垃圾回收器。我的猜測是你的一個線程正在使用所有的CPU,並且'MediaPlayer'沒有時間運行'finalize()',這是一個絕對不需要13秒的函數。 –