java虛擬機在執行java程序的過程當中會把它所管理的內存劃分爲若干個不一樣的數據區域,
這些區域都有各自的用途,建立和銷燬時間java
圖:數組
程序計數器是一個較小的內存空間,它的做用能夠看作是當前線程所執行的字節碼的行
號指示器,其中字節碼解釋器工做時就是經過改變這個計數器的值來選取下一條須要執行的
字節碼指令(分支、循環、跳轉、異常處理、線程恢復等基礎功能),因爲java虛擬機的多
線程是經過線程輪流切換並分配處理器執行時間的方法來實現的,每條線程都須要一個獨立
的程序計數器——這類內存區域稱爲線程私有內存(若線程執行的是一個java方法,則計數器
記錄的是正在執行的虛擬機字節碼指令的地址,若執行的是Native方法,計數器值則爲空)
虛擬機棧也是線程私有的,生命週期如同線程,每一個方法被執行都會建立一個棧幀(方
法運行期的基礎數據結構)用於存儲局部變量表、操做棧、動態連接、方法出口等——每個
方法被調用直至執行完成的過程,就對應着一個棧幀在虛擬機棧中從入棧到出棧的過程
局部變量表存放了編譯期的各類基本數據類型(boolean、byte、char、short、int、
float、long、double)、對象引用(reference類型,它多是一個指向對象起始地址的引
用指針,也多是指向一個表明的句柄或其它與此對象相關的位置)和returnAddress類型(
指向了一條字節碼指令的地址),其中long和double類型佔2個局部變量空間,其他數據類型
只佔1個——局部變量表所需的內存空間在編譯期間完成分配
堆是虛擬機所管理的內存中最大的一塊,被全部線程共享,在虛擬機啓動時建立,它的做
用是存放對象實例及數組,垃圾收集器管理的主要區域——GC堆(Garbage Collected Heap),
可經過-Xmx和-Xms控制進行擴展
本地方法棧和虛擬機棧的區別:虛擬機棧爲虛擬機執行java方法(字節碼)服務,而本地
方法棧是爲虛擬機使用到的Native方法服務,有些虛擬機直接把本地二者合二爲一——Sun HotSpot
虛擬機
方法區(NonHeap)與堆同樣,也是線程共享的區域,它的做用是存儲已被虛擬機加載的類
信息、常量、靜態常量、即時編譯器編譯後的代碼等數據——常量池的回收和類型的卸載,運行時
常量池是方法區的一部分,Class文件中除了有類的版本、字段、方法、接口等信息外,還有常量
池用於存放編譯期生成的各類字面量和符合引用,加載後存放到方法區的運行時常量池中
對象的主流訪問方式有兩種:句柄和直接指針
句柄訪問方式:數據結構
圖:線程
直接指針訪問方式:3d
圖:指針
Sun HotSpot虛擬機採用的是直接指針訪問方式對象