文章目錄:

  • ANR面試題
  • OOM面試題
  • Bitmap面試題
  • UI卡頓面試題
  • 內存泄漏面試題
  • 內存管理面試題

一、ANR面試題

1、什麼是ANR

Application Not Responding,頁面無響應的對話框

2、發生ANR的條件

應用程序的響應性是由ActivityManager和WindowManager系統服務監視的,當ANR發生條件滿足時,就會彈出ANR的對話框

  • Activity超過5秒無響應
  • BroadcastReceiver超過10秒無響應
  • Service超過20秒無響應

3、造成ANR的主要原因

主線程被IO操作阻塞

  • Activity的所有生命周期回調都是執行在主線程的
  • Service默認執行在主線程中
  • BoardcastReceiver的回調onReceive()執行在主線程中
  • AsyncTask的回調除了doInBackground,其他都是在主線程中
  • 沒有使用子線程Looper的Handler的handlerMessage,post(Runnable)都是執行在主線程中

4、如何解決ANR

  • 使用AsyncTask處理耗時IO操作
  • 使用Thread或HandlerThread提供優先級
  • 使用Handler處理工作線程的耗時操作
  • Activity的onCreate和onResume回調盡量避免耗時操作

二、OOM面試題

1、什麼是OOM

OOM指Out of memory(內存溢出),當前佔用內存加上我們申請的內存資源超過了Dalvik虛擬機的最大內存限制就會拋出Out of memory異常

2、OOM相關概念

  • 內存溢出:指程序在申請內存時,沒有足夠的空間供其使用
  • 內存泄漏:指程序分配出去的內存不再使用,無法進行回收
  • 內存抖動:指程序短時間內大量創建對象,然後回收的現象

3、解決OOM

Bitmap相關

  • 圖片壓縮
  • 加載縮略圖
  • 在滾動時不加載圖片
  • 回收Bitmap
  • 使用inBitmap屬性
  • 捕獲異常

其他相關

  • listview重用convertView、使用lru
  • 避免onDraw方法執行對象的創建
  • 謹慎使用多進程

三、Bitmap面試題

1、recycle

  • 在安卓3.0以前Bitmap是存放在堆中的,我們只要回收堆內存即可
  • 在安卓3.0以後Bitmap是存放在內存中的,我們需要回收native層和Java層的內存
  • 官方建議我們3.0以後使用recycle方法進行回收,該方法也可以不主動調用,因為垃圾回收器會自動收集不可用的Bitmap對象進行回收
  • recycle方法會判斷Bitmap在不可用的情況下,將發送指令到垃圾回收器,讓其回收native層和Java層的內存,則Bitmap進入dead狀態
  • recycle方法是不可逆的,如果再次調用getPixels()等方法,則獲取不到想要的結果

2、LruCache原理

LruCache是個泛型類,內部採用LinkedHashMap來實現緩存機制,它提供get方法和put方法來獲取緩存和添加緩存,其最重要的方法trimToSize是用來移除最少使用的緩存和使用最久的緩存,並添加最新的緩存到隊列中

3、縮略圖

4、保存Bitmap

5、保存到SD卡

6、三級緩存

  • 網路緩存
  • 本地緩存
  • 內存緩存

四、UI卡頓面試題

1、UI卡頓原理

View的繪制幀數保持60fps是最佳,這要求每幀的繪制時間不超過16ms(1000/60),如果安卓不能在16ms內完成界面的渲染,那麼就會出現卡頓現象

2、UI卡頓的原因分析

  • 在UI線程中做輕微的耗時操作,導致UI線程卡頓
  • 布局Layout過於復雜,無法在16ms內完成渲染
  • 同一時間動畫執行的次數過多,導致CPU和GPU負載過重
  • overDraw,導致像素在同一幀的時間內被繪制多次,使CPU和GPU負載過重
  • View頻繁的觸發measure、layout,導致measure、layout累計耗時過多和整個View頻繁的重新渲染
  • 頻繁的觸發GC操作導致線程暫停,會使得安卓系統在16ms內無法完成繪制
  • 冗餘資源及邏輯等導致加載和執行緩慢
  • ANR

3、UI卡頓的優化

  • 布局優化

  • 使用include、ViewStub、merge

  • 不要出現過於嵌套和冗餘的布局

  • 使用自定義View取代復雜的View

  • ListView優化

  • 復用convertView

  • 滑動不加載

  • 背景和圖片優化

  • 縮略圖

  • 圖片壓縮

  • 避免ANR

  • 不要在UI線程中做耗時操作

五、內存泄漏面試題

1、Java內存泄漏引起的主要原因

長生命周期的對象持有短生命周期對象的引用就很可能發生內存泄漏

2、Java內存分配策略

  • 靜態存儲區:又稱方法區,主要存儲全局變量和靜態變量,在整個程序運行期間都存在
  • 棧區:方法體的局部變量會在棧區創建空間,並在方法執行結束後會自動釋放變量的空間和內存
  • 堆區:保存動態產生的數據,如:new出來的對象和數組,在不使用的時候由Java回收器自動回收

3、Android解決內存泄漏的例子

  • 單例造成的內存泄漏:在單例中,使用context.getApplicationContext()作為單例的context
  • 匿名內部類造成的內存泄漏:由於非靜態內部類持有匿名外部類的引用,必須將內部類設置為static
  • Handler造成的內存泄漏:使用static的Handler內部類,同時在實現內部類中持有Context的弱引用
  • 避免使用static變量:由於static變量會跟Activity生命周期一致,當Activity退出後台被後台回收時,static變量是不安全,所以也要管理好static變量的生命周期
  • 資源未關閉造成的內存泄漏:比如Socket、Broadcast、Cursor、Bitmap、ListView等,使用完後要關閉
  • AsyncTask造成的內存泄漏:由於非靜態內部類持有匿名內部類的引用而造成內存泄漏,可以通過AsyncTask內部持有外部Activity的弱引用同時改為靜態內部類或在onDestroy()中執行AsyncTask.cancel()進行修復

六、內存管理面試題

1、Android內存管理機制

  • 分配機制
  • 管理機制

2、內存管理機制的特點

  • 更少的佔用內存
  • 在合適的時候,合理的釋放系統資源
  • 在系統內存緊張的時候,能釋放掉大部分不重要的資源
  • 能合理的在特殊生命周期中,保存或還原重要數據

3、內存優化方法

  • Service完成任務後應停止它,或用IntentService(因為可以自動停止服務)代替Service
  • 在UI不可見的時候,釋放其UI資源
  • 在系統內存緊張的時候,盡可能多的釋放非重要資源
  • 避免濫用Bitmap導致內存浪費
  • 避免使用依賴注入框架
  • 使用針對內存優化過的數據容器
  • 使用ZIP對齊的APK
  • 使用多進程

針對於上面的面試題,我總結出了網際網路公司Android程序員面試涉及到的絕大部分面試題及答案,並整理做成了文檔,以及系統的進階學習視訊資料,免費分享給大家。
(包括Java在Android開發中應用、APP框架知識體系、高級UI、全方位性能調優,NDK開發,音視訊技術,人工智慧技術,跨平台技術等技術資料),希望能幫助到你面試前的復習,且找到一個好的工作,也節省大家在網上搜索資料的時間來學習。
資料領取方式:加Android技術開發交流②;979045005,找群管理免費領取。備注一下芳網看到的來領取資料就可以了!