JVM基礎學習(一) JVM記憶體模型

2022-09-06 09:30:14 字數 1112 閱讀 7655

在j**a高階知識的學習中,jvm都是避不過去的一關,我個人對於jvm的理解其實就是相當於在作業系統的外層再加了一層中間層,從來遮蔽了具體硬體之間的不同實現,使得j**a實現了最重要的特性:一次編譯,處處執行。本分類中的內容都是基於《深入理解j**a虛擬機器》中的內容以及網路上面部落格整理,外加自己的理解。

今天的內容是jvm中的基礎:jvm記憶體模型

jvm中的記憶體模型主要分為五大塊:程式計數器,虛擬機器棧,本地方法棧,堆,方法區

其中,方法區與堆是所有執行緒共享使用的區域,而虛擬機器棧、本地方法棧、程式計數器則是執行緒內共享的區域。

在jdk8之前,方法區使用永久代實現,永久代主要是為了避免單獨寫乙個記憶體管理;而在jdk8之後拋棄了永久代的相關概念,而是改用元空間來儲存。

方法區中主要是儲存資料型別、常量等資料;在jdk8之前,使用永久代實現方法區,永久代相當於是利用jvm自己的記憶體開闢了乙個區域,所以導致jvm更容易oom;而在jdk8之後,則全面替換成了元空間,元空間使用本地記憶體進行實現。

方法區中的分布:

首先需要區分常量池和執行時常量池這兩個概念;

執行時常量池是乙個動態性的記憶體區域,開發人員可以動態性的往其中加入常量,其中最常見的便是string類的intern()方法。如果常量過多,那麼便會爆oom異常。

j**a堆的用處便是存放物件例項,jvm中基本上所有的物件例項都是存放於j**a堆中,如果物件建立過多並且沒有足夠記憶體,則直接爆oom異常。

相當於記錄執行緒當前執行的位置的相關資訊

我們都知道,j**a方法會建立乙個棧來執行,指的就是j**a虛擬機器棧,描述的是j**a方法執行的執行緒記憶體模型。每個方法被執行的時候,j**a虛擬機器棧會同步建立乙個棧幀儲存區域性變數表、運算元棧、動態連線、方法出口等資訊,棧幀對應其方法從入棧到出棧的過程。

本地方法棧跟j**a虛擬機器棧類似,所以有些jvm將其餘j**a虛擬機器棧記憶體區域合併。其主要是為本地(native)方法服務

JVM記憶體模型基礎

執行緒私有記憶體 多執行緒共享記憶體 程式計數器 program counter register 是一塊較小的記憶體空間,它可以看做是當前執行緒所執行的位元組碼的行號指示器。在虛擬機器的概念模型裡 僅是概念模型,各種虛擬機器可能會通過一些更高效的方式去實現 位元組碼直譯器工作時就是通過改變這個計數...

jvm記憶體模型 JVM記憶體模型詳情解析

一 結構圖 note string常量池 存在 堆記憶體中 二 各部分詳情解析 1 堆1 老年代 物件年齡 經過一次 monitor gc 年齡加1 15 的會存到 老年代 2 年輕代 3 常量池 string常量 儲存在堆中 2 虛擬機器棧 1 區域性變數表 2 運算元棧 3 動態鏈結 4 方法出...

jvm記憶體模型

主要分為棧,堆,方法區,程式計數器 1.程式計數器 2.棧 stack 虛擬機器棧 每個執行緒獨生成乙個棧,執行緒中每呼叫乙個方法生成乙個棧幀,棧幀依次壓棧 棧幀中存放了每個方法的基本資料變數,物件的引用,操作指令,出口資訊等 本地方法棧 存放的是native方法 其他語言寫的 其他和虛擬機器棧一樣...