摘要:我們都知道要運(yùn)行代碼就必須要有,也就是運(yùn)行時(shí)環(huán)境,中包含了程序的必需組件,包括虛擬機(jī)以及核心類庫,然而運(yùn)行代碼則不需要額外的運(yùn)行時(shí)環(huán)境,只需要把代碼編譯成能識(shí)別的指令即可,也就是機(jī)器碼那為什么不直接像那樣而需要在虛擬機(jī)中運(yùn)行呢他在虛擬機(jī)中又
我們都知道要運(yùn)行Java代碼就必須要有JRE,也就是Java運(yùn)行時(shí)環(huán)境,JRE中包含了Java程序的必需組件,包括Java虛擬機(jī)以及Java核心類庫,然而運(yùn)行C++代碼則不需要額外的運(yùn)行時(shí)環(huán)境,只需要把代碼編譯成CPU能識(shí)別的指令即可,也就是機(jī)器碼.那為什么Java不直接像C++那樣而需要在虛擬機(jī)中運(yùn)行呢?他在虛擬機(jī)中又是如何運(yùn)行的?接著往下看.
Java為什么要在虛擬機(jī)中運(yùn)行剛才我們談到C++是直接把代碼編譯成機(jī)器碼的,但因?yàn)楦鱾€(gè)平臺(tái)的架構(gòu)不一樣,CPU能處理的指令集也不一樣,所以如果要在另一個(gè)平臺(tái)上運(yùn)行C++代碼,就必須用該平臺(tái)對(duì)應(yīng)的C++代碼編譯器重新編譯一遍才可以.Java一開始就意識(shí)到需要跨平臺(tái)運(yùn)行,所以Java設(shè)計(jì)了虛擬機(jī),先將Java代碼編譯成字節(jié)碼(class文件),這是虛擬機(jī)能夠識(shí)別的指令,再由虛擬機(jī)內(nèi)部將字節(jié)碼翻譯成機(jī)器碼,所以我們只需要有Java字節(jié)碼,就可以在不同平臺(tái)的虛擬機(jī)中運(yùn)行,這也就是我們一直說的"一次編譯,到處運(yùn)行".
Java虛擬機(jī)如何運(yùn)行Java字節(jié)碼我們JDK所用的虛擬機(jī)名為HotSpot虛擬機(jī),他會(huì)將所有class文件加載進(jìn)來,加載后的Java類會(huì)被放置在方法區(qū),后面運(yùn)行時(shí)會(huì)執(zhí)行其中的代碼.Java虛擬機(jī)會(huì)在內(nèi)存中劃分出幾塊,包括程序計(jì)數(shù)器,本地方法棧,Java虛擬機(jī)棧,堆以及方法區(qū).
不過光是Java字節(jié)碼還是無法運(yùn)行,Java虛擬機(jī)還需要將字節(jié)碼翻譯成機(jī)器碼,HotSpot有2種形式:第一種是解釋執(zhí)行,即將字節(jié)碼逐條翻譯成機(jī)器碼并運(yùn)行;第二種是即時(shí)編譯(JIT),他會(huì)將一個(gè)方法內(nèi)的所有字節(jié)碼編譯成機(jī)器碼再執(zhí)行.
前者的優(yōu)勢(shì)無需等待編譯,但逐條解釋的代價(jià)就是運(yùn)行速度會(huì)比后者慢,HotSpot默認(rèn)采用混合模式,它會(huì)先解釋執(zhí)行字節(jié)碼,然后對(duì)于反復(fù)執(zhí)行的熱點(diǎn)代碼會(huì)去進(jìn)行即時(shí)編譯.
即時(shí)編譯是監(jiān)理在復(fù)合二八定律的基礎(chǔ)上,即百分之20的代碼占據(jù)百分之80的計(jì)算資源.對(duì)于不常用的代碼我們無需消耗時(shí)間在編譯成機(jī)器碼上,采用解釋執(zhí)行就可以,而對(duì)于熱點(diǎn)代碼我們可以將其編譯成機(jī)器碼以提升運(yùn)行速度.
HotSpot內(nèi)置了幾個(gè)即時(shí)編譯器:Client Complier和Server Complier,簡(jiǎn)稱為C1、C2編譯器,以便在編譯時(shí)間和生成代碼的執(zhí)行效率之間做取舍,C1編譯時(shí)間更快,C2編譯質(zhì)量更高.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/73290.html
摘要:由虛擬機(jī)加載的類,被加載到虛擬機(jī)內(nèi)存中之后,虛擬機(jī)會(huì)讀取并執(zhí)行它里面存在的字節(jié)碼指令。虛擬機(jī)中執(zhí)行字節(jié)碼指令的部分叫做執(zhí)行引擎。 什么是Java虛擬機(jī)? 作為一個(gè)Java程序員,我們每天都在寫Java代碼,我們寫的代碼都是在一個(gè)叫做Java虛擬機(jī)的東西上執(zhí)行的。但是如果要問什么是虛擬機(jī),恐怕很多人就會(huì)模棱兩可了。在本文中,我會(huì)寫下我對(duì)虛擬機(jī)的理解。因?yàn)槟芰λ蓿赡苡行┑胤矫枋龅牟粔蚯?..
摘要:的三種常量池此外,有三種常量池,即字符串常量池又叫全局字符串池文件常量池運(yùn)行時(shí)常量池。開始虛擬機(jī)把字符串常量池位置從永久代挪到堆,又徹底取消,把諸如之類的元數(shù)據(jù)都挪到堆之外管理。 前言 前陣子和朋友討論一個(gè)問題: 字符串常量歸常量池管理,那比如 String str = abc; abc這個(gè)對(duì)象是放在內(nèi)存中的哪個(gè)位置,是字符串常量池中還是堆? 這句代碼的abc當(dāng)然在常量池中,只有n...
摘要:上一篇文章講解了虛擬機(jī)中的內(nèi)存布局,這里就稍作拓展,聊聊對(duì)象在虛擬機(jī)中的一些存儲(chǔ)細(xì)節(jié)吧。參考文檔深入理解虛擬機(jī)高級(jí)特效與最佳實(shí)現(xiàn),第章周志明著系列筆記內(nèi)存區(qū)域和機(jī)制明舞深入理解結(jié)構(gòu)團(tuán)長(zhǎng)聯(lián)系作者 上一篇文章講解了 java 虛擬機(jī)中的內(nèi)存布局,這里就稍作拓展,聊聊 java 對(duì)象在虛擬機(jī)中的一些存儲(chǔ)細(xì)節(jié)吧。 本文主要圍繞虛擬機(jī)中對(duì)象如何創(chuàng)建?對(duì)象內(nèi)存都放些什么?如何訪問對(duì)象內(nèi)存?這么三...
摘要:在之后,原來永久代的數(shù)據(jù)被分到了堆和元空間中。元空間存儲(chǔ)類的元信息,靜態(tài)變量和常量池等放入堆中。這樣能在一些場(chǎng)景中顯著提高性能,因?yàn)楸苊饬嗽诙褍?nèi)存和堆外內(nèi)存來回拷貝數(shù)據(jù)。 以下內(nèi)容部分轉(zhuǎn)載于: CS-Notes showImg(http://ww1.sinaimg.cn/large/005NT19Ply1g385uooqv9j30kd0slmyw.jpg); 程序計(jì)數(shù)器(Program...
閱讀 1833·2021-09-22 15:55
閱讀 3525·2021-09-07 10:26
閱讀 631·2019-08-30 15:54
閱讀 687·2019-08-29 16:34
閱讀 843·2019-08-26 14:04
閱讀 3263·2019-08-26 11:47
閱讀 2137·2019-08-26 11:33
閱讀 2298·2019-08-23 15:17