JVM面試必知必會

JVM加載流程和運行時數據區以下圖所示:java

運行時數據區

方法區

方法區用於存儲已經被加載的類信息、常量、靜態變量、編譯後的代碼以及 運行時常量池等。算法

主要存放一些數據,好比對象實例、數組等。數組

堆內存會劃分爲年輕代老年代,年輕代又會分爲EdenServivor區,Survivor也會分爲FromPlaceToPlace安全

虛擬機棧

虛擬機棧描述的是JVAV方法執行的內存模型。每一個方法被執行的時候同時都會建立一個棧幀,用於存儲局部變量表操做數棧動態連接方法出口等信息,不存在垃圾回收問題,只要線程結束,該棧就釋放。性能

本地方法棧

和棧做用相似,可是本地方法棧執行的是native方法。線程

程序計數器

程序計數器 能夠看作是當前線程所執行的行號指示器。3d

內存泄露和內存溢出

內存泄露的緣由
  • 對象是可達的(一直被引用)
  • 對象不會被使用。

這些對象不會被GC所回收,可是卻一直佔用內存。code

內存溢出的緣由
  • 內存泄露致使堆棧內存不斷增大
  • 大量的jar,class文件加載,裝載類的空間不夠
  • 操做大量的對象致使堆內存空間用滿

GC的方式

  • Minor GC: 年輕代,頻率高,速度快
  • Major GC:老年代
  • Full GC:整個堆(年輕代,老年代)

虛擬機堆的年輕代和年老代

  • Eden空間滿了以後,會觸發一次Minor GC,GC以後還存活的對象將被複制到兩個Survivor區域中的一個。假定該Servivor爲From區,From區被填滿以後,這個區域也要進行GC,GC以後存活的對象會複製到To區,From區清空,所以From和To區必有一區是空的。如此交換15次,最終若是仍是存活,將存入老年代。
  • 若是對象的大小大於Eden的二分之一會直接分配在老年代區。若是老年代也分配不下,會作一次老年代的major GC。
  • 若是minor GC後,survivor仍然放不下,則放到老年代。
  • 動態年齡判斷。大於等於某個年齡段的對象超過了Servivor空間的一半,則直接進入老年代。

雙親委派模式

當一個類收到加載請求時,它不會先本身去嘗試加載,而是委派給父類去完成。cdn

做用:爲了解決類載入過程當中的安全性問題對象

  • 假設有一個開發者本身編寫了一個名爲 java.lang.Object的類,想借此欺騙JVM。如今他要使用自定義 ClassLoader來加載本身編寫的 java.lang.Object類。
  • 然而幸運的是,雙親委託模型不會讓他成功。由於JVM會優先在 BootstrapClassLoader的路徑下找到 java.lang.Object類,並載入它。

類的實例化順序

  1. 父類靜態成員靜態初始化塊,按代碼塊中出現的順序依次執行。
  2. 子類靜態成員靜態初始化塊,按代碼塊中出現的順序依次執行。
  3. 父類實例成員實例初始化塊,按代碼塊中出現的順序依次執行。
  4. 父類構造方法
  5. 子類實例成員實例初始化塊,按代碼塊出現的順序依次執行。
  6. 子類構造方法。

JVM中一次完整的GC流程是怎樣的?

YGC和FGC表示什麼?

  • YGC(Young GC): 對新生代堆進行GC。頻率比較高,由於大部分對象的存活壽命較短,在新生代裏被回收,性能耗費較小。
  • FGC(Full GC): 全堆範圍的GC。默認堆空間使用到達80%的時候回觸發FGC、

JVM垃圾回收算法有哪些?

咱們經常使用的垃圾回收器通常採用分代收集算法

標記-清除算法

算法分爲標記清除兩個階段,首先標記出全部須要回收的對象,在標記完成後統一回收全部標記的對象。

標記壓縮算法

首先先標記須要回收的對象,而後讓全部存活的對象都向一端移動,最終清理掉端邊界之外的內存。

複製算法

將可用內存劃分爲大小相等的兩塊,每次用掉其中的一塊。當着一塊的內存用完了,就將還存活的對象複製到另一塊上面,而後再把已使用的內存空間一次清理掉。

分代收集算法

將JAVA堆分爲新生代和老年代,這樣就能夠根據各個年代的特色採用最適合的收集算法。

常見的垃圾收集器有哪些?

CMS收集器
  • CMS收集器,CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間爲目標的收集器。
  • CMS收集器須要消耗額外的CPU和內存資源,在CPU和內存資源緊張時,會加劇系統負擔,
  • CMS沒法處理浮動垃圾,CMS的標記-清除算法,會致使大量的空間碎片的產生。
G1收集器

G1(Garbage-First)是一款面向服務端的垃圾收集器,主要針對配備多顆處理器及大容量內存的機器,具有極高機率知足GC停頓的同時,還具有高吞吐量性能特徵

Serial收集器
  • Serial收集器,是最古老,最穩定以及效率高串行收集器。
  • 只使用一個線程去回收,可能產生較長的停頓。
相關文章
相關標籤/搜索