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代替,元空間使用的是本地記憶體,理論上可以無限大,最大大小指受限於本地記憶體大小,所以不...