本文源碼:GitHub·點這裏 || GitEE·點這裏java
虛擬機(Virtual Machine)指經過軟件模擬的具備完整硬件系統功能的、運行在一個徹底隔離環境中的完整計算機系統。在實體計算機中可以完成的工做在虛擬機中都可以實現。在計算機中建立虛擬機時,須要將實體機的部分硬盤和內存容量做爲虛擬機的硬盤和內存容量。每一個虛擬機都有獨立的CMOS、硬盤和操做系統,能夠像使用實體機同樣對虛擬機進行操做。git
JVM是Java-Virtual-Machine的縮寫,即Java虛擬機,JVM是一種用於計算設備的規範,它是一個虛構出來的計算機,是經過在實際的計算機上仿真模擬各類計算機功能來實現的。github
首先一次編譯到處運行是學習Java語言都知道的事情,其實並非Java語言跨平臺,是JVM跨平臺,Jvm運行時並非執行Java文件,而是執行編譯後的.class文件。編程
字節碼數據結構
字節碼文件即JVM能夠識別並執行的二進制文件,不一樣的編程語言通過編譯器編譯處理以後,轉換成統一的字節碼規範文件,這樣JVM就能夠執行。框架
跨平臺jvm
跨平臺的特性即JVM虛擬機能夠運行在不一樣的計算機系統上,例如常用的Linux系統,MacOS系統,Win系統,一次編譯,到處運行就是這樣理解的。編程語言
跨語言分佈式
隨着JVM的不斷髮展和優化,不少語言都藉助JVM的能力,各類編程語言通過編譯,轉換爲字節碼文件,JVM均可以識別,這也是如今Java體系下業務編程常常混語言的緣由。源碼分析
注意:如今和後續Jvm系列文章都是基於HotSpot-VM和JDK1.8+版本的基礎之上。
Jvm的總體結構大體以下:
類加載器用來加載Java類到JVM虛擬機中,源代碼程序.java文件在通過編譯器編譯以後就被轉換成字節代碼.class文件,類加載器負責讀取字節代碼,並轉換成java.lang.Class類的一個實例。
元數據區
JDK1.8開始的說法,以前稱爲方法區Method-Area,存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。
堆區
全部線程共享的一塊內存區域,虛擬機啓動時被建立用來存放對象實例。
JVM棧
能夠參考瞭解棧的數據結構,存放Java方法執行的內存模型,在Java開發中,一個功能實現須要多個子程序方法配合,程序執行時跳往子程序前,會將下個指令的地址存到堆棧中,直到子程序執行完後再將地址取出,退回到原來的程序中。
本地方法棧
本地方法棧和虛擬機棧的功能相似,爲JVM調用native方法時服務。
程序計數器
相對較小的一塊內存空間,做用能夠理解是當前線程所執行的字節碼的行號指示器。
Java虛擬機最核心的組成部分,輸入的是字節碼,處理過程是字節碼解析,輸出執行結果。
這裏說的JVM生命週期,指JVM執行Java程序時的週期:
啓動初始化:啓動時經過引導類加載器建立初始類完成;
程序執行:從main方法開始,執行Java程序,直到程序執行完結束;
虛擬機退出:程序正常執行結束,或者發生異常、錯誤等而形成終止,也能夠調用exit退出方法;
HotSpot是Java體系下使用最多的虛擬機,它結合了最新的內存模型,垃圾收集器和自適應優化器,爲使用許多先進技術的Java應用程序提供了最佳性能。
主要緣由:使用多,大部分的Java運行環境都依賴HotSpot虛擬機。
GitHub·地址 https://github.com/cicadasmile/java-base-parent GitEE·地址 https://gitee.com/cicadasmile/java-base-parent
推薦閱讀:數據源管理系列