標籤:填充 常量 位元組碼 class 定址 階段 方法區 初始化 string
1、運行時資料區域
1.1、程式計數器
線程私人,當前線程所執行的位元組碼行號指標,
Java虛擬機器的多線程是通過線程輪流切換處理器執行時間的方式來分配
1.2、Java虛擬機器棧
線程私人,,虛擬機器的局部變數表每個方法在執行的時候都會建立棧幀用於儲存局部變數,運算元棧,動態連結方法出口等資訊,每個方法從開始到結束
對應著一個棧幀從入棧到出棧的過程,
1.3、本地方法棧
線程私人,本地方法棧是為虛擬機器執行native方法服務,有的虛擬機器獎本地方法棧與虛擬機器棧合二為一。
1.4、Java堆
GC堆,垃圾收集器管理的主要區域,用於存放對象執行個體,幾乎所有的Java對象執行個體都在這裡分配空間,
1.5、方法區
用於存放虛擬機器載入的類資訊,常量,靜態變數,方法區中包含的都是在整個程式中永遠唯一的元素,如class,static變數
1.6、運行時常量池
JVM在執行某個類的時候,必須經過載入、串連、初始化,而串連又包括驗證、準備、解析三個階段。
而當類載入到記憶體中後,jvm就會將class常量池中的內容存放到運行時常量池中,由此可知,運行時常量池也是每個類都有一個。
在解析階段,會把符號引用替換為直接引用,解析的過程會去查詢字串常量池,也就是我們上面所說的StringTable,
以保證運行時常量池所引用的字串與字串常量池中是一致的。
1.7、直接記憶體
Java使用naive函數庫直接分配堆外記憶體,避免了在java堆和native堆中來回複製資料
2、hotspot虛擬機器
2.1、對象的建立
如果java虛擬機器的空閑記憶體是連續的,直接向後挪出一段與對象大小相等的距離,稱為 指標碰撞
如果不連續,則從剩餘記憶體中尋找出足夠大小的記憶體存放,稱 為 空閑列表方式
如何避免安全執行緒
為每個線程分配空間
cas配上失敗重試
2.2對象的記憶體布局
對象頭:運行時的自身資料(雜湊碼,gc分代年齡,鎖狀態)、類型指標
執行個體資料:對象真正儲存的資料
對齊填充:每個對象的起始地址必須為8位元組的整數倍
2.3 對象的訪問定位
控制代碼訪問:reference指向控制代碼池接著再指向具體對象,避免了對象的修改而需要修改reference的修改,增加了一次定址
直接指標定位:直接指向具體對象,
java虛擬機器 第二章Java記憶體地區與記憶體溢出異常