【最新Android高級面試知識點乾貨分享(三)】

【最新Android高級面試知識點乾貨分享(二)】
轉載請說明出處

七、Java運行時數據區 與 JVM內存模型

優秀博文推薦:https://www.cnblogs.com/czwbig/p/11127124.html

$7.1、Java運行時數據區

在JDK8以前,Java運行時數據區域具體分爲以下五塊:

  • 程序計數器(程序寄存器/PC寄存器Program Count Register):每個新開的線程都會有自己的PC。
  • 棧(Java棧/堆棧Stack):用來存儲對像的引用,基本類型的數據。優點:存取速度快,僅次於寄存器,棧數據可以共享。缺點:存在棧中的數據大小與生存期必須是確定的。
  • 本地方法棧(Native Stack):
  • 方法區(Method Area):JVM會將二進制class文件的類型信息(類信息、常量,靜態變量)放到方法區中,所有線程共享。此區域會開闢一塊特殊的空間做”常量池“
  • 堆(Heap):用來存儲對像實例。也叫GC堆,垃圾回收器主要是對此進行回收。堆是運行時動態分配內存。優點:靈活,因爲動態分配內存。缺點:存取速度比棧慢

JDK8後(圖片來源於網絡):
image

$7.2、JVM內存模型

Java內存模型(圖片來源於網絡):

image

主內存與工作內存的交互流程:
lock(鎖定)—>unlock(解鎖)---->read(讀取主內存變量)---->load(將從主內存讀取的變量載入至工作內存)—>use(在工作內存中使用此變量)---->assign(在工作內存中進行賦值操作)---->store(存儲,把工作內存的變量傳遞給主內存)---->write(將從工作內存中得到的變量寫入主內存變量中)

volatile關鍵字,就是用於確保這些變量在主內存到工作內存或工作內存到主內存的流程是完整的,確保數據的同步性。

八、 Java垃圾回收機制

像這些知識點,有時間的話,推薦閱讀一下《深入理解Java虛擬機》。
下面這些是針對垃圾回收機制面試題的知識要點。

  • 確定一個對象可被回收的算法:【引用計數法】、【可達性分析算法】(又叫GC_Root,根據引用鏈查找,跟GC_Root無關聯的,將被回收)
  • 垃圾收集算法:標記清除算法(對有引用的對象進行標記,清除未標記的對象)、複製算法、標記整理算法(先標記,再進行碎片整理)、分代收集算法(新生代、老年代、永久代)
  • 根據分代收集算法,垃圾回收有2種類型:
    • Minor GC(針對新生代,不會影響老年代,主要是回收剛創建沒多久的對象,Minor GC比較頻繁,速度快,效率高)
    • Full GC(又稱Major GC,是對整個堆進行回收,包括新生代,老年代,永久代,速度慢,效率低)

九、 Java多線程

$9.1、 Excutor、ExcutorService、Excutors的區別
  • Excutor爲父類接口;
  • ExcutorService爲Excutor的子類接口,一般都是用ExcutorService;
  • Excutors爲工廠類,用來獲取ExcutorService實例。
$9.2、 ThreadPoolExcutor自定義線程池
$9.2.1、 線程池參數
  • corePoolSize:核心線程池數量(即使線程處於空閒狀態,線程也不會被回收)
  • maximumPoolSize:線程池中允許的最大線程數
  • keepAliveTime:線程池中除核心線程外,其他線程允許的最長空閒時間,時間一到就會被回收
  • workQueue:線程池所使用的任務緩衝隊列
  • RejectedExecutionHandler:線程池對拒絕任務的處理策略
    • AbortPolicy:爲線程池默認策略。丟棄/中止任務,並拋出RejectedExecutionException異常;
    • DiscardPolicy:丟棄任務,不會拋出異常。
    • DiscardOldestPolicy:丟棄執行隊列中最老的任務,爲當前提交的任務騰出空間
    • CallerRunsPolicy:直接由提交者執行所提交的任務。
$9.2.2、 核心線程數的配置

按照程序是【CPU密集型】(又稱計算密集型)還是【IO密集型】分:

  • CPU密集型:核心線程數 = CPU核數 + 1

  • IO密集型: 核心線程數 = CPU核數*2

      注意:有時間且願意鑽研的同學,可以看下《Java 虛擬機併發編程》
    

十、 JVM類加載

同樣推薦有時間閱讀《深入理解Java虛擬機》
作爲面試知識要點,我只是簡單的記錄了下類加載過程,還有參考博客。並沒有做深入研究。

JVM把描述類的數據的Class文件(Class對象在堆中創建,而class二進制文件及其他類信息放在方法區)加載進內存,並對數據進行校驗、轉換解析與初始化的過程。

image
(圖片來源於網上)
參考資料:https://www.cnblogs.com/czwbig/p/11127222.html

下一篇開始正式分享我的面試筆記《Android篇》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章