JVM內存模型和垃圾回收機制

說一下JVM內存模型

  1. 棧主要存放方法執行的本地變量、對象引用,方法執行前就先創建棧幀入棧,執行完出戰
  2. 堆主要存放對象、數組,我們所說的新生代、老年代、永久代就是指這篇區域
  3. 方法區主要存放類定義(class文件),常量,靜態變量。在JDK1.7中,HotSpotVM實現就是將其放到永久代中,這樣的好處就是可以直接使用堆中的GC算法進行管理,壞處就是會會出現內存溢出,即PermGen Space異常。所以在JDK1.8中,HotSpotVM用元空間取代了永久代,成爲 HotSpot VM 對方法區的實現,元空間直接使用本地內存,理論上電腦有多少內存它就會使用多少,避免發生PermGen Space異常。
  4. 程序計數器記錄當前執行的代碼行數

JDK 1.8 中,class對象和static成員變量,兩者都位於堆(Heap),且static 成員變量位於 Class對象內
類的元數據存放在方法區

介紹一下垃圾回收算法有哪些

  1. 標記清除算法,它將垃圾回收分爲兩個階段:標記階段和清除階段。在標記階段首先通過根節點標記所有從根節點開始的對象,未被標記的對象就是未被引用的垃圾對象。然後再清除階段,清除所有未被標記的對象
  2. 標記整理算法,從根節點開始掃描,標記出所有存活對象,並將這些存活對象複製到一塊新內存,之後將原來那塊全部回收掉。在垃圾對象多的前提下效率很高,在新生代經常發生
  3. 分代收集算法。目前虛擬機使用的回收算法,它解決了標記整理算法不適用老年代的問題,將內存分爲各個年代。一般情況下將堆區分爲新生代和老年代;堆區之外爲永久代。
    新生代垃圾對象多且佔用內存少,可以使用標記整理算法;老年代垃圾對象少而且佔用內存多,可以使用標記清除算法

如何判斷一個對象是否可回收

首先判斷其是否爲不可達對象,如果是還要至少經歷兩次標記過程纔會稱爲可回收對象。
判定爲不可達對象策略是採用正向可達的方式,通過roots對象作爲起點進行搜索,走過的路徑稱爲“引用鏈”,當一個對象沒有任何引用鏈相連時,證明此對象不可達,但不一定成爲可回收對象。
能否被回收其實主要看finalize方法有沒有與引用鏈上的對象進行關聯,如果在finalize方法自救成功,則改對象爲不可回收,否則可以進行回收

錯誤的垃圾回收機制會出現什麼狀況

CPU負載過高
系統報內存溢出異常

說一下CMS垃圾回收器和G1收集器的特點

CMS垃圾回收器

  1. 特點:
    CMS基於“標記-清掃”算法實現,以獲取最短回收成本爲目標
    工作流程是初始標記,併發標記,重新標記,併發清除。初始標記、從新標記這兩個步驟仍然需要“stop the world”,初始標記只是標記一下GC Roots能直接關聯到的對象,併發標記則是進行引用鏈的查找,重新標記是爲了修正程序運行產生變化的數據標記
  2. 優缺點
    CMS算法優點是:併發收集,低停頓
    CMS算法缺點是:a) 佔用cpu導致應用程序變慢,吞吐量降低
    b) 無法在當此收集中處理浮動垃圾,只好等下一次GC進行清理
    c) 產生大量空間碎片,大對象分配不足,可能會提前觸發Full GC

G1垃圾回收器

  1. 特點:
    a) G1充分利用CPU、多核環境,使用多個cpu鎖定stop the world停頓時間
    b) 分代收集,採用不同的方式處理不同代的對象
    c) 空間整合,吸收"標記整理"算法的思想
    G1運作工作流程是:初始標記,併發標記,最終標記,篩選回收

JVM類加載機制-熱部署

JVM={類裝載器+執行引擎+運行時數據區}
類加載機制分爲 加載、連接、初始化三個階段。

  1. 加載階段,通過類裝載器定位class文件,將class文件加載到內存,然後JVM實例讀取類信息到方法區。
  2. 連接階段,驗證,準備(爲類變量創建堆內存,並將成員變量初始化爲默認值),解析(將符號引用轉換爲直接引用)
  3. 初始化,將成員變量進行初始化
    注意點:任意一個類都是由這個類本身,和加載這個類的類加載器來確定的

雙親委派模型

  1. 啓動類加載器(Bootstrap ClassLoader):用來加載%JAVA_HOME%/lib中的文件 或者 -Xbootclasspath指定的文件,屬於虛擬機的一部分
  2. 擴展類加載器(Extension ClassLoader):用來加載%JAVA_HOME%\lib\ext目錄中 或者 java.ext.dirs指定的類庫,Java實現獨立於虛擬機
  3. 應用程序類加載器(Application ClassLoader):用來加載用戶類路徑(classPath)上的類庫,java實現獨立於虛擬機

JVM類執行機制

是在class文件加載到JVM中並且產生Class對象之後,由JVM進解釋執行(對比編譯執行)

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