Java面試題解析——談?wù)勀銓?duì)Java平臺(tái)的理解蓖租?

從你接觸 Java開(kāi)發(fā)到現(xiàn)在,你對(duì) Java最直觀的印象是什么呢饭玲?是它宣傳的 “Compile once, run anywhere”侥祭,還是目前看已經(jīng)有些過(guò)于形式主義的語(yǔ)法呢?你對(duì)于 Java平臺(tái)到底了解到什么程度茄厘?請(qǐng)你先停下來(lái)總結(jié)思考一下矮冬。

今天我要問(wèn)你的問(wèn)題是,談?wù)勀銓?duì) Java平臺(tái)的理解次哈?“Java是解釋執(zhí)行”胎署,這句話(huà)正確嗎?

典型回答

Java本身是一種面向?qū)ο蟮恼Z(yǔ)言窑滞,最顯著的特性有兩個(gè)方面硝拧,一是所謂的“一次編譯,到處執(zhí)行”(Compile once, run anywhere)葛假,能夠非常容易地獲得跨平臺(tái)能力障陶;另外就是垃圾收集(GC, Garbage Collection),Java通過(guò)垃圾收集器(Garbage Collector)回收分配內(nèi)存聊训,大部分情況下抱究,程序員不需要自己操心內(nèi)存的分配和回收。

我們?nèi)粘?huì)接觸到 JRE(Java Runtime Environment)或者 JDK(Java Development Kit)带斑。 JRE鼓寺,也就是 Java運(yùn)行環(huán)境勋拟,包含了 JVM和 Java類(lèi)庫(kù),以及一些模塊等妈候。而 JDK可以看作是 JRE的一個(gè)超集敢靡,提供了更多工具,比如編譯器苦银、各種診斷工具等啸胧。

對(duì)于“Java是解釋執(zhí)行”這句話(huà),這個(gè)說(shuō)法不太準(zhǔn)確幔虏。我們開(kāi)發(fā)的 Java的源代碼纺念,首先通過(guò) Javac編譯成為字節(jié)碼(bytecode),然后想括,在運(yùn)行時(shí)陷谱,通過(guò) Java虛擬機(jī)(JVM)內(nèi)嵌的解釋器將字節(jié)碼轉(zhuǎn)換成為最終的機(jī)器碼。但是常見(jiàn)的 JVM瑟蜈,比如我們大多數(shù)情況使用的 Oracle JDK提供的 Hospot JVM烟逊,都提供了 JIT(Just-In-Time)編譯器,也就是通常所說(shuō)的動(dòng)態(tài)編譯器铺根,JIT能夠在運(yùn)行時(shí)將熱點(diǎn)代碼編譯成機(jī)器碼宪躯,這種情況下部分熱點(diǎn)代碼就屬于編譯執(zhí)行,而不是解釋執(zhí)行了夷都。

考點(diǎn)分析

其實(shí)這個(gè)問(wèn)題,問(wèn)得有點(diǎn)籠統(tǒng)予颤。題目本身是非常開(kāi)放的囤官,往往考察的是多個(gè)方面,比如蛤虐,基礎(chǔ)知識(shí)理解是否很清楚党饮;是否掌握 Java平臺(tái)主要模塊和運(yùn)行原理等。很多面試者會(huì)在這種問(wèn)題上吃虧驳庭,稍微緊張了一下刑顺,不知道從何說(shuō)起,就給出個(gè)很簡(jiǎn)略的回答饲常。

對(duì)于這類(lèi)籠統(tǒng)的問(wèn)題蹲堂,你需要盡量表現(xiàn)出自己的思維深入并系統(tǒng)化,Java知識(shí)理解得也比較全面贝淤,一定要避免讓面試官覺(jué)得你是個(gè)“知其然不知其所以然”的人柒竞。畢竟明白基本組成和機(jī)制,是日常工作中進(jìn)行問(wèn)題診斷或者性能調(diào)優(yōu)等很多事情的基礎(chǔ)播聪,相信沒(méi)有招聘方會(huì)不喜歡“熱愛(ài)學(xué)習(xí)和思考”的面試者朽基。

即使感覺(jué)自己的回答不是非常完善布隔,也不用擔(dān)心。我個(gè)人覺(jué)得這種籠統(tǒng)的問(wèn)題稼虎,有時(shí)候回答得稍微片面也很正常衅檀,大多數(shù)有經(jīng)驗(yàn)的面試官,不會(huì)因?yàn)橐坏李}就對(duì)面試者輕易地下結(jié)論霎俩。通常會(huì)盡量引導(dǎo)面試者哀军,把他的真實(shí)水平展現(xiàn)出來(lái),這種問(wèn)題就是做個(gè)開(kāi)場(chǎng)熱身茸苇,面試官經(jīng)常會(huì)根據(jù)你的回答擴(kuò)展相關(guān)問(wèn)題排苍。

戳此訂閱《Java核心技術(shù) 36講》

知識(shí)擴(kuò)展

回歸正題,對(duì)于 Java平臺(tái)的理解学密,可以從很多方面簡(jiǎn)明扼要地談一下淘衙,例如:Java語(yǔ)言特性,包括泛型腻暮、Lambda等語(yǔ)言特性彤守;基礎(chǔ)類(lèi)庫(kù),包括集合哭靖、IO/NIO具垫、網(wǎng)絡(luò)、并發(fā)试幽、安全等基礎(chǔ)類(lèi)庫(kù)筝蚕。對(duì)于我們?nèi)粘9ぷ鲬?yīng)用較多的類(lèi)庫(kù),面試前可以系統(tǒng)化總結(jié)一下铺坞,有助于臨場(chǎng)發(fā)揮起宽。

或者談?wù)?JVM的一些基礎(chǔ)概念和機(jī)制,比如 Java的類(lèi)加載機(jī)制济榨,常用版本 JDK(如 JDK 8)內(nèi)嵌的 Class-Loader坯沪,例如 Bootstrap、 Application和 Extension Class-loader擒滑;類(lèi)加載大致過(guò)程:加載腐晾、驗(yàn)證、鏈接丐一、初始化(這里參考了周志明的《深入理解 Java虛擬機(jī)》藻糖,非常棒的 JVM上手書(shū)籍);自定義 Class-Loader等库车。還有垃圾收集的基本原理颖御,最常見(jiàn)的垃圾收集器,如 SerialGC、Parallel GC潘拱、 CMS疹鳄、 G1等,對(duì)于適用于什么樣的工作負(fù)載最好也心里有數(shù)芦岂。這些都是可以擴(kuò)展開(kāi)的領(lǐng)域瘪弓,我會(huì)在后面的專(zhuān)欄對(duì)此進(jìn)行更系統(tǒng)的介紹。

當(dāng)然還有 JDK包含哪些工具或者 Java領(lǐng)域內(nèi)其他工具等禽最,如編譯器腺怯、運(yùn)行時(shí)環(huán)境、安全工具川无、診斷和監(jiān)控工具等呛占。這些基本工具是日常工作效率的保證,對(duì)于我們工作在其他語(yǔ)言平臺(tái)上懦趋,同樣有所幫助晾虑,很多都是觸類(lèi)旁通的。

下圖是我總結(jié)的一個(gè)相對(duì)寬泛的藍(lán)圖供你參考仅叫。

戳此訂閱《Java核心技術(shù) 36講》

不再擴(kuò)展了帜篇,回到前面問(wèn)到的解釋執(zhí)行和編譯執(zhí)行的問(wèn)題。有些面試官喜歡在特定問(wèn)題上“刨根問(wèn)底兒”诫咱,因?yàn)檫@是進(jìn)一步了解面試者對(duì)知識(shí)掌握程度的有效方法笙隙,我稍微深入探討一下。

眾所周知坎缭,我們通常把 Java分為編譯期和運(yùn)行時(shí)竟痰。這里說(shuō)的 Java的編譯和 C/C++是有著不同的意義的,Javac的編譯掏呼,編譯 Java源碼生成“.class”文件里面實(shí)際是字節(jié)碼坏快,而不是可以直接執(zhí)行的機(jī)器碼。Java通過(guò)字節(jié)碼和 Java虛擬機(jī)(JVM)這種跨平臺(tái)的抽象哄尔,屏蔽了操作系統(tǒng)和硬件的細(xì)節(jié)假消,這也是實(shí)現(xiàn)“一次編譯柠并,到處執(zhí)行”的基礎(chǔ)岭接。

在運(yùn)行時(shí),JVM會(huì)通過(guò)類(lèi)加載器(Class-Loader)加載字節(jié)碼臼予,解釋或者編譯執(zhí)行鸣戴。就像我前面提到的,主流 Java版本中粘拾,如 JDK 8實(shí)際是解釋和編譯混合的一種模式窄锅,即所謂的混合模式(-Xmixed)。通常運(yùn)行在 server模式的 JVM,會(huì)進(jìn)行上萬(wàn)次調(diào)用以收集足夠的信息進(jìn)行高效的編譯入偷,client模式這個(gè)門(mén)限是 1500次追驴。Oracle Hotspot JVM內(nèi)置了兩個(gè)不同的 JIT compiler,C1對(duì)應(yīng)前面說(shuō)的 client模式疏之,適用于對(duì)于啟動(dòng)速度敏感的應(yīng)用殿雪,比如普通 Java桌面應(yīng)用;C2對(duì)應(yīng) server模式锋爪,它的優(yōu)化是為長(zhǎng)時(shí)間運(yùn)行的服務(wù)器端應(yīng)用設(shè)計(jì)的丙曙。默認(rèn)是采用所謂的分層編譯(TieredCompilation)。這里不再展開(kāi)更多 JIT的細(xì)節(jié)其骄,沒(méi)必要一下子就鉆進(jìn)去亏镰,我會(huì)在后面介紹分層編譯的內(nèi)容。

Java虛擬機(jī)啟動(dòng)時(shí)拯爽,可以指定不同的參數(shù)對(duì)運(yùn)行模式進(jìn)行選擇索抓。 比如,指定“-Xint”某抓,就是告訴 JVM只進(jìn)行解釋執(zhí)行纸兔,不對(duì)代碼進(jìn)行編譯,這種模式拋棄了 JIT可能帶來(lái)的性能優(yōu)勢(shì)否副。畢竟解釋器(interpreter)是逐條讀入汉矿,逐條解釋運(yùn)行的。與其相對(duì)應(yīng)的备禀,還有一個(gè)“-Xcomp”參數(shù)洲拇,這是告訴 JVM關(guān)閉解釋器,不要進(jìn)行解釋執(zhí)行曲尸,或者叫作最大優(yōu)化級(jí)別赋续。那你可能會(huì)問(wèn)這種模式是不是最高效啊另患?簡(jiǎn)單說(shuō)纽乱,還真未必±セ“-Xcomp”會(huì)導(dǎo)致 JVM啟動(dòng)變慢非常多鸦列,同時(shí)有些 JIT編譯器優(yōu)化方式,比如分支預(yù)測(cè)鹏倘,如果不進(jìn)行 profiling薯嗤,往往并不能進(jìn)行有效優(yōu)化。

除了我們?nèi)粘W畛R?jiàn)的 Java使用模式纤泵,其實(shí)還有一種新的編譯方式骆姐,即所謂的 AOT(Ahead-of-Time Compilation),直接將字節(jié)碼編譯成機(jī)器代碼,這樣就避免了 JIT預(yù)熱等各方面的開(kāi)銷(xiāo)玻褪,比如 Oracle JDK 9就引入了實(shí)驗(yàn)性的 AOT特性肉渴,并且增加了新的 jaotc工具。利用下面的命令把某個(gè)類(lèi)或者某個(gè)模塊編譯成為 AOT庫(kù)带射。

jaotc?--output?libHelloWorld.so?HelloWorld.classjaotc?--output?libjava.base.so?--module?java.base

然后黄虱,在啟動(dòng)時(shí)直接指定就可以了。

java?-XX:AOTLibrary=./libHelloWorld.so,./libjava.base.so?HelloWorld

而且庸诱,Oracle JDK支持分層編譯和 AOT協(xié)作使用捻浦,這兩者并不是二選一的關(guān)系。AOT也不僅僅是只有這一種方式桥爽,業(yè)界早就有第三方工具(如 GCJ朱灿、Excelsior JET)提供相關(guān)功能。

另外钠四,JVM作為一個(gè)強(qiáng)大的平臺(tái)盗扒,不僅僅只有 Java語(yǔ)言可以運(yùn)行在 JVM上,本質(zhì)上合規(guī)的字節(jié)碼都可以運(yùn)行缀去,Java語(yǔ)言自身也為此提供了便利侣灶,我們可以看到類(lèi)似 Clojure、Scala缕碎、Groovy褥影、JRuby、Jython等大量 JVM語(yǔ)言咏雌,活躍在不同的場(chǎng)景凡怎。

今天,我簡(jiǎn)單介紹了一下 Java平臺(tái)相關(guān)的一些內(nèi)容赊抖,目的是提綱挈領(lǐng)地構(gòu)建一個(gè)整體的印象统倒,包括 Java語(yǔ)言特性、 核心類(lèi)庫(kù)與常用第三方類(lèi)庫(kù)氛雪、Java虛擬機(jī)基本原理和相關(guān)工具房匆,希望對(duì)你有所幫助

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市报亩,隨后出現(xiàn)的幾起案子浴鸿,更是在濱河造成了極大的恐慌,老刑警劉巖捆昏,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赚楚,死亡現(xiàn)場(chǎng)離奇詭異毙沾,居然都是意外死亡骗卜,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)寇仓,“玉大人举户,你說(shuō)我怎么就攤上這事”榉常” “怎么了俭嘁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)服猪。 經(jīng)常有香客問(wèn)我供填,道長(zhǎng),這世上最難降的妖魔是什么罢猪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任近她,我火速辦了婚禮,結(jié)果婚禮上膳帕,老公的妹妹穿的比我還像新娘粘捎。我一直安慰自己,他們只是感情好危彩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布攒磨。 她就那樣靜靜地躺著,像睡著了一般汤徽。 火紅的嫁衣襯著肌膚如雪娩缰。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天谒府,我揣著相機(jī)與錄音漆羔,去河邊找鬼。 笑死狱掂,一個(gè)胖子當(dāng)著我的面吹牛演痒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播趋惨,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鸟顺,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了器虾?” 一聲冷哼從身側(cè)響起讯嫂,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎兆沙,沒(méi)想到半個(gè)月后欧芽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡葛圃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年千扔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了憎妙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡曲楚,死狀恐怖厘唾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情龙誊,我是刑警寧澤抚垃,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站趟大,受9級(jí)特大地震影響鹤树,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逊朽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一魂迄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惋耙,春花似錦捣炬、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)接剩。三九已至江耀,卻和暖如春养盗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背届腐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工铁坎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人犁苏。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓硬萍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親围详。 傳聞我的和親對(duì)象是個(gè)殘疾皇子朴乖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容