更新時間:2021-11-19 09:47:06 來源:動力節(jié)點 瀏覽882次
JVM(Java Virtual Machine)是一個抽象的機器。它是一種提供運行時環(huán)境的規(guī)范,可以在其中執(zhí)行 java 字節(jié)碼。
JVM 可用于許多硬件和軟件平臺(即 JVM 依賴于平臺)。
這是:
一個規(guī)范,其中Java虛擬機的工作被指定。但是實現提供者可以獨立選擇算法。它的實現已經由 Oracle 和其他公司提供。
一個實現它的實現被稱為 JRE(Java 運行時環(huán)境)。
運行時實例每當您在命令提示符下編寫 java 命令來運行 java 類時,就會創(chuàng)建一個 JVM 實例。
JVM 執(zhí)行以下操作:
加載代碼
驗證代碼
執(zhí)行代碼
提供運行環(huán)境
JVM 為以下各項提供了定義:
存儲區(qū)
類文件格式
寄存器組
垃圾收集堆
致命錯誤報告等。
下面我們來了解一下JVM的內部架構。它包含類加載器、內存區(qū)、執(zhí)行引擎等。
1.類加載器
Classloader是JVM的一個子系統(tǒng),用于加載類文件。每當我們運行 java 程序時,它首先由類加載器加載。Java 中有三個內置的類加載器。
(1)Bootstrap ClassLoader:這是第一個類加載器,它是 Extension 類加載器的超類。它加載rt.jar文件,其中包含 Java 標準版的所有類文件,如 java.lang 包類、java.net 包類、java.util 包類、java.io 包類、java.sql 包類等。
(2)擴展類加載器:這是 Bootstrap 的子類加載器和系統(tǒng)類加載器的父類加載器。它加載位于$JAVA_HOME/jre/lib/ext目錄中的 jar 文件。
(3)System/Application ClassLoader:這是擴展類加載器的子類加載器。它從類路徑加載類文件。默認情況下,類路徑設置為當前目錄。您可以使用“-cp”或“-classpath”開關更改類路徑。它也稱為應用程序類加載器。
//Let's see an example to print the classloader name
public class ClassLoaderExample
{
public static void main(String[] args)
{
// Let's print the classloader name of current class.
//Application/System classloader will load this class
Class c=ClassLoaderExample.class;
System.out.println(c.getClassLoader());
//If we print the classloader name of String, it will print null because it is an
//in-built class which is found in rt.jar, so it is loaded by Bootstrap classloader
System.out.println(String.class.getClassLoader());
}
}
輸出:
sun.misc.Launcher$AppClassLoader@4e0e2f2a
null
這些是 Java 提供的內部類加載器。如果要創(chuàng)建自己的類加載器,則需要擴展 ClassLoader 類。
2.類(方法)區(qū)
類(方法)區(qū)存儲每個類的結構,例如運行時常量池、字段和方法數據、方法代碼。
3.堆
它是分配對象的運行時數據區(qū)。
4.堆棧
Java Stack 存儲幀。它保存局部變量和部分結果,并在方法調用和返回中起作用。
每個線程都有一個私有 JVM 堆棧,與線程同時創(chuàng)建。
每次調用方法時都會創(chuàng)建一個新框架。框架在方法調用完成時被銷毀。
5.程序計數器寄存器
PC(程序計數器)寄存器包含當前正在執(zhí)行的Java虛擬機指令的地址。
6.本地方法棧
它包含應用程序中使用的所有本機方法。
7.執(zhí)行引擎
它包含了:
虛擬處理器
解釋器:讀取字節(jié)碼流然后執(zhí)行指令。
即時(JIT)編譯器:用于提高性能。JIT 同時編譯具有相似功能的部分字節(jié)碼,從而減少編譯所需的時間。這里,術語“編譯器”是指從 Java 虛擬機 (JVM) 的指令集到特定 CPU 的指令集的翻譯器。
8.Java 本地接口
Java Native Interface (JNI) 是一個框架,它提供了一個接口來與用另一種語言(如 C、C++、Assembly 等)編寫的另一個應用程序進行通信。Java 使用 JNI 框架將輸出發(fā)送到控制臺或與操作系統(tǒng)庫交互。
通過上述相信大家對JVM虛擬機的架構已經有所了解,若想了解更多相關知識,不妨來關注一下動力節(jié)點的Java虛擬機視頻,里面有更多的知識在等著大家去學習,希望對大家能夠有所幫助。