JVM原理解讀 記憶體分割槽

2021-10-10 18:36:35 字數 840 閱讀 6979

我們把jvm虛擬機器管理的記憶體區域叫做執行時資料區,把不由jvm虛擬機器管理的的區域叫做直接記憶體或本地記憶體

執行時資料區在邏輯上總共分為5個分割槽:堆、程式計數器、方法區、虛擬機器棧、本地方法棧

其中所有執行緒共享堆和方法區,每個執行緒都有自己的程式計數器、虛擬機器棧和本地方法棧

堆是jvm記憶體中占用最大的一塊記憶體空間

主要用來儲存大部分的物件和陣列

堆記憶體被分為新生代和老年代,新生代又被分為eden、from servivor和to survivor,新生代預設比例8:1:1

jvm申請堆記憶體的時候,堆只占用堆記憶體的一部分,方法區中的部分資料也會占用堆記憶體

程式計數器占用了jvm記憶體中很小的一塊記憶體空間

主要用來存執行緒執行的位元組碼位址

方法區只是乙個概念,在hotspot中由兩部分組成,其中一部分存放在堆中,占用jvm申請的堆記憶體(你沒看錯,是放在堆記憶體中了,物理上占用的堆記憶體,但邏輯上屬於方法區,相當於原來給堆申請的記憶體中存了堆和方法區兩塊資料,所以為了區別堆和方法區,有時候也把方法區叫做非堆);另一部分存放在元空間,直接占用伺服器的物理記憶體(也叫直接記憶體)

所以就我理解,元空間只是實現了方法區的一部分,因為方法區還有一部分在堆記憶體中

存放在元空間的資料是靜態常量池(或者叫class檔案常量池),靜態常量池中主要包括字面量(字串和基本型別常量)和符號引用(類和方法的全限定名)

存放在堆中的資料是執行時常量池(資料**於靜態常量池),執行時常量池中有乙個特別的區域叫字串常量池,儲存的是字串物件的引用(也就是字面量的記憶體位址,這個位址是執行時常量池初始化時,根據靜態常量池中的字串字面量生成的)。基本型別常量字面量也在執行時常量池中

主要管理本地native方法的呼叫

一 JVM之記憶體分割槽

jvm將執行j a程式的記憶體劃分為不同的資料區域 1.1 程式計數器 程式計數器是記憶體區域中一塊比較小的記憶體空間。它的作用就像是乙個指向正在執行的位元組碼行號的指標。改變計數器的值來指向當前要執行的位元組碼指令。並且由於j a多執行緒也是分配時間片的模式來實現的,在單核處理器過程中,執行緒的切...

dnn解讀 MT DNN原理解讀

最近大佬們接連放出大招。mt dnn還沒看,gpt2就出來了,爭取這兩天讀完把細節寫一下,一直堅持追蹤nlp預訓練模型的進展,自己工作中也用上了bert,希望nlp的發展越來越好。不了解bert的請戳這裡。正文分割線 1.mt dnn模型 1.1 模型結構 了解bert的朋友們一看這個圖估計就懂了,...

Vuex原理解讀

註冊vuex vue.usee vuex 建立store例項並匯出 export default newvuex.store getters mutations actions modules import store from store newvue mount vuex有乙個store建構函式...