1. 程式人生 > >JAVA虛擬機器(一)記憶體管理

JAVA虛擬機器(一)記憶體管理

一.記憶體分配。java虛擬機器在執行的時候,將會包含以下執行時資料區域:

1.執行緒私有的部分:

程式計數器:可以看成是當前執行緒所執行位元組碼的行號指示器。位元組碼直譯器就是通過改變這個計數器的值來確定下一條位元組碼指令。

虛擬機器棧:虛擬機器棧為虛擬機器使用的java方法(也就是位元組碼)服務。用於儲存區域性變量表,運算元棧,動態連結,方法出口等資訊。區域性變量表存放了基本資料型別(short,int,float,long,double,byte,char,boolean),以及物件的引用(reference型別,它不等同於物件本身,可能是一個指向物件起始地址的引用指標,也可能是指向代表物件的控制代碼的位置)

本地方法棧:本地方法棧為虛擬機器使用到的native方法服務。

2.執行緒共享的部分:

java堆:用來為建立的物件分配記憶體。

方法區:用於儲存已被虛擬機器載入的類資訊,常量,靜態變數,即使編譯器編譯後的程式碼等資料。

二.物件的建立

1.記憶體分配

2.將除了物件頭的空間都分配為零值

3.對物件進行必要的設定,這部分資訊儲存在物件頭中

4.執行物件的init方法,按照程式的指令初始化物件

三.物件的記憶體佈局

分為三部分:

1.物件頭:一是儲存物件自身的執行時資料,二是儲存指向物件的類元資料的指標,虛擬機器通過這個指標來判斷這個物件是哪個類的例項;

2.例項資料:這部分才是物件真正儲存的有效資訊;

3.對齊填充:HotSpot虛擬機器要求物件的起始位置必須是8的倍數,而物件頭部分正好是8的倍數,當例項資料不是8的倍數時,由對其填充部分補齊。

四.物件的訪問定位

目前的主流方法有使用控制代碼和直接指標兩種方式

1.使用控制代碼:使用這種方法,在java堆中會分配一部分記憶體空間作為控制代碼池,棧中的reference引用指向堆中對應的控制代碼,而控制代碼包含了物件的例項資料和物件的型別資料各自的地址資訊。

2.直接指標:棧中的reference引用直接指向堆中的物件例項,而例項中會有一部分資訊記錄物件對應的型別資料的地址。HotSpot使用的該種方式執行物件訪問。