這篇文章將為大家詳細講解有關(guān)java虛擬機運行代碼的過程,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、重慶小程序開發(fā)、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了棗強免費建站歡迎大家使用!
從虛擬機的視角來看,執(zhí)行java代碼首先需要將它編譯而成的class文件加載到j(luò)ava虛擬機中。加載后的java類會被存放在方法區(qū)中。實際運行時,虛擬機會執(zhí)行方法區(qū)的代碼。
在運行過程中,每當調(diào)用進入一個java方法,java虛擬機會在當前線程的java方法棧中生成一個棧幀,用以存放局部變量以及字節(jié)碼的操作數(shù)。這個棧幀的大小是提前計算好的,而且java虛擬機不要求棧幀在內(nèi)存空間里連續(xù)分布。
在hotspot里面,上述翻譯過程有兩種形式:第一種是解釋執(zhí)行,即逐條將字節(jié)碼翻譯成機器碼并執(zhí)行;第二種是即時編譯(JIT),即將一個方法包含的所有字節(jié)碼編譯成機器碼后再執(zhí)行。
前者的優(yōu)勢在于無需等待編譯,而后者的優(yōu)勢在于實際運行速度更快。HotSpot默認采用混合模式,綜合了解釋執(zhí)行和即時編譯兩者的優(yōu)點。他會先解釋執(zhí)行字節(jié)碼,而后將其中反復執(zhí)行的熱點代碼以方法為單位進行即時編譯。
java虛擬機的運行效率究竟怎么樣?
即時編譯是建立在程序符合二八定律的假設(shè)上,也就是百分之二十的代碼占據(jù)了百分之八十的計算資源。
對于占據(jù)大部分的不常用的代碼,我們無需好分時間將其編譯成機器碼,而是采用解釋執(zhí)行的方式運行;另一方面,對于僅占據(jù)小部分的熱點代碼,我們則可以將其編譯為機器碼,以達到理想的運行速度。
理論上講,即時編譯后的java程序的執(zhí)行效率,是可能超過c++的。這是因為與靜態(tài)編譯相比,即時編譯擁有程序的運行時信息,并且能夠根據(jù)這個信息做出相應(yīng)的優(yōu)化。
舉個栗子:對于一個虛方法的調(diào)用,盡管有很多個目標方法,但在實際運行過程中他可能只調(diào)用其中一個。這個信息可以被即時編譯器所利用,來規(guī)避虛方法調(diào)用的開銷。
關(guān)于java虛擬機運行代碼的過程就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。