我在美團Android研發崗工作的那5年,成功入職阿裏

spring全家桶開發 2021-09-20 04:17:49 阅读数:962

android 工作 成功

正文

1.圖片的三級緩存中,圖片加載到內存中,如果內存快爆了,會發生什麼?怎麼處理?

參考回答:
首先我們要清楚圖片的三級緩存是如何的
我在美團Android研發崗工作的那5年,成功入職阿裏_程序員
如果內存足够時不回收。內存不够時就回收軟引用對象

2.內存中如果加載一張500X500的png高清圖片.應該是占用多少的內存?

參考回答:

  • 不考慮屏幕比的話:占用內存=500 * 500 * 4 = 1000000B ≈ 0.95MB
  • 考慮屏幕比的的話:占用內存= 寬度像素 x (inTargetDensity / inDensity) x 高度像素 x (inTargetDensity / inDensity)x 一個像素所占的內存字節大小
  • inDensity錶示目標圖片的dpi(放在哪個資源文件夾下),inTargetDensity錶示目標屏幕的dpi
    我在美團Android研發崗工作的那5年,成功入職阿裏_程序員_02

3.WebView的性能優化 ?

參考回答:
一個加載網頁的過程中,native、網絡、後端處理、CPU都會參與,各自都有必要的工作和依賴關系;讓他們相互並行處理而不是相互阻塞才可以讓網頁加載更快:

  • WebView初始化慢,可以在初始化同時先請求數據,讓後端和網絡不要閑著。
  • 常用 JS 本地化及延遲加載,使用第三方瀏覽內核
  • 後端處理慢,可以讓服務器分trunk輸出,在後端計算的同時前端也加載網絡靜態資源。
  • 脚本執行慢,就讓脚本在最後運行,不阻塞頁面解析。
  • 同時,合理的預加載、預緩存可以讓加載速度的瓶頸更小。
  • WebView初始化慢,就隨時初始化好一個WebView待用
  • DNS和鏈接慢,想辦法複用客戶端使用的域名和鏈接。
    我在美團Android研發崗工作的那5年,成功入職阿裏_程序員_03

4.Bitmap如何處理大圖,如一張30M的大圖,如何預防OOM?

參考回答:避免OOM的問題就需要對大圖片的加載進行管理,主要通過縮放來减小圖片的內存占用。

  • BitmapFactory提供的加載圖片的四類方法(decodeFile、decodeResource、decodeStream、decodeByteArray)都支持BitmapFactory.Options參數,通過inSampleSize參數就可以很方便地對一個圖片進行采樣縮放
  • 比如一張10241024的高清圖片來說。那麼它占有的內存為102410244,即4MB,如果inSampleSize為2,那麼采樣後的圖片占用內存只有512512*4,即1MB(注意:根據最新的官方文檔指出,inSampleSize的取值應該總是為2的指數,即1、2、4、8等等,如果外界輸入不足為2的指數,系統也會默認選擇最接近2的指數代替,比如2)

綜合考慮。通過采樣率即可有效加載圖片,流程如下

  • 將BitmapFactory.Options的inJustDecodeBounds參數設為true並加載圖片
  • 從BitmapFactory.Options中取出圖片的原始寬高信息,它們對應outWidth和outHeight參數
  • 根據采樣率的規則並結合目標View的所需大小計算出采樣率inSampleSize
  • 將BitmapFactory.Options的inJustDecodeBounds參數設為false,重新加載圖片
    我在美團Android研發崗工作的那5年,成功入職阿裏_程序員_04

5.內存回收機制與GC算法(各種算法的優缺點以及應用場景);GC原理時機以及GC對象

參考回答:
1.內存判定對象可回收有兩種機制

  • 引用計數算法:給對象中添加一個引用計數器,每當有一個地方引用它時,計數器值就加1;當引用失效時,計數器值就减1;任何時刻計數器為0的對象就是不可能再被使用的。然而在主流的Java虛擬機裏未選用引用計數算法來管理內存,主要原因是它難以解决對象之間相互循環引用的問題,所以出現了另一種對象存活判定算法。
  • 可達性分析法:通過一系列被稱為『GCRoots』的對象作為起始點,從這些節點開始向下搜索,搜索所走過的路徑稱為引用鏈,當一個對象到GC Roots沒有任何引用鏈相連時,則證明此對象是不可用的。其中可作為GC Roots的對象:虛擬機棧中引用的對象,主要是指棧幀中的本地變量*、本地方法棧中Native方法引用的對象、方法區中類靜態屬性引用的對象、方法區中常量引用的對象

2.GC回收算法有以下四種:

  • 分代收集算法:是當前商業虛擬機都采用的一種算法,根據對象存活周期的不同,將Java堆劃分為新生代和老年代,並根據各個年代的特點采用最適當的收集算法。

  • 新生代:大批對象死去,只有少量存活。使用『複制算法』,只需複制少量存活對象即可

    • 複制算法:把可用內存按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當這一塊的內存用盡後,把還存活著的對象『複制』到另外一塊上面,再將這一塊內存空間一次清理掉。實現簡單,運行高效。在對象存活率較高時就要進行較多的複制操作,效率將會變低
  • 老年代:對象存活率高。使用『標記—清理算法』或者『標記—整理算法』,只需標記較少的回收對象即可。

    • 標記-清除算法:首先『標記』出所有需要回收的對象,然後統一『清除』所有被標記的對象。標記和清除兩個過程的效率都不高,清除之後會產生大量不連續的內存碎片,空間碎片太多可能會導致以後在程序運行過程中需要分配較大對象時,無法找到足够的連續內存而不得不提前觸發另一次垃圾收集動作。

    • 標記-整理算法:首先『標記』出所有需要回收的對象,然後進行『整理』,使得存活的對象都向一端移動,最後直接清理掉端邊界以外的內存。標記整理算法會將所有的存活對象移動到一端,並對不存活對象進行處理,因此其不會產生內存碎片

最後

為了方便有學習需要的朋友,我把資料都整理成了視頻教程(實際上比預期多花了不少精力)

 CodeChina開源項目:《Android學習筆記總結+移動架構視頻+大廠面試真題+項目實戰源碼》

當程序員容易,當一個優秀的程序員是需要不斷學習的,從初級程序員到高級程序員,從初級架構師到資深架構師,或者走向管理,從技術經理到技術總監,每個階段都需要掌握不同的能力。早早確定自己的職業方向,才能在工作和能力提昇中甩開同齡人。

  • 無論你現在水平怎麼樣一定要 持續學習 沒有雞湯,別人看起來的毫不費力,其實費了很大力,這四個字就是我的建議!!
  • 我希望每一個努力生活的IT工程師,都會得到自己想要的,因為我們很辛苦,我們應得的。

當程序員容易,當一個優秀的程序員是需要不斷學習的,從初級程序員到高級程序員,從初級架構師到資深架構師,或者走向管理,從技術經理到技術總監,每個階段都需要掌握不同的能力。早早確定自己的職業方向,才能在工作和能力提昇中甩開同齡人。

無論你現在水平怎麼樣一定要 持續學習 沒有雞湯,別人看起來的毫不費力,其實費了很大力,沒有人能隨隨便便成功。

加油,共勉。

版权声明:本文为[spring全家桶開發]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210920041749216a.html