JAVA 虚拟机 (SE 7)【待更】
JAVA 是解釋程序 解釋程序是將源程序的一條語句翻譯成對應于機器語言的一條語句 并且立即執行這條語句 接著翻譯原程序的下一條語句 并執行這條語句 重復直到完成原程序的全部翻譯任務
程序計數器
字節碼解釋器工作是就是通過改變這個計數器的值來選取下一條需要執行指令的字節碼指令 分支 循環 跳轉 異常處理 線程恢復等基礎功能都需要依賴計數器完成
JAVA 虛擬機棧(描述的是 JAVA 方法執行的內存模型)
每個方法在執行時會創建一個棧幀 Stack Frame 存儲局部變量表 操作數棧 動態鏈接 方法出口等信息? 每一個方法從調用到執行結束,就對應著一個棧幀從虛擬機棧中從入棧到出棧的過程
局部變量表:包括基本引用類型 returnAddress 類型以及對象引用類型
本地方法棧
為 Native 方法服務
JAVA 堆
主要存放對象實例和數組?內部會劃分出多個線程私有的分配緩沖區 (Thread Local Allocation Buffer, TLAB)。可以位于物理上不連續的空間 但是邏輯上要連續
對象和實例: Animal animal = new Animal();? new 的時候在 JAVA 堆中新建了一個對象 這個對象是 Animal 的實例 animal 是對該對象的引用? !萬物皆是對象!
如果 JAVA 堆中沒有內存完成實例分配 并且堆也沒辦法擴展的時候 拋出?OutOfMemoryError?
方法區
屬于共享內存區域 存儲已被虛擬機加載的類信息 常量 靜態變量 即時編譯器編譯后的代碼等數據
運行時常量池
用于存放編譯期生成的各種字面量和符號引用
直接內存
非虛擬機運行時數據區的部分
?
new 新對象的過程
?
?
HotSpot 虛擬機
HotSpot 虛擬機中分為三個區域:對象頭 實例數據和對象填充
對象頭(Mark Word 和類型指針)
Mark Word 用于存儲對象自身的運行時數據 如 HashCode? GC 分代年齡 鎖狀態標志 線程持有的鎖 偏向線程 ID 偏向時間戳等等 占用內存大小與虛擬機位長一致
類型指針指向對象的類元數據 虛擬機通過這個指針確定該對象是哪個類的實例
HotSpot 通過 markOop 類型實現 Mark Word 具體實現位于?markOop.hpp?文件中?markOop 中不同的鎖標識位 代表著不同的鎖狀態?不同的鎖狀態 存儲著不同的數據??markOop 中提供了大量方法用于查看當前對象頭的狀態 以及更新對象頭的數據 為 synchronized 鎖的實現提供了基礎
實例數據
程序代碼中所定義的各種類型的字段內容(包含父類繼承下來的和子類中定義的)
對象填充
不是必然需要,主要是占位 保證對象大小是某個字節的整數倍
?對象的訪問定位
在創建一個實例之后 通過虛擬機棧中的 reference 類型數據操作堆上的對象 現在主流的方式有兩種:使用句柄訪問對象和直接指針訪問對象
句柄訪問對象:referen 中存的是對象句柄的地址 句柄中包括對象實例數據與類型數據的具體地址信息 相當于二級指針
直接指針訪問對象: reference 存的就是對象的地址 相當于一級指針
兩種方式有各自的優缺點 當垃圾回收移動對象時 對于方式一而言 reference 中存儲的地址是穩定的地址 不需要修改 僅需要修改對象句柄的地址 而對于方式二 則需要修改 reference 中存儲的地址 從訪問效率上看 方式二優于方式一 因為方式二只進行了一次指針定位 節省了時間開銷 而這也是HotSpot采用的實現方式?
垃圾回收器和內存分配策略
?
轉載于:https://www.cnblogs.com/zlrrrr/p/11260065.html
總結
以上是生活随笔為你收集整理的JAVA 虚拟机 (SE 7)【待更】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java学习笔记---接口
- 下一篇: 2018牛客网暑期ACM多校训练营(第十