簡體   English   中英

Android垃圾收集器釋放內存

[英]Android Garbage Collector Freed Memory

我正在開發一個處理大量分配的應用程序(大約400萬個雙打和100萬個類)。 我正在查看垃圾收集器日志,我看到不同設備上釋放的內存總量不同。

例如,我有一個Moto X(2014)最終釋放超過312 MB。 我還有一個Droid Bionic在相同的數據上運行相同的代碼,平均釋放616 MB。 兩個設備最終的堆大小約為50 MB。

為什么Bionic上的GC釋放的內存比Moto X多? 他們應該生成相同數量的垃圾。 垃圾收集器幕后發生了什么? Moto X在Android 5.1上,Bionic在4.1.2上。

編輯:我有四個可以釋放大約300 MB RAM的設備:Moto X(2014),Nexus 7 2013,Nexus 7 2012和Razr i。 所有這四個都使用ART。 Bionic正在運行Dalvik運行時。 這是為什么沒有那么放松了? 我注意到GC_FOR_ALLOC在ART中沒有發生,但在Dalvik上一直被調用。

引用這篇文章:

接下來,ART團隊致力於優化垃圾收集器(GC)。 而不是Dalvik中每個GC總共大約10ms的兩次暫停,你只會看到一次,通常不到2ms。 他們還並行化了部分GC運行和優化的收集策略,以了解設備狀態。 例如,只有在手機被鎖定且用戶交互響應不再重要時,才會運行完整的GC。 對於對丟幀敏感的應用程序,這是一個巨大的改進。

作者在這里所說的是,在GC的上下文中,ART驅動的設備將更加高效 - 無論是在GC“浪費時間”還是在運行時釋放的內存量。

對較低內存使用量的額外貢獻可歸因於此(這只是猜測):

在最重要的改進中,ART現在可以在安裝到用戶設備上時將應用程序編譯為本機機器代碼。 被稱為提前編譯,隨着編譯器針對特定體系結構(例如ARM,x86或MIPS)進行調整,您可以期望獲得巨大的性能提升。 這樣就無需在每次運行應用程序時進行即時編譯。 因此,您的應用程序安裝時間會稍長,但在啟動時會更快啟動,因為在Dalvik VM上運行時執行的許多任務(例如類和方法驗證)已經發生。

由於ART會提前編譯您的應用程序,因此可以擴展編譯時間,從而使編譯器能夠更好地優化代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM