每日一題: 內存優化
面試率: ★★★★☆
面試提醒
內存優化?現在的APP已經是家喻戶曉的事情了,不再像以前一樣只有大公司才能有自己的產品,基本中小型公司只要是打算進軍移動互聯網的都會有自己的app,因此在成千上萬的app中要脫穎而出,靠的不是你廣告打的多響,更重要的是產品的健壯性,因此內存優化是面試中不可避免的一題.
面試技巧
在面試過程中,只要被問到內存優化相關問題,一般都會真直覺的講什么原因會導致這個問題,如io流,游標操作,圖片處理等...
然而這些并不能證明你真的接觸過這塊知識,外面百度下Android內存優化
一大堆這樣的文章.
如何是好?
面試官真正想要的是,你在項目中如何定位解決內存優化這個過程,詳情看看下面的面試題.
面試題
下面是記一次檢測并定位內存泄漏的過程,我把這個過程的一些關鍵問題提取出來.
Eclipse如何檢測內存泄漏這塊的,DDMS和MAT使用過嗎?
比較麻煩,要經過debug,logCat,Console
什么是內存泄漏?
Android虛擬機的垃圾回收采用的是根搜索算法。GC會從根節點(GC Roots)開始對heap進行遍歷。到最后,部分沒有直接或者間接引用到GC Roots的就是需要回收的垃圾,會被GC回收掉。而內存泄漏出現的原因就是存在了無效的引用,導致本來需要被GC的對象沒有被回收掉。
舉個會導致OOM栗子?
- 使用static修飾的對象,當Activity需要被銷毀時,由于被靜態對象所持有,所以系統不會對其進行GC,這樣就造成了內存泄漏
- 工具類里的單例模式,在getInstance()方法時傳入了Activity。那么當instance沒有釋放時,這個Activity會一直存在。因此造成內存泄露
解決方法可以將new Singleton(context)改為new Singleton(context.getApplicationContext())即可,這樣便和傳入的Activity沒關系了。
AS有沒提供什么檢測OOM的方法,Android Monitor
使用過沒?
通過Reference Tree(該實例的引用),可以從這里面查看內存泄漏的原因,Shallow Size指的是該對象本身占用內存的大小,Retained Size代表該對象被釋放后,垃圾回收器能回收的內存總和。
平時如何操作AM的?
其實操作很簡單,主要4步驟.
- 手動GC
- 查看信息 JavaHeap
- 分析信息 Analyzer Task
- 定位問題 (解決問題)