1. 程式人生 > 其它 >【面試題】Java核心技術三十六講(更新中)

【面試題】Java核心技術三十六講(更新中)

技術標籤:分散式java程式語言python面試

Java面試者存在的問題

應聘初級、中級的Java工程師,要求紮實的Java和電腦科學基礎,掌握主流框架的使用。
應聘高階Java工程師或技術專家,需要對Java IO/NIO,併發,虛擬機器等,要掌握底層原始碼,並對分散式,安全,效能等領域有進一步的要求。

Java面試者通常存在的問題:

“知其然不知其所以然”。雖然面試者做了多年技術,開發了很多業務應用,但似乎並未思考過種種技術選擇背後的邏輯。這樣的話,公司並不放心把具有一定深度的任務交給他,更重要的是,並不確定他未來技術能力的成長潛力有多大。如果團隊所從事的是公司核心產品,工作於基礎技術領域,那麼就不需要那些“差不多”或“還行”的程式碼,而是需要達到一定水準的高質量設計與實現。

知識碎片化,不成系統。在面試中,面試者無法完整、清晰地描述自己所開發的系統,或者使用的相關技術。平時可能埋頭苦幹,或者過於死磕某個實現細節,並沒有抬頭審視這些技術。比如,有的面試者,有一些併發程式設計經驗,但對基本的併發類庫掌握卻並不紮實,似乎覺得在用的時候進行 “面向搜尋引擎的程式設計” 就足夠了。這種情況下,無法確定這個面試者有高效解決複雜問題、設計複雜系統的能力。

1. 談談你對Java平臺的理解

"Java是解釋執行"對嗎?

Java有兩大特性,一是“Compile Once, Run Anywhere”,跨平臺能力,二是垃圾回收(GC),通過垃圾回收器回收分配記憶體,無需程式設計師操心。

日常接觸的JRE包括JVM,Java類庫,以及一些模組等,JDK則是JRE的超集,提供了編譯器,診斷工具等。

通常,Java原始碼首先通過Javac編譯為位元組碼,然後通過JVM內嵌的直譯器在執行時將其轉為機器碼。
但常見的JVM,比如Oracle JDK提供的Hotspot JVM,提供了JIT(Just-in-time)編譯器(動態編譯器),能夠在執行時將熱點程式碼編譯成機器碼,這種情況就屬於編譯執行,而非解釋執行。

Java和C/C++編譯的區別

Java的編譯,編譯Java原始碼生成的.class檔案裡的實際上是位元組碼,而非機器碼。
在執行時,JVM通過類載入器Class-Loader載入位元組碼,解釋或者編譯執行,主流的Java版本,都是混合模式(-Xmixed)。

通常執行在 server 模式的 JVM ,會進行上萬次呼叫以收集足夠的資訊進行高效的編譯, client 模式這個門限是 1500 次。
Oracle Hotspot JVM 內建了兩個不同的 JIT compiler , C1 對應前面說的 client 模式,適用於對於啟動速度敏感的應用,比如普通 Java 桌面應用;
C2 對應 server 模式,它的優化是為長時間執行的伺服器端應用設計的,預設是採用所謂的分層編譯(TieredCompilation)。

Java 虛擬機器啟動時,可以指定不同的引數對執行模式進行選擇。
指定 “-Xint” ,只進行解釋執行,不對程式碼進行編譯,這種模式拋棄了 JIT 可能帶來的效能優勢。畢竟直譯器( interpreter )是逐條讀入,逐條解釋執行的。
指定 “-Xcomp” ,這是告訴 JVM 關閉直譯器,不要進行解釋執行,或者叫作最大優化級別。
但這未必是最高效的。 “-Xcomp” 會導致 JVM 啟動變慢非常多,同時有些 JIT 編譯器優化方式,比如分支預測,如果不進行 profling ,往往並不能進行有效優化。

還有一種新的編譯方式,即所謂的 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協作使用,這兩者並不是二選一的關係。參考文件:http://openjdk.java.net/jeps/295。
AOT也不僅僅是隻有這一種方式,業界早就有第三方工具(如 GCJ 、 Excelsior JET )提供相關功能。

另外, JVM 作為一個強大的平臺,不僅僅只有 Java 語言可以執行在 JVM 上,本質上合規的位元組碼都可以執行,比如 Clojure 、 Scala 、 Groovy 、 JRuby 、 Jython 等大量 JVM 語言。

2. Exception和Error有什麼區別?