Java之Java程序与虚拟机
Java為什么要在虛擬機中運行
Java如何在虛擬機中運行的
Java虛擬機如何存儲運行時的數據
Java虛擬機在內存中劃分出堆和棧來存儲運行時數據.并且將棧細分為面向Java方法的Java方法棧,面向本地方法的本地方法棧,以及存放各個線程執行位置的PC寄存器.
運行的過程中,每當調用一個方法,Java虛擬機會在當前線程的Java方法棧中生成一個棧幀,存放局部變量以及字節碼操作數.這個棧幀大小提前計算好,而且Java虛擬機不要求棧幀在內存空間中連續分步.退出執行方法時,Java虛擬機會彈出當前線程的當前棧幀,并舍棄.
前面說到Java字節碼會被虛擬機翻譯成機器碼,那是如何翻譯的呢?有兩種形式:第一種是解釋執行,也就是逐條將字節碼翻譯成機器碼并執行,優勢是無需等待編譯.第二種是即時編譯(JIT),也就是將一個方法中包含的所有字節碼編譯成機器碼后再執行,優勢在于實際運行速度很快.而我們常用的HotSpot虛擬機默認采用混合模式,綜合了解釋執行和即時編譯兩者的優點,先解釋執行字節碼,而后將反復執行的熱點代碼,以方法為單位進行即時編譯.
運行效率如何
前面說的極是編譯就是用來提升性能以及峰值性能,它是建立在程序符合二八定律的假設上,也就是百分之二十的代碼占據百分之八十的計算資源.
如何理解?對于占據大部分不常用的代碼,無需耗費時間將其編譯成機器碼,而是采取解釋執行的方式運行;另一方面,對于占據小部分的熱點代碼,將其編譯器成機器碼,提高運行速度.
HotSpot 內置了多個即時編譯器:C1、C2 和 Graal。Graal 是
Java 10 正式引入的實驗性即時編譯器,InfoQ上有個介紹(http://www.infoq.com/cn/articles/Graal-Java-JIT-Compiler?utm_source=articles_about_java&utm_medium=link&utm_campaign=java),有興趣的可以了解下.
C1 又叫做 Client 編譯器,面向的是對啟動性能有要求的客戶端 GUI 程序,采用的優化手段相對簡單,因此編譯時間較短。
C2 又叫做 Server 編譯器,面向的是對峰值性能有要求的服務器端程序,采用的優化手段相對復雜,因此編譯時間較長,但同時生成代碼的執行效率較高。
Java7開始,HotSpot默認采取分層編譯:熱點方法首先被C1編譯,而后熱點方法中的熱點會進一步被C2編譯.
總結
之所以要在虛擬機中運行,是因為它提供了可移植性。一旦 Java 代碼被編譯為 Java 字節碼,便可以在不同平臺上的 Java 虛擬機實現上運行。此外,虛擬機還提供了一個代碼托管的環境,
代替我們處理部分冗長而且容易出錯的事務,例如內存管理。
Java 虛擬機將運行時內存區域劃分為五個部分,分別為方法區、堆、PC 寄存器、Java 方法棧和本地方法棧。Java 程序編譯而成的 class 文件,需要先加載至方法區中,方能在 Java 虛擬機
中運行。
為了提高運行效率,標準 JDK 中的 HotSpot 虛擬機采用的是一種混合執行的策略。
它會解釋執行 Java 字節碼,然后會將其中反復執行的熱點代碼,以方法為單位進行即時編譯,翻譯成機器碼后直接運行在底層硬件之上。
HotSpot 裝載了多個不同的即時編譯器,以便在編譯時間和生成代碼的執行效率之間做取舍。
轉載于:https://www.cnblogs.com/wadmwz/p/9392098.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Java之Java程序与虚拟机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 磁盘与文件系统管理
- 下一篇: github RL: DP