目的

  • 快速定位JVM記憶體洩漏或者溢位等問題。
  • 面試基礎題,加分項。

文章持續更新,微信搜尋「萬貓學社」第一時間閱讀,關注後回覆「電子書」,免費獲取12本Java必讀技術書籍。

程式計數器(Program Counter Register)

  • 記錄當前執行緒所執行的位元組碼的行號。
  • 依賴其實現分支、迴圈、跳轉、異常處理、執行緒恢復。
  • Natvie 方法時,其的值就為空。
  • Java 虛擬機器規範中唯一沒有規定記憶體溢位的區域。
  • “執行緒私有”的記憶體區域。

文章持續更新,微信搜尋「萬貓學社」第一時間閱讀,關注後回覆「電子書」,免費獲取12本Java必讀技術書籍。

虛擬機器棧(Virtual Machine Stacks)

  • 其生命週期與執行緒相同。
  • 儲存區域性變量表、運算元棧、動態連結、方法出口等資訊。
  • 方法被執行的時候建立一個棧幀併入棧。
  • 方法執行完成的時候對應棧幀出棧。
  • 棧的深度過大時,丟擲 StackOverflowError 。
  • 執行緒數過多時,丟擲 OutOfMemoryError 。
  • “執行緒私有”的記憶體區域。

文章持續更新,微信搜尋「萬貓學社」第一時間閱讀,關注後回覆「電子書」,免費獲取12本Java必讀技術書籍。

本地方法棧(Native Method Stacks)

  • 為虛擬機器使用到的 Native 方法服務。
  • 棧的深度過大時,丟擲 StackOverflowError 。
  • 執行緒數過多時,丟擲 OutOfMemoryError 。
  • “執行緒私有”的記憶體區域。

文章持續更新,微信搜尋「萬貓學社」第一時間閱讀,關注後回覆「電子書」,免費獲取12本Java必讀技術書籍。

堆(Java Heap)

  • 用於存放物件例項,是JVM佔用記憶體最大一塊區域。
  • 垃圾收集器管理的主要區域。
  • 使用分代收集演算法時,堆被細分為新生代和老年代,新生代再細分為Eden空間、 From Survivor 空間、 To Survivor 空間。
  • 在HotSpot虛擬機器中,通過-Xmx和-Xms控制堆的大小,通過-Xmn控制新生代的大小。
  • 堆可以處於物理上不連續的記憶體空間中,只要邏輯上是連續的即可。
  • 沒有記憶體完成例項分配時,丟擲 OutOfMemoryError 。
  • “執行緒共享”的記憶體區域,執行緒共享的堆中又可能劃分出多個執行緒私有的分配快取區(Thread Local Allocation Buffer,TLAB)。

文章持續更新,微信搜尋「萬貓學社」第一時間閱讀,關注後回覆「電子書」,免費獲取12本Java必讀技術書籍。

方法區(Method Area)

  • 儲存已被JVM載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼。
  • 回收目標主要是針對常量池的回收和對型別的解除安裝。
  • 可以選擇不實現垃圾收集。
  • 當方法區無法滿足記憶體分配需求時,將丟擲 OutOfMemoryError 。
  • JDK6 使用永久代實現方法區。
  • JDK7 中永久代的字串常量池被移出。
  • JDK8 使用元空間實現方法區。
  • “執行緒共享”的記憶體區域。

文章持續更新,微信搜尋「萬貓學社」第一時間閱讀,關注後回覆「電子書」,免費獲取12本Java必讀技術書籍。

總結

  • 程式計數器:當前執行緒所執行的位元組碼的行號指示器。
  • 虛擬機器棧:Java方法執行的記憶體模型,用於儲存區域性變量表、運算元棧、動態連結、方法出口等資訊。
  • 本地方法棧:本地方法執行的記憶體模型,和虛擬機器棧非常相似,其區別是本地方法棧為 JVM 使用到的 Native 方法服務。
  • :用於儲存物件例項,是垃圾收集器管理的主要區域。
  • 方法區:用於儲存已被JVM載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等資料。

微信公眾號:萬貓學社

微信掃描二維碼

關注後回覆「電子書」

獲取12本Java必讀技術書籍