JVM執行時資料區

2022-09-11 15:36:19 字數 1487 閱讀 1753

1.1.hotspot vm 是之前使用最廣泛的j**a虛擬機器,

1.2.jrockit vm 是bea 開發的一款虛擬機器是 號稱 "執行最快的j**a虛擬機器"、

1.3.j9 vm 是ibm開發的一款虛擬機器

1.4.dalvik vm 是google 開發的一款移動端虛擬機器

1.5 taobaovm 是阿里巴巴研發團隊開發的一款虛擬機器

總結: 現在oeacle 收購了 sun 和 bea 將hotspot 和jrockit 兩款虛擬機器合併

2.1.jvm 在執行過程中會將它管理的記憶體劃分成若干個不同的區域

執行緒共享:堆、方法區

執行緒私有: 程式計數器、虛擬機器棧,本地方法棧

2.2.程式計數器 

程式計數器(program counter  register)是一塊較小的記憶體空間,是指向當前執行緒正在執行的位元組碼指令的位址或者行號

因為j**a是多執行緒和cup時間片輪轉機制演算法,導致執行緒上下文切換,所以當執行緒恢復執行的時需要保證程式的正常執行,需要記錄之前執行緒執行的位置

如果執行緒執行j**a方法,這個計數器記錄的是正在執行的虛擬機器位元組碼指令的位址,如果執行的是native方法,計數器的值為undefined

程式計數器也是jvm中唯一不會發生oom(outofmemory)

的區域

2.3.虛擬機器棧

特點:是先進後出、入口和出口只有乙個棧,是一種資料結構

虛擬機器棧的大小預設為 1m, 可用引數 –xss 調整大小, 例如-xss512k

引數官方文件(jdk1.8) :

2.4.方法區或者元空間

儲存類資訊(位元組碼)、常量、靜態變數,

jdk1.7以前叫方法區,通過 -xx:permsize 和-xx:maxpermsize 設定其大小

jdk1.8之後叫元空間,通過-xx:metaspacesize 和-xx:maxmetaspacesize

修改方法區為元空間的是因為方法區儲存類,常量、靜態變數容易出現記憶體溢位、對元空間的呼叫很難優化,

同時將元空間和堆的垃圾**進行隔離、避免進行full gc和oom

2.5.堆

儲存例項變數,物件 通過引數-xms 和-xmx 設定其大小

常量池中存放的是字面量

jdk1.6以前常量池是在方法區中

jdk1.7以後常量池存放在堆中      

JVM執行時資料區

根據 jvm 規範,jvm 記憶體共分為虛擬機器棧 堆 方法區 程式計數器 本地方法棧五個部分。記憶體空間 runtime data area 中可以按照是否執行緒共享分為兩塊,執行緒共享的是方法區 method area 和堆 heap 執行緒獨享的是虛擬機器棧 vm stack 本地方法棧 na...

JVM 執行時資料區

jdk版本 8 class檔案 class content class物件 物件 的含義 class檔案 儲存在磁碟上的.class檔案 十六進製制位元組碼檔案 class content 類載入器子系統載入class檔案,儲存到記憶體中的位元組流,解析前這塊記憶體區域叫class content ...

JVM執行時資料區 方法區

在hotspot jvm實現當中,在jdk8以前,方法區的實現為permgen,即永久代,主要存放類的資訊,方法的資訊,常量池,靜態變數,符號解析 而jdk8 則去除了permgen,使用元空間metaspace代替,元空間使用的是本地記憶體,理論上可以無限大,最大大小指受限於本地記憶體大小,所以不...