什麼是jvm?
java程序本身獨立運行環境,包括堆棧、寄存器和java字節碼的指令集。java
jvm上能夠運行的語言
jvm、jdk和jre
jvm:jvm是jre的一部分jvm
jre:java運行環境,包含jvm函數
jdk:包含工具
- jre
- jvm
- 經常使用的一些開發工具,javac、java和jconsol等等
生命週期
main方法是jvm實例運行的起點,main做爲程序初始線程的起點,任何其餘線程都由該線程負責啓動,main線程是非守護線程。開發工具
jvm實例消亡的方法:線程
- 全部的非守護線程都終止時
- System.exit()
組成
- 類加載器子系統(class loader)
- 執行引擎子系統
- 運行時數據區(runtime data area)
- Native接口
運行流程
- 首先將java源代碼經過javac指令編譯成字節碼文件
- 字節碼文件經過class loader進行加載
- 將類的權限修飾、類名、成員變量修飾、成員變量、方法修飾、方法參數和方法返回值等等放入運行時數據區的方法區;將new出來的對象放入堆中,類的靜態變量放入堆的常量池中;將對象索引放入VM棧裏;調用本地方法放入本地方法棧;PC寄存器根據線程數分配,用於存放代碼讀取行數。
- 執行引擎根據運行時數據區調用本地庫接口和本地方法庫
Class loader
負責加載字節碼到jvm中,根據類中定義的內容分配到不一樣的運行時數據區對象
分類:
- Bootstrap ClassLoader:classLoader的根,rt.jar
- Extension ClassLoader
- Application ClassLoader
- 用戶自定義類加載器
加載過程:
- 加載 負責找到class文件,並加載到jvm中
- 鏈接
- 校驗 確保類的格式正確
- 準備 爲類中的變量分配內存空間,並初始化默認值
- 解析 符號引用轉換爲直接引用
- 初始化 執行靜態代碼塊,構造器,靜態屬性,在調用new,反射調用類中的方法,子類調用初始化函數