jvm學習-java代碼是怎么運行的


首先一個問題入題:是否知道java和c++在運行方式上的區別?

java需要依賴JRE的運行環境,而c++代碼則無需額外的運行時。

那么問題又來了,既然c++的運行方式已經很成熟了,那么為什么java要在虛擬機中運行呢?

  1. 為了實現一次編寫,到處運行的目標。
  2. jvm作為一個很好的托管環境,能夠代替我們處理一些代碼中冗長而且容易出錯的部分,比如垃圾回收。

java虛擬機具體是怎樣運行java字節碼的?

從虛擬機的視角來看,執行java代碼首先需要將它編譯而成的class文件加載到java虛擬機中。加載后的java類會被存放在方法區中。實際運行時,虛擬機會執行方法區的代碼。

在運行過程中,每當調用進入一個java方法,java虛擬機會在當前線程的java方法棧中生成一個棧幀,用以存放局部變量以及字節碼的操作數。這個棧幀的大小是提前計算好的,而且java虛擬機不要求棧幀在內存空間里連續分布。

在hotspot里面,上述翻譯過程有兩種形式:第一種是解釋執行,即逐條將字節碼翻譯成機器碼並執行;第二種是即時編譯(JIT),即將一個方法包含的所有字節碼編譯成機器碼后再執行。

前者的優勢在於無需等待編譯,而后者的優勢在於實際運行速度更快。HotSpot默認采用混合模式,綜合了解釋執行和即時編譯兩者的優點。他會先解釋執行字節碼,而后將其中反復執行的熱點代碼以方法為單位進行即時編譯。

java虛擬機的運行效率究竟怎么樣?

即時編譯是建立在程序符合二八定律的假設上,也就是百分之二十的代碼占據了百分之八十的計算資源。

對於占據大部分的不常用的代碼,我們無需好分時間將其編譯成機器碼,而是采用解釋執行的方式運行;另一方面,對於僅占據小部分的熱點代碼,我們則可以將其編譯為機器碼,以達到理想的運行速度。

理論上講,即時編譯后的java程序的執行效率,是可能超過c++的。這是因為與靜態編譯相比,即時編譯擁有程序的運行時信息,並且能夠根據這個信息做出相應的優化。舉個栗子:對於一個虛方法的調用,盡管有很多個目標方法,但在實際運行過程中他可能只調用其中一個。這個信息可以被即時編譯器所利用,來規避虛方法調用的開銷。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM