1. 程式人生 > >Android面試題-與效能優化相關面試題一

Android面試題-與效能優化相關面試題一

本文配套視訊

原始碼分析相關面試題

與XMPP相關面試題

與效能優化相關面試題

與登入相關面試題

與開發相關面試題

與人事相關面試題

9-記憶體洩漏和記憶體溢位分別是什麼?它們有什麼關係?

  • 記憶體洩露是指儲存了不可能再被訪問的變數引用,導致垃圾回收器無法回收記憶體。
    也就是說:
    在Java中有些物件的生命週期是有限的,當它們完成了特定的邏輯後將會被垃圾回收;但是,如果在物件的生命週期本來該被垃圾回收時這個物件還被別的物件所持有引用,那就會導致記憶體洩漏

  • 記憶體溢位是指虛擬機器記憶體耗盡,無法為新物件分配記憶體,導致引用崩潰。典型的情況為載入多張大圖,導致記憶體耗盡。

  • 當某個介面存在記憶體洩露,反覆進入該介面,將導致一直有新物件建立但是無法回收,最終記憶體耗盡,產生記憶體溢位。

10-什麼情況下會導致記憶體洩漏

  • 資源釋放問題
    程式程式碼的問題,長期保持某些資源,如Context、Cursor、IO流的引用,資源得不到釋放造成記憶體洩露。
  • 物件記憶體過大問題
    儲存了多個耗用記憶體過大的物件(如Bitmap、XML檔案),造成記憶體超出限制。
  • static關鍵字的使用問題
    static是Java中的一個關鍵字,當用它來修飾成員變數時,那麼該變數就屬於該類,而不是該類的例項。所以用static修飾的變數,它的生命週期是很長的,如果用它來引用一些資源耗費過多的例項(Context的情況最多),這時就要謹慎對待了。
    針對static的解決方案:
    1) 應該儘量避免static成員變數引用資源耗費過多的例項,比如Context。
    2) Context儘量使用ApplicationContext,因為Application的Context的生命週期比較長,引用它不會出現記憶體洩露的問題。
    3) 使用WeakReference代替強引用。比如可以使用WeakReference mContextRef;
  • 執行緒導致記憶體溢位
    執行緒產生記憶體洩露的主要原因在於執行緒生命週期的不可控。
    針對這種執行緒導致的記憶體洩露問題的解決方案:
     將執行緒的內部類,改為靜態內部類(因為非靜態內部類擁有外部類物件的強引用,而靜態類則不擁有)。
     線上程內部採用弱引用儲存Context引用。

  • 查詢資料庫沒有關閉cursor
    程式中經常會進行查詢資料庫的操作,但是經常會有使用完畢Cursor後沒有關閉的情況。如果我們的查詢結果集比較小,對記憶體的消耗不容易被發現,只有在常時間大量操作的情況下才會出現記憶體問題,這樣就會給以後的測試和問題排查帶來困難和風險。

  • 構造Adapter沒有複用convertview
    在使用ListView的時候通常會使用Adapter,那麼我們應該儘可能的使用ConvertView。
    為什麼要複用convertView?
    當convertView為空時,用setTag()方法為每個View繫結一個存放控制元件的ViewHolder物件。當convertView不為空,重複利用已經建立的view的時候,使用getTag()方法獲取繫結的ViewHolder物件,這樣就避免了findViewById對控制元件的層層查詢,而是快速定位到控制元件。

  • Bitmap不再使用時沒有呼叫recycle()釋放記憶體

有時我們會手工的操作Bitmap物件,如果一個Bitmap物件比較佔記憶體,當它不再被使用的時候,可以呼叫Bitmap.recycle()方法回收此物件的畫素所佔用的記憶體,但這不是必須的,視情況而定。

  • 歡迎關注微信公眾號,長期推薦技術文章和技術視訊