一:簡介
在學習Java虛擬機器之前,也就是Jvm之前,我想大家能夠帶著問題去學習,這樣的話,大家學習起來也會比較有所獲!
1。
Java
虛擬機器(Jvm)是什麼?
2。Java虛擬機器是用來幹什麼的?
3。Java虛擬機器它的體系結構是什麼樣子的?
4。Java虛擬機器在工作做扮演什麼角色?
5。Java虛擬機器在執行時資料區?
二:Jvm基礎概念
Java虛擬機器(Jvm)是可執行Java程式碼的假想計算機
Java虛擬機器包括一套位元組碼指令集、一組暫存器、一個棧、一個垃圾回收堆和一個儲存方法域。
三:Jvm
我們都知道Java原始檔,透過編譯器,能夠生產相應的。Class檔案,也就是位元組碼檔案,而位元組碼檔案又透過Java虛擬機器中的直譯器,也就是前面所有的Java虛擬機器中的位元組碼指令集…。編譯成特定機器上的機器碼
也就是如下:
1。Java原始檔—->編譯器—->位元組碼檔案
2。位元組碼檔案—->Jvm—->機器碼
每一種平臺的直譯器是不同的,但是實現的虛擬機器是相同的。這也就是Java為什麼能夠跨平臺的原因了
當一個程式從開始執行一個程式,這時虛擬機器就開始例項化了。多個程式啟動就會存在多個虛擬機器例項。程式退出或者關閉。則虛擬機器例項消亡。多個虛擬機器例項之間資料不能共享。
四:Jvm的體系結構
Jvm的體系結構入下圖:
1、垃圾回收器
垃圾回收器(又稱為gc):是負責回收記憶體中無用的物件(好像地球人都知道),就是這些物件沒有任何引用了,它就會被視為:垃圾,也就被幹掉了。
2、類裝載子系統
一聽名字,大家就知道,肯定是用於操作我們編譯好的。Class檔案的系統,他作用如下:
v 定位和匯入二進位制class檔案
v 驗證匯入類的正確性
v 為類分配初始化記憶體
v 幫助解析符號引用
3、執行引擎(Execution Engine)
執行包在裝載類的方法中的指令,也就是方法
4、執行區資料
如上圖:虛擬機器記憶體或者Jvm記憶體,衝整個計算機記憶體中開闢一塊記憶體儲存Jvm需要用到的物件,變數等,執行區資料有分很多小區,分別為:方法區,虛擬機器棧,本地方法棧,堆,程式計數器
五:Jvm執行時資料區
1。程式計數器
當前執行緒執行位元組碼的訊號指示器,執行緒是私有的,它的生命週期和執行緒相同分支、迴圈、跳轉、異常處理、執行緒恢復等基礎功能都需要依賴這個計數器來完成。
2。虛擬機器棧
Java虛擬機器棧描述的是Java方法(區別於native的本地方法)執行的記憶體模型:每個方法被執行的時候都會同時建立一個棧幀(Stack Frame)用於儲存區域性變量表、操作棧、動作連結、方法出口等資訊。
執行緒私有,生命週期和執行緒相同,都有各個獨立的計數器,各不影響。
每個方法被呼叫直至執行完成的過程,就對應著一個棧幀在虛擬機器棧中從入棧到出棧的過程。
3。本地方法棧
和虛擬機器方法棧差不多類似,但是本地方法棧是服務於虛擬機器所
使用到的Native方法服務
4。本地方法區:
只是執行Native 方法。
如果這個區的記憶體不足也是會丟擲StackOverflowError 和OutOfMemoryError 異常。
六:堆
堆這塊區域是Jvm中最大的,應用的物件和資料都是存在這個區域。這塊區域也是執行緒共享的。也是 gc 主要的回收區。
其實這也就是大家聽的比較多的:Java (gc)垃圾回收器