架构师养成之道-03-jvm内存分布详解
上篇文章寫道了jvm的基本原理,那么作為jvm主要的戰場在內存管理,我們更應該清楚了。
jvm的內存模型劃分:程序計數器、虛擬機棧內存、本地方法棧、堆內存、方法區
- 程序計數器主要工作:
????????線程私有,主要是記錄代碼指令執行的位置,方便線程切換恢復后能夠找到對應的執行位置情況?。字節碼解釋器通過改變計數器的值來選取下一條需要執行的指令字節碼指令,分支、循環、跳轉、異常處理、線程恢復等功能都是通過程序計數器來協調完成的。
? ? ? ? 關鍵詞:
????????????????1.線程私有、線程隔離
????????????????2.沒有OutOfMemoryError異常
? ? ? ? ? ? ? ? 3.生命周期和線程相同
? ? ? ? ? ? ? ? 4.運行速度最快內存區:在CPU中
- 虛擬機棧:
? ? ? ? 棧內存也是線程私有的,是運行時內存模型中一塊,執行方法時創建一個棧幀,用于存儲方法的局部變量表、操作數棧、動態鏈接、方法的出口等信息,方法的調用到執行完成,對應的就是虛擬機棧的入棧和出棧。
? ? ? ? 關鍵詞:
? ? ? ? ? ? ? ? 1.線程私有
? ? ? ? ? ? ? ? 2.存儲局部變量表、操作數棧、動態鏈接、方法出口等
? ? ? ? ? ? ? ? 3.異常:StackOverflowError:線程請求的棧深度大于虛擬機所允許的深度(常見于循環調用),OutOfMemoryError:如果虛擬機棧可以動態擴展,而擴展時無法申請到足夠的內存
- 本地方法棧
? ? ? ? 線程私有,運行時內存,和虛擬機棧區別在于他是給本地方法(native)服務,而虛擬機棧主要是給java方法使用的。其他定義基本一致,也有StackOverflowError、OutOfMemoryError異常。
? ? ? ? 關鍵詞:
? ? ? ? ? ? ? ? 1.線程私有
? ? ? ? ? ? ? ? 2.和虛擬機棧使用方式一致
? ? ? ? ? ? ? ? 3.異常:StackOverflowError、OutOfMemoryError
- 堆內存
?????????線程共享。是虛擬機的最大內存區域,用于存放java對象,屬于運行時內存區,在邏輯上是連續的,也是垃圾回收器的主要工作區。在虛擬機創建的時候就初始化好,可以動態分配內存,對象的生命周期是獨立的,由垃圾回收器處理。數據訪問比較慢
? ? ? ? 關鍵詞:
? ? ? ? ? ? ? ? 1.線程共享
? ? ? ? ? ? ? ? 2.jvm創建就初始化好堆內存
? ? ? ? ? ? ? ? 3.異常:OutOfMemoryError
- 方法區
? ? ? ? 線程共享。存儲已被虛擬機加載的類信息、常量、靜態常量、即時編譯器編譯后的代碼等數據。jdk1.8后叫在元數據區。
? ? ? ? 1.線程共享
? ? ? ? 2.異常:OutOfMemoryError
總結
以上是生活随笔為你收集整理的架构师养成之道-03-jvm内存分布详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle的获取年月日时间,获取5年前
- 下一篇: 软件概要设计和详细设计的区别