核心基礎:理解何為JVM?掌握Java虛擬機構成精髓
Java虛擬機是一個程序,其目的是執行其他程序。 這是一個簡要的觀念,也是我們編碼功夫***的示例之一。 JVM打破了當時的現狀,并繼續支持今天的編程創新。
1.JVM的用法和定義
JVM有兩個主要功能:允許Java程序在任何設備或操作系統上運行(稱為"一次寫入,隨處運行",即"Write once, run anywhere"原則),以及管理和優化程序內存。 當Java于1995年發布時,所有計算機程序都被寫入特定的操作系統,程序n內存由軟件開發人員管理。 所以說,JVM是一個新模式啟示。
圖-1:JVM高層視圖
擁有JVM的技術定義是很有用的,那樣,軟件開發人員就可以通過常規的方式思考它。這可以分解表述如下:
- 技術定義:JVM是執行代碼并為該代碼提供運行時環境的軟件程序的規范。
- 常規定義:JVM是我們運行Java程序的工作方式。 我們配置JVM的設置,然后依賴它來在執行期間管理程序資源。
當開發人員談論JVM時,我們通常是指在一臺機器上運行的進程,尤其是服務器,它代表并控制Java應用程序的資源使用情況。這些是參照JVM規范實現的的——所謂JVM規范,其描述了構建執行這些任務的程序的要求。
那么,誰開發和維護JVM?
——JVM由一些非常聰明的程序員、公司和開源組織來廣泛部署、大量使用、升級開發和維護的。 OpenJDK項目是Sun Microsystems決定開源Java的后代。Sun被Oracle收購,OpenJDK繼續通過Oracle來對Java管理,現在由Oracle工程師完成了大量繁重工作。
2.JVM中內存管理
與正在運行的JVM最常見的交互是檢查堆(Heap)和堆棧(stack,簡稱為棧)中的內存使用情況。 最常見的調整是調優JVM的內存設置。
2.1.垃圾回收
在Java之前,所有程序內存都由程序員管理。 在Java中,程序內存由JVM管理。 JVM通過稱為垃圾收集的進程來管理內存,該進程持續識別并消除Java程序中未使用的內存。 垃圾收集發生在正在運行的JVM中。
在早期,Java因為沒有像C那樣"接近源質(close the metal)"而受到很多批評,因此沒有那么快。 垃圾收集過程尤其引起爭議。 從那時起,已經提出了各種算法和方法,并用于垃圾收集。 隨著兼容性開發和優化,垃圾收集得到了極大的改進。
注:接近源質是什么意思?
——當程序員說編程語言或平臺"接近源質"時,我們的意思是開發人員能夠以編程方式(通過編寫代碼)管理操作系統的內存。 從理論上講,程序員可以通過規定使用多少以及何時丟棄它,以便從我們的程序中獲得更多性能。 在大多數情況下,將內存管理委派給高度精煉的流程(如JVM)可以產生超過你自己管理的更好性能和更少錯誤。
3. JVM分為三部分
3.1.JVM規范
首先,JVM是一個軟件規范。 以某種通告或宣告方式表達其要求,JVM規范強調其實現細節不在其規范中具體定義,以便在其實現中實現***的創造性(如下通告要求):
"要正確實現Java虛擬機,您只需要能夠讀取類文件格式并正確執行其中指定的操作。"
還有這樣的例子,如J.S. 巴赫(Bach)曾經類似的描述過音樂創作:
"你所要做的就是在合適的時間觸碰那正確的調調(就是音樂家或唱歌所說那個key,鍵)。"
因此,JVM所要做的就是正確運行Java程序。 聽起來很簡單,甚至可能從外面看起來也很簡單,但這是一項艱巨的任務,特別是考慮到Java語言的強大功能和靈活性。
注意,JVM就是個虛擬的機器,可進一步描述如下:
JVM是一個以便攜方式運行Java類(class)文件的虛擬機器機。 作為虛擬機,意味著JVM是底層實際機器的抽象——例如運行程序的服務器。 無論實際存在哪種操作系統或硬件,JVM都會為程序在其中運行創建可預測的環境。 但是,與真正的虛擬機不同,JVM不會創建虛擬操作系統。 將JVM描述為托管運行時環境或進程虛擬機會更準確。
3.2.JVM實現
實現JVM規范會產生一個實際的軟件程序,這是一個JVM實現。 事實上,有許多JVM實現,包括開源和專有。 OpenJDK的HotSpot JVM是參考實現,并且仍然是世界上經過最徹底試驗和測試(tried-and-tested)的代碼庫之一。 HotSpot也是最常用的JVM。
幾乎所有許可的JVM都是作為OpenJDK和HotSpot JVM的分支而創建的,包括Oracle的許可JDK。 從OpenJDK創建許可分支的開發人員通常希望添加特定于操作系統的性能改進。 通常,您將JVM作為Java Runtime Environment(JRE)的捆綁部分下載和安裝。
3.3.JVM實例
在JVM規范被實現并作為軟件產品發布后,您可以下載并作為程序運行它。下載的程序是JVM的實例(或實例化版本)。
大多數時候,當開發人員談論"JVM"時,我們指的是在軟件開發或生產環境中運行的JVM實例。 您可能會說,"嘿,Solo,這個服務器上的JVM使用了多少內存?" 或者,"我無法相信我創建了一個循環調用,并且堆棧溢出錯誤導致我的JVM崩潰。這是一個新手錯誤啊!"
提示:軟件規范是何物?
軟件規范(或規范)是描述軟件系統應如何操作的人類可讀設計文檔。規范的目的是為工程師編碼創建一份清晰的描述和要求。
4.JVM加載和執行class文件
我們已經討論了JVM在運行Java應用程序中的作用,但它如何執行其功能? 為了運行Java應用程序,JVM依賴于Java類加載器和Java執行引擎。
4.1.Java類加載器
Java中的所有東西都是類(或者每件東西都是一個類),所有Java應用程序都是從類構建的。 應用程序可以包含一個類或數千個。 為了運行Java應用程序,JVM必須將已編譯的.class文件加載到可以訪問它們的上下文(例如服務器)中。 JVM依賴于其類加載器來執行此功能。
Java類加載器是JVM的一部分,它將類加載到內存中并使它們可用于執行。 類加載器使用延遲加載和緩存等技術來使類加載盡可能高效。 也就是說,類加載不是(比如說)便攜式運行時內存管理的史詩般的腦筋急轉彎,也就是說這些技術相對簡單。
每個Java虛擬機都包含一個類加載器。 JVM規范描述了在運行時查詢和操作類加載器的標準方法,但JVM實現負責實現這些功能。 從開發人員的角度來看,底層的類加載器機制通常是一個黑盒子。注意,一般具體的JVM實現,也不止一個類加載器。
4.2.Java執行引擎
一旦類加載器完成了加載類的工作,JVM就開始在每個類中執行代碼。 執行引擎是處理此功能的JVM組件。 執行引擎對于運行JVM至關重要。 實際上,出于所有實際目的,它就是JVM實例。
執行代碼涉及管理對系統資源的訪問。JVM執行引擎位于正在運行的程序(包括對文件、網絡和內存資源的需求)和提供這些資源的操作系統之間。
4.3.執行引擎如何管理系統資源
系統資源可以分為兩大類:內存和其他所有內容。
回想一下,JVM負責處理未使用的內存,垃圾收集是執行這種處理的機制。 JVM還負責分配和維護開發人員認為理所當然的參照性結構。 舉個例子,JVM的執行引擎負責在Java中使用類似new關鍵字的東西,并將其轉換為特定于操作系統的內存分配請求。
除了內存管理,執行引擎還管理文件系統訪問和網絡I/O的資源。 由于JVM可跨操作系統進行互操作,因此這絕非易事。 除了每個應用程序的資源需求外,執行引擎還必須響應每個OS環境。這就是JVM能夠處理內部需求的方式。
5. JVM演變:過去,現在,未來
1995年,JVM引入了兩個革命性的概念,這些概念從此成為現代軟件開發的標準配置:"一次編寫,隨處運行"和自動內存管理。 軟件互操作性在當時是一個大膽的概念,但今天很少有開發人員會三思而后行。 同樣,雖然我們的工程先驅必須自己管理程序內存,但我這一代人是在垃圾收集器(garbage collection)中長大。
我們可以說James Gosling和Brendan Eich發明了現代編程,但在接下來的幾十年里,成千上萬的其他人已經完善并內置了他們的想法(編程方式的內部性的觀念認知)。 雖然Java虛擬機最初只是用于Java,但現在它已經發展到支持許多腳本和編程語言,包括Scala,Groovy和Kotlin。 展望未來,很難看到未來JVM不是發展領域的重要組成部分(依然是突出的組成部分)。
6.結論
本文總覽性對JVM進行了介紹,具體設計的內容還很多,這里就不一一展開了,可以看本號已發表的相關文章,以進一步了解。***,我以一張JVM組成圖來總結本文,以更直觀的方式認識和感知Java 虛擬機( Java virtual machine):
Java 虛擬機實現架構參考
本篇關于認知JVM精要組成的內容,就到這里了。具體的JVM不是小小的一篇網文就能全部搞定的。