您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)java虛擬機(jī)運(yùn)行代碼的過程,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
從虛擬機(jī)的視角來看,執(zhí)行java代碼首先需要將它編譯而成的class文件加載到j(luò)ava虛擬機(jī)中。加載后的java類會被存放在方法區(qū)中。實(shí)際運(yùn)行時(shí),虛擬機(jī)會執(zhí)行方法區(qū)的代碼。
在運(yùn)行過程中,每當(dāng)調(diào)用進(jìn)入一個(gè)java方法,java虛擬機(jī)會在當(dāng)前線程的java方法棧中生成一個(gè)棧幀,用以存放局部變量以及字節(jié)碼的操作數(shù)。這個(gè)棧幀的大小是提前計(jì)算好的,而且java虛擬機(jī)不要求棧幀在內(nèi)存空間里連續(xù)分布。
在hotspot里面,上述翻譯過程有兩種形式:第一種是解釋執(zhí)行,即逐條將字節(jié)碼翻譯成機(jī)器碼并執(zhí)行;第二種是即時(shí)編譯(JIT),即將一個(gè)方法包含的所有字節(jié)碼編譯成機(jī)器碼后再執(zhí)行。
前者的優(yōu)勢在于無需等待編譯,而后者的優(yōu)勢在于實(shí)際運(yùn)行速度更快。HotSpot默認(rèn)采用混合模式,綜合了解釋執(zhí)行和即時(shí)編譯兩者的優(yōu)點(diǎn)。他會先解釋執(zhí)行字節(jié)碼,而后將其中反復(fù)執(zhí)行的熱點(diǎn)代碼以方法為單位進(jìn)行即時(shí)編譯。
java虛擬機(jī)的運(yùn)行效率究竟怎么樣?
即時(shí)編譯是建立在程序符合二八定律的假設(shè)上,也就是百分之二十的代碼占據(jù)了百分之八十的計(jì)算資源。
對于占據(jù)大部分的不常用的代碼,我們無需好分時(shí)間將其編譯成機(jī)器碼,而是采用解釋執(zhí)行的方式運(yùn)行;另一方面,對于僅占據(jù)小部分的熱點(diǎn)代碼,我們則可以將其編譯為機(jī)器碼,以達(dá)到理想的運(yùn)行速度。
理論上講,即時(shí)編譯后的java程序的執(zhí)行效率,是可能超過c++的。這是因?yàn)榕c靜態(tài)編譯相比,即時(shí)編譯擁有程序的運(yùn)行時(shí)信息,并且能夠根據(jù)這個(gè)信息做出相應(yīng)的優(yōu)化。
舉個(gè)栗子:對于一個(gè)虛方法的調(diào)用,盡管有很多個(gè)目標(biāo)方法,但在實(shí)際運(yùn)行過程中他可能只調(diào)用其中一個(gè)。這個(gè)信息可以被即時(shí)編譯器所利用,來規(guī)避虛方法調(diào)用的開銷。
關(guān)于java虛擬機(jī)運(yùn)行代碼的過程就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。