從零開始學習JVM

對於大部分學習Java語言的人來說,JVM是一個無法避免的必要知識點,接下來我將分享一下我的jvm學習筆記,希望能夠給予各位一點幫助。

什麼是jvm

Java virtual machine(java虛擬機),它是一種規範,虛構的一個計算機(有自己的字節碼指令集和內存管理),也可稱之爲跨語言的平臺,無論何種語言,只要編譯爲class文件,那麼jvm就可以識別運行。
自己的理解:jvm可理解爲一個黑盒子,它有兩個口,一個用以接收class文件,內部經過一系列處理,從另一個口將命令傳出去調用操作系統具體的指令,來完成自己的功能。可以說是類加載器、解釋器、JIT編譯器、執行引擎的集合,jvm只是給這個集合起的一個名字,只是方便人們用來交流而已。
在java中的地位可參考下圖:
在這裏插入圖片描述

class文件

可以這麼理解,class文件只是多種文件類型中的一種,有自己的獨特格式,和txt文件、html文件類似,只是格式不同而已;這是jvm能夠識別、解析的一種文件格式。
class文件內容:魔數(標識這是一個class文件)、 版本號、常量池大小、具體常量池…、當前類、接口、字段、屬性、指令等信息。

類加載的過程

類加載包含3步,第一,loading(從磁盤讀入內存);第二,linking(verification(驗證文件是否符合jvm規範、preparation(靜態成員變量賦默認值)、resolution(將類、方法、屬性等符號引用解析爲直接引用));第三,initializing(靜態變量 初始化)。
jvm是按需動態加載類的,採用雙親委派機制(保證安全性)
在這裏插入圖片描述
過程描述:當需要加載一個類時,先獲取自己的類加載器,詢問是否該類已經加載,如是,則已加載直接使用,如否,則依次向自己的上級加載器詢問,直到最上級Bootstrap,如果還沒有加載,則判斷該類是否在自己加載的範圍,是,則加載,否,依次向下判斷。類加載器之間並不是語法上的父子關係只是人爲定義的上下級而已。

注:類加載 loading、linking、initializing
對象創建 申請內存、賦默認值、初始化

自定義類加載器

1.繼承ClassLoad
2.重寫findClass() 或者 loadClass()

注:像Tomcat等一般都有自己的類加載器,以此來實現熱部署(丟棄以前的類,重新加載新類 需要重寫loadClass方法)這種方法可以破壞雙親委派機制;重寫findClass來實現自定義類加載器,這種寫法不會破壞雙親委派機制。

jvm中代碼的執行模式

編譯與解釋混合進行。一般情況下,jvm會使用字節碼解釋器對代碼解釋執行;對於熱點代碼,jvm會使用JIT編譯器將代碼編譯爲本地機器語言來執行。

Java Runtime Data Area(運行時數據區)

1.PC program counter 程序計數器,線程私有,存放指令的位置

2.虛擬機棧 線程私有,每個線程一個棧,棧裏存放一個個的棧幀 每個方法一個棧幀,每個棧幀包含:

   	- 本地變量表 Local Variable Table  存放方法裏的參數、局部變量
   	- 操作數棧 Operated Stack  對本地變量表裏的數據操作的棧
   	- 動態鏈接 Dynamic Linking   保存着字符引用所代表的內存地址
   	- 返回地址 return address   方法結束後返回值應去哪

native stack 本地方法棧,類似於虛擬機棧,只是用來存放本地方法
3.方法區 (Method Area)線程共享,也稱爲永久代,堆外的一塊空間
存放class的元數據信息,靜態變量等信息

- perm space   1.8之前的方法區  字符串常量位於PermSpace FGC不會清理 大小啓動的時候指定,不能變
- meta space  1.8之後的方法區 字符串常量位於堆 會觸發FGC清理 不設定的話,最大就是物理內存

4.堆(heap) 線程共享
存放對象信息,創建的對象會保存在堆中

5.Direct Memory(直接內存)
jvm可以直接訪問的內核空間的內存,也可稱爲有操作系統管理的內存
用途
NIO,以此實現zero copy ,來提升效率。
注:一般來說對於IO數據會放在內核空間,當jvm需要該數據時會從內核空間拷貝到jvm的內存空間

常見的指令

1.load    讀操作
2.store   寫操作
3.pop   彈棧
4.add  加
5.sub  減
6.mul   乘
7.div  除
8.invokeStatic   調用靜態方法
9.invokeInterface   接口引用調用子類方法
10.invokeSpecial     調用構造方法 或  private修飾的方法
11.invokeDynamic   在使用lambda表達式等動態生成類時使用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章