Java典型面試題 ——談談你對Java平臺的理解?

2021-03-02 InfoQ
出處 | 極客時間《Java 核心技術 36 講》  

從你接觸 Java 開發到現在,你對 Java 最直觀的印象是什麼呢?是它宣傳的 「Write once, run anywhere」,還是目前看已經有些過於形式主義的語法呢?你對於 Java 平臺到底了解到什麼程度?請你先停下來總結思考一下。

今天我要問你的問題是,談談你對 Java 平臺的理解?「Java 是解釋執行」,這句話正確嗎?

Java 本身是一種面向對象的語言,最顯著的特性有兩個方面,一是所謂的「書寫一次,到處運行」(Write once, run anywhere),能夠非常容易地獲得跨平臺能力;另外就是垃圾收集(GC, Garbage Collection),Java 通過垃圾收集器(Garbage Collector)回收分配內存,大部分情況下,程式設計師不需要自己操心內存的分配和回收。

我們日常會接觸到 JRE(Java Runtime Environment)或者 JDK(Java Development Kit)。 JRE,也就是 Java 運行環境,包含了 JVM 和 Java 類庫,以及一些模塊等。而 JDK 可以看作是 JRE 的一個超集,提供了更多工具,比如編譯器、各種診斷工具等。

對於「Java 是解釋執行」這句話,這個說法不太準確。我們開發的 Java 的原始碼,首先通過 Javac 編譯成為字節碼(bytecode),然後,在運行時,通過 Java 虛擬機(JVM)內嵌的解釋器將字節碼轉換成為最終的機器碼。但是常見的 JVM,比如我們大多數情況使用的 Oracle JDK 提供的 Hospot JVM,都提供了 JIT(Just-In-Time)編譯器,也就是通常所說的動態編譯器,JIT 能夠在運行時將熱點代碼編譯成機器碼,這種情況下部分熱點代碼就屬於編譯執行,而不是解釋執行了。

其實這個問題,問得有點籠統。題目本身是非常開放的,往往考察的是多個方面,比如,基礎知識理解是否很清楚;是否掌握 Java 平臺主要模塊和運行原理等。很多面試者會在這種問題上吃虧,稍微緊張了一下,不知道從何說起,就給出個很簡略的回答。

對於這類籠統的問題,你需要儘量表現出自己的思維深入並系統化,Java 知識理解得也比較全面,一定要避免讓面試官覺得你是個「知其然不知其所以然」的人。畢竟明白基本組成和機制,是日常工作中進行問題診斷或者性能調優等很多事情的基礎,相信沒有招聘方會不喜歡「熱愛學習和思考」的面試者。

即使感覺自己的回答不是非常完善,也不用擔心。我個人覺得這種籠統的問題,有時候回答得稍微片面也很正常,大多數有經驗的面試官,不會因為一道題就對面試者輕易地下結論。通常會儘量引導面試者,把他的真實水平展現出來,這種問題就是做個開場熱身,面試官經常會根據你的回答擴展相關問題。

回歸正題,對於 Java 平臺的理解,可以從很多方面簡明扼要地談一下,例如:Java 語言特性,包括泛型、Lambda 等語言特性;基礎類庫,包括集合、IO/NIO、網絡、並發、安全等基礎類庫。對於我們日常工作應用較多的類庫,面試前可以系統化總結一下,有助於臨場發揮。

或者談談 JVM 的一些基礎概念和機制,比如 Java 的類加載機制,常用版本 JDK(如 JDK 8)內嵌的 Class-Loader,例如 Bootstrap、 Application 和 Extension Class-loader;類加載大致過程:加載、驗證、連結、初始化(這裡參考了周志明的《深入理解 Java 虛擬機》,非常棒的 JVM 上手書籍);自定義 Class-Loader 等。還有垃圾收集的基本原理,最常見的垃圾收集器,如 SerialGC、Parallel GC、 CMS、 G1 等,對於適用於什麼樣的工作負載最好也心裡有數。這些都是可以擴展開的領域,我會在後面的專欄對此進行更系統的介紹。

當然還有 JDK 包含哪些工具或者 Java 領域內其他工具等,如編譯器、運行時環境、安全工具、診斷和監控工具等。這些基本工具是日常工作效率的保證,對於我們工作在其他語言平臺上,同樣有所幫助,很多都是觸類旁通的。

下圖是我總結的一個相對寬泛的藍圖供你參考。

不再擴展了,回到前面問到的解釋執行和編譯執行的問題。有些面試官喜歡在特定問題上「刨根問底兒」,因為這是進一步了解面試者對知識掌握程度的有效方法,我稍微深入探討一下。

眾所周知,我們通常把 Java 分為編譯期和運行時。這裡說的 Java 的編譯和 C/C++ 是有著不同的意義的,Javac 的編譯,編譯 Java 源碼生成「.class」文件裡面實際是字節碼,而不是可以直接執行的機器碼。Java 通過字節碼和 Java 虛擬機(JVM)這種跨平臺的抽象,屏蔽了作業系統和硬體的細節,這也是實現「一次編譯,到處執行」的基礎。

在運行時,JVM 會通過類加載器(Class-Loader)加載字節碼,解釋或者編譯執行。就像我前面提到的,主流 Java 版本中,如 JDK 8 實際是解釋和編譯混合的一種模式,即所謂的混合模式(-Xmixed)。通常運行在 server 模式的 JVM,會進行上萬次調用以收集足夠的信息進行高效的編譯,client 模式這個門限是 1500 次。Oracle Hotspot JVM 內置了兩個不同的 JIT compiler,C1 對應前面說的 client 模式,適用於對於啟動速度敏感的應用,比如普通 Java 桌面應用;C2 對應 server 模式,它的優化是為長時間運行的伺服器端應用設計的。默認是採用所謂的分層編譯(TieredCompilation)。這裡不再展開更多 JIT 的細節,沒必要一下子就鑽進去,我會在後面介紹分層編譯的內容。

Java 虛擬機啟動時,可以指定不同的參數對運行模式進行選擇。 比如,指定「-Xint」,就是告訴 JVM 只進行解釋執行,不對代碼進行編譯,這種模式拋棄了 JIT 可能帶來的性能優勢。畢竟解釋器(interpreter)是逐條讀入,逐條解釋運行的。與其相對應的,還有一個「-Xcomp」參數,這是告訴 JVM 關閉解釋器,不要進行解釋執行,或者叫作最大優化級別。那你可能會問這種模式是不是最高效啊?簡單說,還真未必。「-Xcomp」會導致 JVM 啟動變慢非常多,同時有些 JIT 編譯器優化方式,比如分支預測,如果不進行 profiling,往往並不能進行有效優化。

除了我們日常最常見的 Java 使用模式,其實還有一種新的編譯方式,即所謂的 AOT(Ahead-of-Time Compilation),直接將字節碼編譯成機器代碼,這樣就避免了 JIT 預熱等各方面的開銷,比如 Oracle JDK 9 就引入了實驗性的 AOT 特性,並且增加了新的 jaotc 工具。利用下面的命令把某個類或者某個模塊編譯成為 AOT 庫。

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

然後,在啟動時直接指定就可以了。

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

而且,Oracle JDK 支持分層編譯和 AOT 協作使用,這兩者並不是二選一的關係。如果你有興趣,可以參考相關文檔:http://openjdk.java.net/jeps/295。AOT 也不僅僅是只有這一種方式,業界早就有第三方工具(如 GCJ、Excelsior JET)提供相關功能。

另外,JVM 作為一個強大的平臺,不僅僅只有 Java 語言可以運行在 JVM 上,本質上合規的字節碼都可以運行,Java 語言自身也為此提供了便利,我們可以看到類似 Clojure、Scala、Groovy、JRuby、Jython 等大量 JVM 語言,活躍在不同的場景。

今天,我簡單介紹了一下 Java 平臺相關的一些內容,目的是提綱挈領地構建一個整體的印象,包括 Java 語言特性、 核心類庫與常用第三方類庫、Java 虛擬機基本原理和相關工具,希望對你有所幫助。

想看更多 Java 經典面試題深度解析?推薦關注《Java 核心技術 36 講》。專欄重點圍繞「術」與「道」,為你講解 Java 面試的核心知識點。就算你暫時不需要準備面試,照樣可以通過這個專欄,提升 Java 技能。

福利一:限時優惠價¥58 最後一天,原價¥68(1 月 12 日恢復原價)

福利二:每邀請一位好友購買,你可獲得 18 元現金返現,多邀多得,上不封頂,立即提現

長按識別下圖二維碼,立即訂閱。

相關焦點

  • 面試題之java基礎
    有的人找不到工作總說是大環境不好的原因,送你一段話:哈哈哈,就當是網際網路裁員浪潮下的一個笑話吧。應部分網友的建議,從今天起會逐步的總結一些java、php相關的面試題,由簡單到複雜歸納一個系列:【金三銀四】,中間部分題目的答案來源於網絡,如若不嚴謹還望諒解。ja
  • Java面試總結之Java基礎
    無論是工作多年的高級開發人員還是剛入職場的新人,在換工作面試的過程中,Java基礎是必不可少的面試題之一。能不能順利通過面試,拿到自己理想的offer,在準備面試的過程中,Java基礎也是很關鍵的。對於工作多年的開發人員來說,Java基礎往往是會被大家所忽略的,但在面試的過程中,確是必不可少的問題。在這篇文章裡就來為大家總結一下經常會被問到的Java基礎題。
  • Java經典面試題答案解析(1-80題)
    說說反射的用途及實現原理,Java獲取反射的三種方法這道面試題,看我這篇文章哈:談談Java反射:從入門到實踐,再到原理Java獲取反射的三種方法:15. 面向對象的特徵面向對象的三大特徵:16.這道面試題,可以看我這篇文章哈:Java程式設計師必備:異常的十個關鍵知識點24. 談談Java的異常層次結構
  • Java 最常見的 200+ 面試題:面試必備
    聊回面試題這件事,這份面試清單原本是我們公司內部使用的,可到後來有很多朋友在微信上聯繫到我,讓我幫他們找一些面試方面的資料,而且這些關係也不太好拒絕,一呢,是因為這些找我,要面試題的人,不是我的好朋友的弟弟妹妹,就是我的弟弟妹妹們;二呢,我也不能馬馬虎虎的對付,受人之事忠人之命,我也不能辜負這份信任。
  • 面試前必看Java線程面試題
    下面是Java線程相關的熱門面試題,你可以用它來好好準備面試。1.面向對象的特徵有哪些方面?答:面向對象的特徵主要有以下幾個方面:- 抽象:抽象是將一類對象的共同特徵總結出來構造類的過程,包括數據抽象和行為抽象兩方面。
  • 2019 最新 200 道 Java 面試題
    ,我做了大量的「功課」,首先我研究了幾乎所有大廠的面試題,還和負責招聘工作的幾個朋友,詳細的探討了 Java 面試所要涉及的知識點,於是就有了今天大家看到的這 200 多道面試題。原因二:節省招聘雙方彼此的時間,有些來公司面試人,無論是有幾年工作經驗的還是剛畢業的,就連這些最基礎的面試題都搞不定,這確實讓人很遺憾。常言道「一屋不掃何以掃天下」,也是同樣的道理,如果連基礎的概念都搞不明白,又怎麼讓面試官相信你能寫出高質量的程序呢?與其浪費彼此的時間,還不如花點時間把自己的基礎知識掌握牢固。
  • 10個經典的 Java main 方法面試題
    以下是筆者認為比較經典的關於Java main方法的面試題,與其說是Java面試題,其實也是Java的一些最基礎知識問題,分享給大家,如有錯誤,請指出。1.不用main方法如何定義一個類?為了運行java類,類的main()方法應該有例如「public static void main(String[] args)」的聲明。如果你對此聲明做任何修改,編譯也是可以成功的。但是,運行不了Java程序。你會得到運行時錯誤,因為找不到main方法。
  • 一些經典Java面試題&答案解析 || 附《Effective Java》中文版
    我們給大家準備了一些面試題,所有題目都是經過精心挑選的,很基礎又考驗求職者的基本功,應該說被面試到的機率很大。希望能對你有所幫助。1、下列代碼輸出內容是什麼?(2) 運用反射手段,調用java.lang.Class或者java.lang.reflect.Constructor類的newInstance()實例方法。(3) 調用對象的clone()方法。(4) 運用反序列化手段,調用java.io.ObjectInputStream對象的 readObject()方法。
  • 阿里螞蟻金服Java程式設計師面試的11個問題,你會幾個呢?
    比如阿里巴巴java面經、小米java面經、網易java面經等,吸引了大多數的程式設計師們的圍觀。2、經典面試題練習面試題會考察哪些這無法猜到,不過可以刷一些經典的面試題,比如在W3Cschool app開發者頭條上查看名企面試題,對於面試大有裨益。
  • Java 線程面試題 Top 50
    在典型的Java面試中, 面試官會從線程的基本概念問起, 如:為什麼你需要使用線程, 如何創建線程,用什麼方式創建線程比較好(比如:繼承thread類還是調用Runnable接口),然後逐漸問到並發問題像在Java並發編程的過程中遇到了什麼挑戰,Java內存模型,JDK1.5引入了哪些更高階的並發工具,並發編程常用的設計模式,經典多線程問題如生產者消費者,哲學家就餐,讀寫器或者簡單的有界緩衝區問題
  • 【Java面試題】常見Java面試知識點總結-1
    我是:小職(z_zhizuobiao)找我:✅ 解鎖高薪工作 ✅ 免費獲取乾貨教程這裡整理了部分較為重點的Java面試題內容,而且對於答案有困惑,補充了解釋內容,便於理解。1. 什麼是Java虛擬機?為什麼Java被稱作是「平臺無關的程式語言」?
  • 面試總結——Java高級工程師
    2、深入了解並熟記部分java基礎知識原因:大部分公司無論面試初級還是高級,無論是筆試還是面試,都會問到一系列基礎題,這些基礎題大概涵括jvm、字符串、集合、線程等等,如果說每一個讓你死記硬背你肯定記不住,那麼就是理解中記憶了,拿jvm來說 ,如果讓你談談你對jvm的理解, 那麼你首先得知道JVM有哪些結構組成,每個結構用來做什麼的,然後考慮一個Java對象從創建到回收,
  • 你見過老外的 Java 面試題嗎 (上)?
    前言最近無聊的在逛某 tube 網站,本來想看看大家是怎麼吐槽川普的,結果無意間點進了一個老外面試 Java 的視頻,對於常年面試被吊打的我瑟瑟發抖,於是決定進去一探究竟。畢竟不是專業的後臺開發,所以我在面試到後臺知識的時候果斷的退了出來,才讓自己免受了侮辱。不過鑑於我手速出眾,飛速的記錄下了 Java 的基礎題,所以準備貢獻出來,供大家享樂。
  • 50道Java集合經典面試題(收藏版)
    前言來了來了,50道Java集合面試題也來啦~ 已經上傳github:https://github.com/whx123/JavaHome1.hashset保證元素不重複~ (這個面試官很可能會問什麼原理,這個跟HashMap有關的哦)HashSet,需要談談它倆hashcode()和equles()哦~實際是基於HashMap實現的,HashSet 底層使用HashMap來保存所有元素的看看它的add方法吧~ public boolean
  • 給Java程式設計師的20個鍊表面試題
    這時,你知道如何反轉只有一個節點的鍊表。鍊表不過就是同一個節點。這與遞歸非常相似,實際上,你能解決的最小子問題就是遞歸解決方案的基本情況。謹記:如果你不具備任何數據結構基礎知識,或近期沒有對其進行重溫,那麼解決這些基於鍊表的編程問題是沒有意義的。
  • 學了1年java的程式設計師面試,掛在了這道基礎算法題!
    這都是java的算法題,應該來講都是些比較簡單的算法題,但是我敢說很多基礎的學習的,或者想去面試的人都會不能完整的寫出來,現在
  • Java面試題全集 第二彈(史上最強)
    提示:如果不能給出此題的正確答案,說明之前第21題Java類加載機制還沒有完全理解,趕緊再看看吧。13、數據類型之間的轉換:- 如何將字符串轉換為基本數據類型?- 如何將基本數據類型轉換為字符串?面試題:2005年摩託羅拉的面試中曾經問過這麼一個問題「If a process reports a stack overflow run-time error, what’s the most possible cause?」
  • Java最常見600+面試題全解析:面試必備
    最近在刷面試題,所以需要看大量的Java相關的面試題,從大量的題目中總結了很多的知識,也分享給需要的同學。尚學堂與500+企業合作,建立IT行業最全的企業面試題庫。每周8~20家企業上門招聘,輕鬆掌握企業最新面試題集。本題集幾乎都是【必考題】,都能看懂的話,保你面試十拿九穩。
  • Java SSM框架相關基礎面試題整理
    一、Spring面試題1、Spring 在ssm中起什麼作用?
  • 理解java的final、finally以及finalize
    剛學完java找工作的小夥伴基本都會去看一些面試題,肯定會看到過「final、finally和finalize區別」這個題目。那要怎麼理解呢,我來一個一個的說說。final百度翻譯的結果是「最終的」,這裡可以理解為「最終版」。學軟體開發的,肯定聽過一個類似的段子。程式設計師經過幾次修正,注釋說這是這個功能的最終版了。