㈠ 簡述jvm工作原理
java是一種技術,它由四方面組成:Java編程語言、Java類文件格式、Java虛擬機和Java應用程序介面(Java API)。
運行期環境代表著Java平台,開發人員編寫Java代碼(.java文件),然後將之編譯成位元組碼(.class文件),再然後位元組碼被裝入內存,一旦位元組碼進入虛擬機,它就會被解釋器解釋執行,或者是被即時代碼發生器有選擇的轉換成機器碼執行。
Java平台由Java虛擬機和Java應用程序介面搭建,Java語言則是進入這個平台的通道,用Java語言編寫並編譯的程序可以運行在這個平台上。
在Java平台的結構中, 可以看出,Java虛擬機(JVM) 處在核心的位置,是程序與底層操作系統和硬體無關的關鍵。它的下方是移植介面,移植介面由兩部分組成:適配器和Java操作系統, 其中依賴於平台的部分稱為適配器;JVM 通過移植介面在具體的平台和操作系統上實現;在JVM 的上方是Java的基本類庫和擴展類庫以及它們的API, 利用Java API編寫的應用程序(application) 和小程序(Java applet) 可以在任何Java平台上運行而無需考慮底層平台, 就是因為有Java虛擬機(JVM)實現了程序與操作系統的分離,從而實現了Java 的平台無關性。
JVM在它的生存周期中有一個明確的任務,那就是運行Java程序,因此當Java程序啟動的時候,就產生JVM的一個實例;當程序運行結束的時候,該實例也跟著消失了。下面我們從JVM的體系結構和它的運行過程這兩個方面來對它進行比較深入的研究。
1、Java虛擬機的體系結構
·每個JVM都有兩種機制:
①類裝載子系統:裝載具有適合名稱的類或介面
②執行引擎:負責執行包含在已裝載的類或介面中的指令
·每個JVM都包含:
方法區、Java堆、Java棧、本地方法棧、指令計數器及其他隱含寄存器
2、Java代碼編譯和執行的整個過程
也正如前面所說,Java代碼的編譯和執行的整個過程大概是:開發人員編寫Java代碼(.java文件),然後將之編譯成位元組碼(.class文件),再然後位元組碼被裝入內存,一旦位元組碼進入虛擬機,它就會被解釋器解釋執行,或者是被即時代碼發生器有選擇的轉換成機器碼執行。
(1)Java代碼編譯是由Java源碼編譯器來完成,也就是Java代碼到JVM位元組碼(.class文件)的過程。
2)Java位元組碼的執行是由JVM執行引擎來完成
Java代碼編譯和執行的整個過程包含了以下三個重要的機制:
·Java源碼編譯機制
·類載入機制
·類執行機制
(1)Java源碼編譯機制
Java 源碼編譯由以下三個過程組成:
①分析和輸入到符號表
②註解處理
③語義分析和生成class文件
最後生成的class文件由以下部分組成:
①結構信息:包括class文件格式版本號及各部分的數量與大小的信息
②元數據:對應於Java源碼中聲明與常量的信息。包含類/繼承的超類/實現的介面的聲明信息、域與方法聲明信息和常量池
③方法信息:對應Java源碼中語句和表達式對應的信息。包含位元組碼、異常處理器表、求值棧與局部變數區大小、求值棧的類型記錄、調試符號信息
(2)類載入機制 JVM的類載入是通過ClassLoader及其子類來完成的
㈡ 描述一下JVM載入class文件的原理
Java語言是一種具有動態性的解釋型語言,類(class)只有被載入到JVM中後才能運行。當運行指定程序時,JVM會將編譯生成的.class文件按照需求和一定的規則載入到內存中,並組織成為一個完整的Java應用程序。這個載入過程是由類載入器來完成的,具體來說,就是由ClassLoader和它的子類來實現的。類載入器本身也是一個類,其實質是把類文件從硬碟讀取到內存中。
類的載入方式分為隱式載入與顯式載入兩種。隱式載入指的是程序在使用new等方法創建對象時,會隱式地調用類的載入器把對應的類載入到JVM中。顯式載入指的是通過直接調用class.forName()方法來把所需要的類載入到JVM中。
任何一個工程項目都是由許多個類組成的,當程序啟動時,只把需要載入的類載入到JVM中,其他類只有被使用到的時候才會被載入,採用這種方法,一方面可以加快載入速度,另外一方面可以節約程序運行過程中對內存的開銷。此外,在Java語言中,每個類或介面都對應一個.class文件,這些文件可以被看成一個個可以被動態載入的單元,因此當只有部分類被修改時,只需要重新編譯變化的類即可,而不需要重新編譯所有文件,因此加快了編譯速度。
㈢ class對象是在編譯後生成的(存在同名.class文件中)既然編譯後就生成了class對象為什麼JVM載入時又生成個
舉例說明下吧:
定義三個類
public class Bill {//省略細節}
public class PhoneBill extends Bill {//省略細節}
public class GasBill extends Bill {//省略細節}
在處理程序里有一個方法,接受一個Bill類型的對象,計算金額。假設兩種賬單計算方法不同,而傳入的Bill對象可能是兩種中的任何一種,所以要用instanceof來判斷:
public double calculate(Bill bill) {
if (bill instanceof PhoneBill) {
//計算電話賬單
}
㈣ JVM_位元組碼文件(ClassFile)詳解
我們知道 javac 命令可以將 .java 文件編譯成 .class 文件,而這個 Class 文件 中包含了 Java虛擬機 指令集、符號表以及若干其他輔助信息;最終將在 Java虛擬機 運行。
本文是以 JVM8 為例的。
每一個 Class文件 都有如下的 ClassFile 文件結構:
先簡單介紹一下 ClassFile 文件結構各部分含義:
描述符是表示欄位或方法類型的字元串。
欄位描述符表示類、實例或局部變數的類型。
從上面文法可以看出,欄位描述符中一共有三個類型:
方法描述符包含 0 個或者多個參數描述符以及一個返回值描述符。
看了描述符,可能大家有點疑惑,泛型信息怎麼表示啊?
常量池的通用格式如下:
目前 JVM8 中一共用 14 種常量類型,分別如下:
我們知道要使用一個欄位或者調用一個方法,就必須知道欄位或者方法所屬類符號引用,和欄位的名字和類型,方法的名字和方法參數類型以及方法返回值類型。
但是我們知道類是能繼承的,那麼子類調用父類的方法或者欄位,這里的所屬類符號引用,到底是子類本身還是父類的呢?
我們知道類,方法,欄位都有不同的訪問標志,在 Class 文件 中使用一個 u2 類型數據項來存儲,也就是最多可以有 16 個不同標志位。
在類,方法,欄位中有相同的標志,也有不同的標志,總體規劃,我們可以藉助 Modifier 類的源碼來了解:
在 Modifier 類中,類的訪問標志:
我們知道在 java 中類可以用的修飾符有: public , protected , private , abstract , static , final , strictfp 。
但是我們再看 Class 文件 中類的訪問標志:
仔細看,你會發現有些不同點:
在 Modifier 類中,欄位的訪問標志:
我們知道在 java 中欄位可以用的修飾符有: public , protected , private , static , final , transient 和 volatile 。
但是我們再看 Class 文件 中欄位的訪問標志:
Class 文件 中欄位的訪問標志和 java 中欄位的修飾符差不多,只是多了 ACC_SYNTHETIC 和 ACC_ENUM 兩個標志。
在 Modifier 類中,方法的訪問標志:
我們知道在 java 中方法可以用的修飾符有:
public , protected , private , abstract , static , final , synchronized , synchronized 和 strictfp 。
但是我們再看 Class 文件 中方法的訪問標志:
欄位詳情 field_info 的格式如下:
方法詳情 method_info 的格式如下:
關於 Class 文件 中屬性相關信息,我們再後面章節介紹。
我們可以通過 javap 的命令來閱讀 Class 文件 中相關信息。
這個是最簡單的一個類,沒有任何欄位和方法,只繼承 Object 類,我們來看看它編譯後的位元組碼信息,通過 javap -p -v T.class 的命令:
我們重點關注常量池相關信息,會發現雖然 T.class 很乾凈,但是也有 15 個常量,來我們依次分析:
與之前的例子相比較,多了一個欄位和方法,那麼得到的位元組碼信息如下:
但是你會發現常量池中怎麼沒有這個欄位 name 的 CONSTANT_Fieldref_info 類型的常量呢?
那是因為我們沒有使用這個欄位。
多寫了一個方法 test1 來調用 name 欄位和 test 方法,那麼得到的位元組碼信息如下:
這里定義一個父類 TParent ,有一個公共欄位 name 和方法 say 。子類
㈤ JVM的組成和運行原理是什麼
JVM是Java Virtual Machine(Java虛擬機)的縮寫。
1、JVM的組成:
JVM 由類載入器子系統、運行時數據區、執行引擎以及本地方法介面組成。
2、JVM的運行原理:
JVM是java的核心和基礎,在java編譯器和os平台之間的虛擬處理器。它是一種基於下層的操作系統和硬體平台並利用軟體方法來實現的抽象的計算機,可以在上面執行java的位元組碼程序。java編譯器只需面向JVM,生成JVM能理解的代碼或位元組碼文件。Java源文件經編譯器,編譯成位元組碼程序,通過JVM將每一條指令翻譯成不同平台機器碼,通過特定平台運行。
㈥ JVM原理是什麼
JVM工作原理和特點主要是指操作系統裝入JVM是通過jdk中Java.exe來完成,通過下面4步來完成JVM環境.
1.創建JVM裝載環境和配置
2.裝載JVM.dll
3.初始化JVM.dll並掛界到JNIENV(JNI調用介面)實例
4.調用JNIEnv實例裝載並處理class類。