JVM
JVM->Java Virtual Machine:Java虛擬機,是一種用于計算設備的規(guī)范,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現(xiàn)的。
基本認知:
- 1.JVM是用于運行Java代碼的假象計算機,主要有一套字節(jié)碼指令集,一組寄存器,一個棧,一個垃圾回收,堆 和 一個存儲方法域。
- 2.JVM運行在操作系統(tǒng)之上,與硬件沒有直接的交互。
Java程序執(zhí)行過程:
- 1.編譯->源文件由編譯器編譯成字節(jié)碼[ByteCode]
Java 源文件—->編譯器—->字節(jié)碼文件
- 2.運行->字節(jié)碼由java虛擬機解釋運行
字節(jié)碼文件—->JVM—->機器碼
Java類的加載步驟:
通過類的全限定名來獲取定義類的二進制字節(jié)流
將字節(jié)流所代表的靜態(tài)存儲結(jié)構轉(zhuǎn)化為方法區(qū)的運行時數(shù)據(jù)結(jié)構
在內(nèi)存中生成一個代表這個類的java.lang.Class對象,作為方法區(qū)這個類的各種數(shù)據(jù)的訪問入口。
文件格式驗證
元數(shù)據(jù)驗證
字節(jié)碼驗證
符號引用驗證
- 3.準備->為類變量(static)分配內(nèi)存并設置類變量的初始值。
- 4.解析->將常量池內(nèi)的符號引用轉(zhuǎn)為直接的引用
- 5.初始化->按照static塊和static變量在文件中的出現(xiàn)順序,合并到()方法中。實例變量由()函數(shù)賦值。
JVM線程實體:
JVM線程->程序執(zhí)行過程中的一個線程實體,JVM 允許一個應用并發(fā)執(zhí)行多個線程。
從此,我們應該意識到,在Java中,當提到線程就應該是指JVM線程和Java線程。其中JVM線程指的是Hotspot JVM 后臺運行的系統(tǒng)線程,而且Hotspot JVM 中的 Java 線程與原生操作系統(tǒng)線程有直接的映射關系。
??[注意事項]:
[1].當線程本地存儲、緩沖區(qū)分配、同步對象、棧、程序計數(shù)器等準備好以后,就會創(chuàng)建一個操作系統(tǒng)原生線程。
[2].Java 線程結(jié)束,原生線程隨之被回收。操作系統(tǒng)負責調(diào)度所有線程,并把它們分配到任何可用的 CPU 上。
[3].當原生線程初始化完畢,就會調(diào)用 Java 線程的 run() 方法。當線程結(jié)束時,會釋放原生線程和 Java 線程的所有資源
特別需要知道的是,Hotspot JVM 后臺運行的系統(tǒng)線程主要是:
- 虛擬機線程->VM thread:等待 JVM 到達安全點操作出現(xiàn)。這些操作必須要在獨立的線程里執(zhí)行,因為當堆修改無法進行時,線程都需要 JVM 位于安全點。這些操作的類型有:stop-theworld垃圾回收、線程棧 dump、線程暫停、線程偏向鎖(biased locking)解除。
- 周期性任務線程->負責定時器事件(也就是中斷),用來調(diào)度周期性操作的執(zhí)行
- GC線程->支持 JVM 中不同的垃圾回收活動
- 編譯器線程->在運行時將字節(jié)碼動態(tài)編譯成本地平臺相關的機器碼
- 信號分發(fā)線程->程接收發(fā)送到 JVM 的信號并調(diào)用適當?shù)?JVM 方法處理
JVM內(nèi)存
版權聲明:本文為博主原創(chuàng)文章,遵循相關版權協(xié)議,如若轉(zhuǎn)載或者分享請附上原文出處鏈接和鏈接來源。
|