【吐血整理】Android開發社招面試解答之效能優化,吊打面試官系列!
正文
從我個人的角度寫寫30多歲碼工的感受:的確是受年齡壓力開始增大了。比如二十多歲的小年輕,可能什麼都懂,對組裡的東西很熟悉。有時候我也懷疑自己是不是智商不夠,是不是自學能力太差,是不是基礎不行,別人是不是都玩命加班,你知道30多歲的人那種危機感。
記憶體洩漏是什麼?
記憶體洩漏即 ML (Memory Leak)
指 程式在申請記憶體後,當該記憶體不需再使用 但 卻無法被釋放 & 歸還給 程式的現象
記憶體洩漏有哪些情況,對應的解決方案?
記憶體洩漏的原因歸根到底就是當需要被回收變數的記憶體被其他變數引用持有,導致記憶體回收失敗
常見的原因有:
1.非靜態內部類/匿名類
-
原因1:
非靜態內部類/匿名類 Handler
Activity/Fragment
物件的引用,導致Activity/Fragemnt
被銷燬的時候沒有被回收 -
解決方案:
- 將Handler類改為靜態內部類 + 弱引用(
WeakReference
)持有Activity
引用(靜態類預設不持有外部的引用) - 當外部類(一般是
Activity/Fragment
)結束生命週期時,清空Handler佇列
- 將Handler類改為靜態內部類 + 弱引用(
-
原因2:
非靜態內部類的例項(物件)
=靜態例項
(其生命週期 = 應用的生命週期) -
解決方案:
- 將該類改為靜態類(靜態類預設不持有外部的引用)
- 將該類抽出來封裝成為一個單例
-
原因3:多執行緒 工作執行緒正在處理任務時外部類需要銷燬,此時工作執行緒持有外部類的引用導致無法被回收
-
解決方案:
- 將該執行緒類類改為靜態類(靜態類預設不持有外部的引用)
- 當外部類結束生命週期時強制結束執行緒
2.集合類
-
原因:集合類新增元素之後持有集合元素的引用,導致該集合元素不可被回收,導致記憶體洩漏
-
解決方案:
- 集合類使用完元素物件後,必須將該元素從集合中刪除(由於一個集合中有多個元素,所以最簡單的方案就是清空集合物件(clean)&設定為Null)
3.資源物件使用後未關閉
-
原因:資源物件使用後未關閉,在Activity/Fragemnt銷燬時沒有關閉/登出這些資源,將導致無法回收 例如:
廣播BraodcastReceiver
、檔案流Fire
、圖片資源Bitmap
資料庫遊標
等 -
解決方案:
Activity
銷燬時及時關閉/登出資源
4.Static關鍵字修飾成員變數
-
原因:Static關鍵字修飾成員變數的生命週期 = 應用的生命週期 例如
private static Context mContext = context
那麼context上下文對應的Activity
則無法被回收 -
解決方案:
- 儘量不要使用Static成員變數引用,使用弱引用代替強引用
- 使用單例模式
4.其他使用
-
原因1:Context:當擁有
Activity context
的引用的物件仍在使用,則該Activity
需要銷燬時無法回收 -
解決方案:
- 對
context
的引用不要超過它的生命週期 - 使用
ApplicationContext
代替
- 對
-
原因2:WebView:不再使用WebView物件後沒有及時銷燬,導致記憶體佔用
-
解決方案:
- 通過多執行緒對不再使用的
WebView
物件進行銷燬
- 通過多執行緒對不再使用的
-
原因3:Adapter:滑動ListView、RecycleView獲取新View時 都在getView()中重新例項化一個View物件,浪費資源,使記憶體佔用越來越大
-
解決方案:
- 使用快取的
convertView
- 直接使用
ViewHolder
- 使用快取的
最後
希望大家能有一個好心態,想進什麼樣的公司要想清楚,並不一定是大公司,我選的也不是特大廠。當然如果你不知道選或是沒有規劃,那就選大公司!希望我們能先選好想去的公司再投或內推,而不是有一個公司要我我就去!還有就是不要害怕,也不要有壓力,平常心對待就行,但準備要充足。最後希望大家都能拿到一份滿意的 offer !如果目前有一份工作也請好好珍惜好好努力,找工作其實挺累挺辛苦的。
這裡附上上述的面試題相關的幾十套位元組跳動,京東,小米,騰訊、頭條、阿里、美團等公司19年的面試題。把技術點整理成了視訊和PDF(實際上比預期多花了不少精力),包含知識脈絡 + 諸多細節。
由於篇幅有限,這裡以圖片的形式給大家展示一小部分。可以點選Gitee免費獲取