》目錄
1.JDK、JRE惭聂、JVM三者的關(guān)系是什么窗声。
2.為什么Java要在虛擬機(jī)里運(yùn)行?
3.Java虛擬機(jī)是怎么執(zhí)行一段Java程序的辜纲?
4.Java虛擬機(jī)將Java字節(jié)碼翻譯成機(jī)器碼的形式有哪兩種笨觅?
5.為什么說Java的跨平臺(tái)性好?
6.Java是面向?qū)ο笳Z言耕腾,為什么要引入基本數(shù)據(jù)類型见剩?
》解答
1.JDK、JRE扫俺、JVM三者的關(guān)系是什么苍苞?
JDK(Java開發(fā)工具包)包含JRE(Java運(yùn)行時(shí)環(huán)境)及一系列開發(fā)、診斷工具,JRE包含運(yùn)行Java程序的必需組件:JVM(Java虛擬機(jī))以及Java核心類庫等羹呵。
簡(jiǎn)言之骂际,JDK>JRE>JVM。
2.為什么Java要在虛擬機(jī)里運(yùn)行冈欢?
1)可以輕松實(shí)現(xiàn)Java的跨平臺(tái)運(yùn)行歉铝,“一次編寫,到處運(yùn)行”凑耻。(即.java編譯成.class太示,.class就是可以在JVM上運(yùn)行的Java字節(jié)碼)
2)提供了托管環(huán)境,提供內(nèi)存管理拳话、垃圾回收等功能先匪,這些部分都比較冗長(zhǎng)且容易出錯(cuò)。
3)能使編程工作更輕松弃衍,編程人員只需要關(guān)注和業(yè)務(wù)相關(guān)的程序邏輯的編寫呀非,其它業(yè)務(wù)無關(guān)但是也同樣重要的事情由JVM來處理,如數(shù)組越界镜盯、動(dòng)態(tài)類型岸裙、安全權(quán)限等等的動(dòng)態(tài)檢測(cè)。
3.Java虛擬機(jī)是怎么執(zhí)行一段Java程序的速缆?
1)將由這段Java程序編譯而成的Java字節(jié)碼文件(即.class文件)加載到Java虛擬機(jī)中降允,虛擬機(jī)會(huì)將它放在方法區(qū)中,實(shí)際運(yùn)行時(shí)虛擬機(jī)會(huì)執(zhí)行方法區(qū)內(nèi)的代碼艺糜。
2)當(dāng)調(diào)用進(jìn)入一個(gè)方法剧董,JVM會(huì)在當(dāng)前線程的Java方法棧中生成一個(gè)棧幀(Java虛擬機(jī)將內(nèi)存分為堆、棧破停、方法區(qū)翅楼,其中棧由分為面向Java方法的Java方法棧,面向本地方法的本地方法棧真慢,以及存放各個(gè)線程執(zhí)行位置的PC寄存器毅臊,如下圖所示),存放局部變量黑界、字節(jié)碼的操作數(shù)等等(這里的局部變量是廣義的管嬉,除了普遍意義下的局部變量外,還包括實(shí)例方法的“this指針”朗鸠,以及方法所接收的參數(shù))蚯撩。
3)退出執(zhí)行當(dāng)前方法時(shí),彈出當(dāng)前棧幀烛占,并將其舍棄求厕。
4.Java虛擬機(jī)將Java字節(jié)碼翻譯成機(jī)器碼的形式有哪兩種?
解釋執(zhí)行和即時(shí)編譯。
解釋執(zhí)行是翻譯一條執(zhí)行一條呀癣,即時(shí)編譯是將一個(gè)方法中包含的所有Java字節(jié)碼翻譯成機(jī)器碼后再執(zhí)行美浦。
解釋執(zhí)行不需要等待JVM將所有Java字節(jié)碼翻譯成機(jī)器碼的這一段時(shí)間,執(zhí)行到哪一句翻譯哪一句项栏;即時(shí)編譯雖然需要等待這個(gè)整體翻譯的過程浦辨,但在后續(xù)的實(shí)際運(yùn)行中運(yùn)行速度更快。
HotSpot(標(biāo)準(zhǔn)JDK中的JVM)采用混合模式沼沈,結(jié)合了兩種方式的優(yōu)點(diǎn)流酬,先進(jìn)行解釋執(zhí)行,然后對(duì)其中的熱點(diǎn)代碼以方法為單位進(jìn)行即時(shí)編譯列另。
為了不干擾應(yīng)用的正常運(yùn)行芽腾,HotSpot的即時(shí)編譯是放在額外的編譯線程中進(jìn)行的。
5.為什么說Java的跨平臺(tái)性好页衙?
這個(gè)問題我看完文章后思考了很久不得解摊滔,又看了看其他博主的文章,忽然恍然大悟店乐。
跨平臺(tái)性指的是編譯后的文件跨平臺(tái)艰躺,而不是說源程序跨平臺(tái),若是源程序跨平臺(tái)眨八,則所有語言的源程序都是跨平臺(tái)的腺兴。
如VC將標(biāo)準(zhǔn)C開發(fā)的程序編譯成exe文件,可以在windows下運(yùn)行廉侧,但不能在linux下運(yùn)行页响;linux下gcc編譯生成的可執(zhí)行文件可以在linux下執(zhí)行但不能在windows下執(zhí)行。
而Java將源程序編譯成中間碼段誊,即Java字節(jié)碼闰蚕,又即.class文件,不論在什么平臺(tái)上枕扫,只要有Java虛擬機(jī)陪腌,.class文件就可以在虛擬機(jī)上運(yùn)行辱魁,運(yùn)行時(shí)它會(huì)被進(jìn)一步翻譯成機(jī)器可識(shí)別的機(jī)器碼烟瞧。
再說一說各種語言,根據(jù)執(zhí)行方式的不同染簇,原先有兩種:1)編譯執(zhí)行参滴,一次性由特定的編譯器編譯成可以在特定平臺(tái)上運(yùn)行的可執(zhí)行文件,優(yōu)點(diǎn)是執(zhí)行速度快锻弓,缺點(diǎn)是無法跨平臺(tái)砾赔。2)解釋執(zhí)行,將源程序解釋成機(jī)器碼,解釋一句執(zhí)行一句暴心,類似于同聲翻譯妓盲,優(yōu)點(diǎn)是跨平臺(tái)性好,缺點(diǎn)是執(zhí)行速度慢专普,暴露源程序悯衬。
后來Java就引入了“中間碼+虛擬機(jī)”的方式,結(jié)合了編譯執(zhí)行和解釋執(zhí)行的優(yōu)點(diǎn)檀夹,而且虛擬機(jī)又可以進(jìn)行自動(dòng)內(nèi)存管理、垃圾回收、安全檢測(cè)等等蜓谋,棒棒噠束铭!
6.Java是面向?qū)ο笳Z言,為什么要引入基本數(shù)據(jù)類型蚌堵?
因?yàn)槭褂没绢愋湍軌蛟?b>執(zhí)行效率和內(nèi)存使用兩方面提升軟件性能买决。
Java的基本類型都有對(duì)應(yīng)的值域和默認(rèn)值,如下圖所示:
其中辰斋,上文我們有提到策州,在調(diào)用某個(gè)方法時(shí),虛擬機(jī)會(huì)在Java方法棧中生成一個(gè)棧幀宫仗,存放局部變量和字節(jié)碼的操作數(shù)够挂。
其中,boolean藕夫、byte孽糖、short、int這四種類型在棧上占用的空間和int是一樣的(在32位的HotSpot中是4個(gè)字節(jié)毅贮,在64位的HotSpot中是8個(gè)字節(jié))办悟,它們會(huì)被當(dāng)成int類型來計(jì)算(如boolean的true就是1,false就是0)滩褥。當(dāng)然這種情況僅存在于局部變量病蛉,存儲(chǔ)于堆中的元素占用的空間和它們自身類型的大小還是一致的。
而long瑰煎、float铺然、double則會(huì)按各自的大小來加載,按自身類型來計(jì)算酒甸,而不是像上面四種類型的數(shù)據(jù)一樣被當(dāng)成int型數(shù)據(jù)來計(jì)算魄健。