您好,登錄后才能下訂單哦!
如何理解Java常見知識點中的Jvm架構,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用于計算設備的規范,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。Java虛擬機包括一套字節碼指令集、一組寄存器、一個棧、一個垃圾回收堆和一個存儲方法域。 JVM屏蔽了與具體操作系統平臺相關的信息,使Java程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。JVM在執行字節碼時,實際上最終還是把字節碼解釋成具體平臺上的機器指令執行。
JRE(Java Runtime Environment,Java運行環境),也就是Java平臺。所有的Java 程序都要在JRE下才能運行。普通用戶只需要運行已開發好的java程序,安裝JRE即可。
JDK(Java Development Kit)是程序開發者用來來編譯、調試java程序用的開發工具包。JDK的工具也是Java程序,也需要JRE才能運行。為了保持JDK的獨立性和完整性,在JDK的安裝過程中,JRE也是 安裝的一部分。所以,在JDK的安裝目錄下有一個名為jre的目錄,用于存放JRE文件。
JVM(Java Virtual Machine,Java虛擬機)是JRE的一部分。它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。JVM有自己完善的硬件架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。Java語言最重要的特點就是跨平臺運行。使用JVM就是為了支持與操作系統無關,實現跨平臺。
JVM是java的核心和基礎,在java編譯器和os平臺之間的虛擬處理器。它是一種利用軟件方法實現的抽象的計算機基于下層的操作系統和硬件平臺,可以在上面執行java的字節碼程序。
java編譯器只要面向JVM,生成JVM能理解的代碼或字節碼文件。Java源文件經編譯成字節碼程序,通過JVM將每一條指令翻譯成不同平臺機器碼,通過特定平臺運行。
JVM被分為三個主要的子系統:
類加載器子系統
運行時數據區
執行引擎
1. 類加載器子系統
Java的動態類加載功能是由類加載器子系統處理。當它在運行時(不是編譯時)首次引用一個類時,它加載、鏈接并初始化該類文件。
加載
類由此組件加載。啟動類加載器 (BootStrap class Loader)、擴展類加載器(Extension class Loader)和應用程序類加載器(Application class Loader) 這三種類加載器幫助完成類的加載。
啟動類加載器 – 負責從啟動類路徑中加載類,無非就是rt.jar。這個加載器會被賦予最高優先級。
擴展類加載器 – 負責加載ext 目錄(jre\lib)內的類.
應用程序類加載器 – 負責加載應用程序級別類路徑,涉及到路徑的環境變量等etc.
上述的類加載器會遵循委托層次算法(Delegation Hierarchy Algorithm)加載類文件。
鏈接
校驗 – 字節碼校驗器會校驗生成的字節碼是否正確,如果校驗失敗,我們會得到校驗錯誤。
準備 – 分配內存并初始化默認值給所有的靜態變量。
解析 – 所有符號內存引用被方法區(Method Area)的原始引用所替代。
初始化
這是類加載的最后階段,這里所有的靜態變量會被賦初始值, 并且靜態塊將被執行。
2. 運行時數據區(Runtime Data Area)
運行時數據區域被劃分為5個主要組件:
方法區(Method Area)
所有類級別數據將被存儲在這里,包括靜態變量。每個JVM只有一個方法區,它是一個共享的資源。
堆區(Heap Area)
所有的對象和它們相應的實例變量以及數組將被存儲在這里。每個JVM同樣只有一個堆區。由于方法區和堆區的內存由多個線程共享,所以存儲的數據不是線程安全的。
棧區(Stack Area)
對每個線程會單獨創建一個運行時棧。對每個函數呼叫會在棧內存生成一個棧幀(Stack Frame)。所有的局部變量將在棧內存中創建。棧區是線程安全的,因為它不是一個共享資源。棧幀被分為三個子實體:
局部變量數組 – 包含多個與方法相關的局部變量并且相應的值將被存儲在這里。
操作數棧 – 如果需要執行任何中間操作,操作數棧作為運行時工作區去執行指令。
幀數據 – 方法的所有符號都保存在這里。在任意異常的情況下,catch塊的信息將會被保存在幀數據里面。
PC寄存器
每個線程都有一個單獨的PC寄存器來保存當前執行指令的地址,一旦該指令被執行,pc寄存器會被更新至下條指令的地址。
本地方法棧
本地方法棧保存本地方法信息。對每一個線程,將創建一個單獨的本地方法棧。
3. 執行引擎
分配給運行時數據區的字節碼將由執行引擎執行。執行引擎讀取字節碼并逐段執行。
解釋器
解釋器能快速的解釋字節碼,但執行卻很慢。 解釋器的缺點就是,當一個方法被調用多次,每次都需要重新解釋。
JIT編譯器
JIT編譯器消除了解釋器的缺點。執行引擎利用解釋器轉換字節碼,但如果是重復的代碼則使用JIT編譯器將全部字節碼編譯成本機代碼。本機代碼將直接用于重復的方法調用,這提高了系統的性能。
中間代碼shengchengqi【提示違禁詞了】 – 生成中間代碼
代碼優化器 – 負責優化上面生成的中間代碼
目標代碼shengchengqi【提示違禁詞了】 – 負責生成機器代碼或本機代碼
探測器(Profiler) – 一個特殊的組件,負責尋找被多次調用的方法。
垃圾回收器:
收集并刪除未引用的對象。可以通過調用”System.gc()”來觸發垃圾回收,但并不保證會確實進行垃圾回收。JVM的垃圾回收只收集哪些由new關鍵字創建的對象。所以,如果不是用new創建的對象,你可以使用finalize函數來執行清理。
Java本地接口 (JNI): JNI 會與本地方法庫進行交互并提供執行引擎所需的本地庫。
本地方法庫:它是一個執行引擎所需的本地庫的集合。
看完上述內容,你們掌握Java常見知識點中的Jvm架構的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
關于如何理解Java常見知識點中的Jvm架構問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。