Java面試中,遇到這類面試題最吃虧!
從你接觸 Java開發到現在,你對 Java最直觀的印象是什麼呢?是它宣傳的 “Compile once, run anywhere”,還是目前看已經有些過於形式主義的語法呢?你對於 Java平臺到底瞭解到什麼程度?請你先停下來總結思考一下。
今天要問你的問題是,談談你對 Java平臺的理解?“Java是解釋執行”,這句話正確嗎?
典型回答
Java本身是一種物件導向的語言,最顯著的特性有兩個方面:
一是所謂的“一次編譯,到處執行”(Compile 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.class
-
jaotc --output libjava.base.so --module java.base
然後,在啟動時直接指定就可以了。
-
java -XX:AOTLibrary=./libHelloWorld.so,./libjava.base.so HelloWorld
而且,Oracle JDK支援分層編譯和 AOT協作使用,這兩者並不是二選一的關係。如果你有興趣,可以參考相關文件:。AOT也不僅僅是隻有這一種方式,業界早就有第三方工具(如 GCJ、Excelsior JET)提供相關功能。
另外,JVM作為一個強大的平臺,不僅僅只有 Java語言可以執行在 JVM上,本質上合規的位元組碼都可以執行,Java語言自身也為此提供了便利,我們可以看到類似 Clojure、Scala、Groovy、JRuby、Jython等大量 JVM語言,活躍在不同的場景。
今天,我簡單介紹了一下 Java平臺相關的一些內容,目的是提綱挈領地構建一個整體的印象,包括 Java語言特性、 核心類庫與常用第三方類庫、Java虛擬機器基本原理和相關工具,希望對你有所幫助。
在此我向大家推薦一個Java高階群 : 725633148 裡面會分享一些資深架構師錄製的影片錄影:(有Spring,MyBatis,Netty原始碼分析,高併發、高效能、分散式、微服務架構的原理,JVM效能最佳化、分散式架構)等這些成為架構師必備的知識體系 進群馬上免費領取,目前受益良多!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545684/viewspace-2158268/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 最新阿里Java面試題,這些面試題你會嗎?阿里Java面試題
- 想要面試BATJ,先做完這160道Java面試題~BATJava面試題
- 這幾道Java集合框架面試題在面試中幾乎必問Java框架面試題
- 面試中會遇到的正則題面試
- 【Java面試】Java常見IO面試題!Java面試題
- 【Java面試】Java設計模式面試題!Java設計模式面試題
- MyBatis面試題集合,90%會遇到這些問題MyBatis面試題
- 【Java面試】JSP常見面試題!JavaJS面試題
- 【Java面試】Servlet常見面試題!JavaServlet面試題
- 【Java面試】 Javascript常見面試題!JavaScript面試題
- java面試題Java面試題
- 【Java面試題】Java面試之多執行緒!Java面試題執行緒
- 100道JAVA面試題+JAVA面試題參考答案Java面試題
- 面試中遇到的一些問題面試
- 橫趟!面試中遇到的 ZooKeeper 問題面試
- 當裸辭遇到面試難,這些面試題你需要了解一下面試題
- 想要去BATJ面試的話,先做完這160道Java面試題...BATJava面試題
- 當裸辭遇到了面試難,你需要了解一下這些面試題面試題
- 面試題-JAVA反射面試題Java反射
- Java面試題(一)Java面試題
- java 面試題1Java面試題
- JAVA面試題(8)Java面試題
- Java SSM面試題JavaSSM面試題
- 面試題--Java反射面試題Java反射
- 面試題-JAVA IO面試題Java
- Java面試題全集Java面試題
- Java面試題解析Java面試題
- 求職遇到的面試題目求職面試題
- java面試題總結-詳細分類Java面試題
- 【Java面試】Java面試題基礎系列212道(上)Java面試題
- 昨天去面試,這5個Python面試題都被考到了,Python面試題No6Python面試題
- Java面試鍊金系列 (1) | 關於String類的常見面試題剖析Java面試題
- 面試題:面試經面試題
- Java類載入機制詳解【java面試題】Java面試題
- Java面試系列:Java面試題基礎系列228道(上)Java面試題
- [ Java面試題 ]Java 開發崗面試知識點解析Java面試題
- Java面試必問面試題,你掌握了嗎?Java面試題
- 2019 阿里java面試總結 (含面試題解析)阿里Java面試題