JVM內存模型包括 堆 (Heap)、方法區(Method Area)、程序計數器(PC Register)、虛擬機棧(JVM Stacks)、本地方法棧(Native Method Stacks)
一、Java加載過程:
Java Source 需要經過Javac 命令編譯為Java class 字節碼文件,才能夠被Java虛擬機所執行,同樣這個字節碼文件是一個可以跨平台的,適用於不同平台的機器碼。
執行Javac 命令后會創建一個Java虛擬機並創建一個叫 main 的主線程 ,執行主方法,這個線程需要虛擬機棧(JVM Stacks)來分配內存,同樣Java創建的其他的一些線程也是同樣的。Java方法、局部變量、方法參數等也存放在這里
JVM 見到一個新的類,就會觸發類加載機制,由類加載子系統對類進行加載
二、JVM內存結構:
方法區:將類的原始信息(類名、成員變量、類繼承關系、方法代碼等)讀取到內存當中,將此字節碼信息,讀取到內存中的方法區中
堆:類創建的實例對象存放在堆中
本地方法棧:需要調用操作系統來執行的一些方法例如:hashcode ,調用本地方法接口->本地庫(操作系統提供的功能)
注:有的版本的JVM會將虛擬機棧和本地方法棧合二為一,統稱虛擬機棧
程序計數器:用來記錄當前線程執行到什么地方,即使線程被切換走了,也可以切回來,而不需要重新開始執行
三、執行引擎:
Interpreter 解釋器:將Java 字節碼翻譯成機器碼,給操作系統 cpu執行
JITCompiler 即時編譯器:對於執行頻繁的熱聯代碼 需要經常解釋的,用到即時編譯器將他緩存起來,少了解釋的步驟,執行效率就有了很大的提升。
GC回收:JVM會將失去引用的對象進行垃圾回收,具體回收細節,我將在下一篇博客講到