首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

JVM 核心知識總結:內存結構、垃圾回收、類加載與常見面試題

     編輯:Java 綜合教學

JVM 核心知識總結

面試必考關鍵詞:JVM 垃圾回收、類加載機制。本文結合思維導圖系統梳理。

JVM 思維導圖

一、Java 四種引用

  • 強引用:new Object(),GC 絕不回收,OOM 也不回收。
  • 軟引用:內存夠不回收,不夠才回收,適合高速緩存。
  • 弱引用:每次 GC 必回收,生命週期極短。
  • 虛引用:不決定生命週期,配合 ReferenceQueue 追蹤回收。

二、運行時數據區劃分

  • 程序計數器:線程私有,指向下一條指令。
  • Java 虛擬機棧:線程私有,存棧幀(局部變量表、操作棧等),可能拋 StackOverflowError/OOM。
  • 本地方法棧:服務 Native 方法,HotSpot 與 Java 棧合二為一。
  • Java 堆:線程共享,GC 主戰場,分新生代(Eden + 2 Survivor)與老年代。
  • 方法區:線程共享,存類信息、常量、靜態變量、JIT 代碼。HotSpot 稱永久代/元空間。
  • 運行時常量池:方法區一部分,存字面量與符號引用。

GC 回收重點:堆與方法區(動態分配),棧等隨線程自動釋放。

三、對象存活判定算法

  1. 引用計數法:簡單高效,但無法解決循環引用,主流 JVM 未採用。
  2. 根搜索算法(GC Roots):從 GC Roots 向下搜索,不可達即可回收。GC Roots 包括:棧中引用、方法區靜態成員/常量、本地方法棧 JNI 引用。

四、垃圾回收算法

  • 標記-清除:效率低、產生碎片。
  • 複製算法:新生代適用,Eden:Survivor=8:1,無碎片、效率高,但浪費 10% 空間。
  • 標記-整理:老年代適用,移動存活對象消除碎片,成本較高。
  • 分代收集:新生代用複製,老年代用標記-清除/整理。

五、七大垃圾收集器

  1. Serial:單線程,Client 模式默認新生代收集器,STW。
  2. ParNew:Serial 多線程版,Server 模式首選新生代,唯一能與 CMS 配合。
  3. Parallel Scavenge:關注吞吐量,可自適應調節。
  4. G1:區域化、優先級回收,可指定停頓時間,JDK 7 成熟商用。
  5. CMS:並發標記清除,目標最短停頓,四階段(初始標記、並發標記、重新標記、並發清除),伴隨碎片問題。

六、類加載全過程

  1. 加載:獲取二進制流、轉換數據結構、生成 Class 對象。來源:本地 class、jar、網絡、動態編譯。
  2. 鏈接:驗證(格式/語義/字節碼)、準備(靜態字段賦默認值、分配方法區內存)、解析(符號引用轉直接引用)。
  3. 初始化:執行 <clinit>(靜態變量賦值、靜態塊)。觸發條件:new、訪問靜態字段/方法、反射、初始化子類、啟動主類。final static 常數編譯期入常量池,不觸發初始化。

附代碼驗證父子類初始化順序與 static final 行為差異。

七、對象實例化內存佈局

Student s = new Student():加載類 → 棧分配引用 → 堆分配對象 → 默認初始化 → 顯式初始化 → 構造器賦值 → 引用指向對象。

思維導圖源文件下載:2015-09-12-Java虛擬機詳解----JVM常見問題總結

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved