目的
- 快速定位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必讀技術書籍
