AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

Java是怎么運行起來的?深入理解Java虛擬機

來源: 責編: 時間:2023-09-25 10:39:30 302觀看
導讀Java虛擬機(JVM)是一個運行時環境,可以執行用Java編程語言編寫的程序。Java語言是一種高級語言,它通過抽象和封裝的機制,讓開發者可以專注于業務邏輯和功能實現,而不用關心底層的細節。因此,運行/開發Java程序時,不必深入了解

Java虛擬機(JVM)是一個運行時環境,可以執行用Java編程語言編寫的程序。Java語言是一種高級語言,它通過抽象和封裝的機制,讓開發者可以專注于業務邏輯和功能實現,而不用關心底層的細節。因此,運行/開發Java程序時,不必深入了解Java程序的執行過程或JVM的內部原理。對于大多數開發者來說,JVM就像一個神奇的盒子,能夠幫助他們實現功能和完成任務。Fvj28資訊網——每日最新資訊28at.com

但是,了解JVM是如何支持Java語言和其他相關語言的,對于程序員來說是很有裨益的!Fvj28資訊網——每日最新資訊28at.com

Fvj28資訊網——每日最新資訊28at.com

本文分享一下Java的工作原理和JVM的內部結構。Fvj28資訊網——每日最新資訊28at.com

1. Java虛擬機

Java虛擬機(JVM)是一個抽象的機器,用來執行一種代碼,即bytecode。你可以把它看作是我們的代碼和計算機硬件之間的橋梁,它把我們的代碼作為輸入,轉換成字節碼并在計算機硬件上運行它,從而實現開發者預期的結果。Fvj28資訊網——每日最新資訊28at.com

2. 字節碼 (bytecode)

字節碼是一種JVM能夠理解的文件類型。它是通過compilingJava代碼(使用javac)生成的一種Java程序的中間表示形式。它之所以叫字節碼,是因為每個操作碼(operation)都是單字節大小的。字節碼可以再次編譯成機器碼并在計算機上運行。Fvj28資訊網——每日最新資訊28at.com

3. 編譯

運行Java程序的第一步是編譯。如果你有一個單獨的Java文件,你可以使用提供的命令行工具javac來觸發編譯。Fvj28資訊網——每日最新資訊28at.com

javac HelloWorld.java

圖片Fvj28資訊網——每日最新資訊28at.com

上面代碼會把一個給定的Java文件編譯成.class文件,其中包含bytecode。如果源代碼有錯誤,編譯會失敗并報出編譯錯誤。Fvj28資訊網——每日最新資訊28at.com

你可以使用提供的工具javap來查看已創建的類文件,以了解類文件的內部情況。Fvj28資訊網——每日最新資訊28at.com

javap HelloWorld.class

4. 執行

在通過編譯創建了.class文件之后,可以使用java語法來啟動一個JVM的實例,它會觸發一個包含多個復雜步驟的執行路徑,最終執行我們提供的代碼。Fvj28資訊網——每日最新資訊28at.com

java HelloWorld

首先JVM需要獲取.class文件,并將它加載到JVM的內存區域中。這個初始過程是通過JVM類加載器來實現的。Fvj28資訊網——每日最新資訊28at.com

5. 什么是類加載?

抽象地說,類加載就是掃描并遍歷提供的.class文件,并將類文件中的內容加載到JVM的內存區域中。然后,執行引擎就可以引用這些存儲的數據,繼續執行我們的代碼。Fvj28資訊網——每日最新資訊28at.com

JVM中有三種類型的類加載器,分別是:Fvj28資訊網——每日最新資訊28at.com

  • 引導類加載器
  • 擴展類加載器
  • 應用類加載器

引導類加載器的職責是加載基礎/核心的Java類,這些類對于Java程序運行是必不可少的。在早期的Java版本中,這些核心類被包含在位于jre/lib目錄下的rt.jar文件中,但在后來的Java版本中,rt.jar中的內容被分割成模塊化的組件。Fvj28資訊網——每日最新資訊28at.com

擴展類加載器的職責是加載lib/ext目錄下的類,這些類可能包括我們在代碼中使用的任何擴展。Fvj28資訊網——每日最新資訊28at.com

應用類加載器是三種中最常用的一種,它負責加載用戶定義的類。它會掃描我們程序的類路徑,并加載其中的類。Fvj28資訊網——每日最新資訊28at.com

6. 類加載過程

類加載過程有兩個主要步驟:Fvj28資訊網——每日最新資訊28at.com

  • 加載
  • 鏈接

7. 加載

在加載過程中,類加載器讀取類文件的二進制表示形式,即.class文件,并在JVM的運行時內存中創建它的表示。這個表示稱為Class Object,它位于JVM內存的方法區中。Fvj28資訊網——每日最新資訊28at.com

8. 鏈接

在加載過程之后,開始鏈接。鏈接有三個步驟。Fvj28資訊網——每日最新資訊28at.com

  • 驗證 — 確保類文件的正確性。驗證類是否符合Java規范。
  • 準備 — 為靜態塊/字段分配內存,并為靜態變量賦予默認值(不是初始值!)。
  • 解析 — 解析類文件中的(符號)引用。

Fvj28資訊網——每日最新資訊28at.com

解析:Fvj28資訊網——每日最新資訊28at.com

在鏈接的解析階段,類加載器會解析常量池表,這是一個位于.class文件/類對象中的實體,類似于一個符號表,指定了類中的字段/方法/引用。在類文件中,對其他類的引用是以符號方式表示的,沒有具體的內存地址來引用。解析會搜索JVM內存,并為那些符號引用分配具體的引用。如果在.class文件中發現了一個尚未加載的類,它會觸發該類本身的加載/鏈接過程,這可能會導致一個遞歸的加載和鏈接過程。Fvj28資訊網——每日最新資訊28at.com

在字節碼加載和鏈接之后,類就成功地存儲在JVM內存中(將在后面的部分討論),并準備好初始化。Fvj28資訊網——每日最新資訊28at.com

9. 初始化

當代碼中第一次用new關鍵字或靜態字段來引用一個類,或者當程序執行時遇到一個初始化類(比如Main類),則會觸發類文件的初始化。Fvj28資訊網——每日最新資訊28at.com

在初始化階段,執行靜態塊,靜態變量被分配初始值。Fvj28資訊網——每日最新資訊28at.com

10. 運行時內存區域

在上面的段落中,多次提到了將類文件數據存儲在JVM內存中。這些數據究竟存儲在哪里,來作為加載/鏈接/初始化的結果?答案是運行時內存區域。Fvj28資訊網——每日最新資訊28at.com

JVM運行時內存區域是指定的內存空間,它被劃分為多個部分,用于存儲執行相關/類文件相關的數據。Fvj28資訊網——每日最新資訊28at.com

運行時內存區的主要區域如下:Fvj28資訊網——每日最新資訊28at.com

(1) 方法區Fvj28資訊網——每日最新資訊28at.com

方法區是運行時內存的一部分,用于存儲與類文件相關的數據。運行時常量池、字段元數據、類元數據、方法元數據和字節碼本身等都存儲在方法區中。Fvj28資訊網——每日最新資訊28at.com

(2) 程序計數器(PC)Fvj28資訊網——每日最新資訊28at.com

程序計數器是一個小的內存區域,用于存儲當前正在執行的操作的地址,這是Java程序執行的必要信息。每個線程都有自己的PC。Fvj28資訊網——每日最新資訊28at.com

(3) 堆Fvj28資訊網——每日最新資訊28at.com

存儲所有的類/數組實例,是所有線程共享的一塊內存。Fvj28資訊網——每日最新資訊28at.com

(4) JVM棧Fvj28資訊網——每日最新資訊28at.com

保存局部變量和部分結果。包含棧幀。每個線程都有自己的JVM棧。Fvj28資訊網——每日最新資訊28at.com

11. 棧幀

當一個方法被調用時,在棧中創建一個新的幀。它會存儲與該方法相關的局部變量和部分結果。如果在該方法內部調用了另一個方法,就會為新調用的方法創建一個新的棧幀。在給定線程中,一次只有一個幀是活動的。Fvj28資訊網——每日最新資訊28at.com

12. 執行

在上面的部分中,簡要地介紹了Java源代碼是如何編譯并加載到JVM運行時內存區域中的。Fvj28資訊網——每日最新資訊28at.com

接下來看看這些數據是如何執行的。Fvj28資訊網——每日最新資訊28at.com

這部分過程是通過JVM的執行引擎來實現的,它由兩個主要部分組成:(執行引擎還包括許多其他組件,但在本文中不會提及。)Fvj28資訊網——每日最新資訊28at.com

  • 解釋器
  • JIT(即時)編譯器

“Java作為一種編程語言,是一種混合的解釋和編譯語言,也就是說Java代碼既要經過編譯,又要經過解釋。簡單來說,當類文件開始運行時,JVM會先用解釋器直接執行字節碼,不需要編譯。這樣做的主要好處是可以提高啟動速度和執行速度(不用等待編譯過程)。Fvj28資訊網——每日最新資訊28at.com

在解釋的過程中,JVM會發現代碼中的熱點和熱區,也就是經常執行或者可以優化的代碼段。這些代碼段會被JIT編譯器編譯成本地代碼,然后執行引擎會從解釋模式切換到執行模式。”Fvj28資訊網——每日最新資訊28at.com

這個編譯過程有多個層次,稱為分層編譯。Fvj28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-11280-0.htmlJava是怎么運行起來的?深入理解Java虛擬機

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 八個從Java 11到Java17中的功能提升

下一篇: Python中map函數的高級技巧:優化你的編程體驗

標簽:
  • 熱門焦點
Top