JAVA 是解釋程序 解釋程序是將源程序的一條語句翻譯成對應於機器語言的一條語句 而且當即執行這條語句 接着翻譯原程序的下一條語句 並執行這條語句 重複直到完成原程序的所有翻譯任務數組
字節碼解釋器工做是就是經過改變這個計數器的值來選取下一條須要執行指令的字節碼指令 分支 循環 跳轉 異常處理 線程恢復等基礎功能都須要依賴計數器完成spa
每一個方法在執行時會建立一個棧幀 Stack Frame 存儲局部變量表 操做數棧 動態連接 方法出口等信息 每個方法從調用到執行結束,就對應着一個棧幀從虛擬機棧中從入棧到出棧的過程線程
局部變量表:包括基本引用類型 returnAddress 類型以及對象引用類型翻譯
爲 Native 方法服務指針
主要存放對象實例和數組 內部會劃分出多個線程私有的分配緩衝區 (Thread Local Allocation Buffer, TLAB)。能夠位於物理上不連續的空間 可是邏輯上要連續code
對象和實例: Animal animal = new Animal(); new 的時候在 JAVA 堆中新建了一個對象 這個對象是 Animal 的實例 animal 是對該對象的引用 !萬物皆是對象!對象
若是 JAVA 堆中沒有內存完成實例分配 而且堆也沒辦法擴展的時候 拋出 OutOfMemoryError blog
屬於共享內存區域 存儲已被虛擬機加載的類信息 常量 靜態變量 即時編譯器編譯後的代碼等數據繼承
用於存放編譯期生成的各類字面量和符號引用內存
非虛擬機運行時數據區的部分
HotSpot 虛擬機中分爲三個區域:對象頭 實例數據和對象填充
Mark Word 用於存儲對象自身的運行時數據 如 HashCode GC 分代年齡 鎖狀態標誌 線程持有的鎖 偏向線程 ID 偏向時間戳等等 佔用內存大小與虛擬機位長一致
類型指針指向對象的類元數據 虛擬機經過這個指針肯定該對象是哪一個類的實例
HotSpot 經過 markOop 類型實現 Mark Word 具體實現位於 markOop.hpp
文件中 markOop 中不一樣的鎖標識位 表明着不一樣的鎖狀態 不一樣的鎖狀態 存儲着不一樣的數據 markOop 中提供了大量方法用於查看當前對象頭的狀態 以及更新對象頭的數據 爲 synchronized 鎖的實現提供了基礎
程序代碼中所定義的各類類型的字段內容(包含父類繼承下來的和子類中定義的)
不是必然須要,主要是佔位 保證對象大小是某個字節的整數倍
在建立一個實例以後 經過虛擬機棧中的 reference 類型數據操做堆上的對象 如今主流的方式有兩種:使用句柄訪問對象和直接指針訪問對象
句柄訪問對象:referen 中存的是對象句柄的地址 句柄中包括對象實例數據與類型數據的具體地址信息 至關於二級指針
直接指針訪問對象: reference 存的就是對象的地址 至關於一級指針
兩種方式有各自的優缺點 當垃圾回收移動對象時 對於方式一而言 reference 中存儲的地址是穩定的地址 不須要修改 僅須要修改對象句柄的地址 而對於方式二 則須要修改 reference 中存儲的地址 從訪問效率上看 方式二優於方式一 由於方式二隻進行了一次指針定位 節省了時間開銷 而這也是HotSpot採用的實現方式