Java 內功修煉第一講之談談對 Java 平台的理解

Java 內功修煉第一講之談談對 Java 平臺的理解

本系列博文將以面試題為切入點,帶你深入 Java 核心內容,提升 Java 內功修為。

面試官:談談你對 Java 平臺的理解?“Java 是解釋執行”,這句話正確嗎?

1.對 Java 平臺的理解

針對 Java 平臺的理解,我們可以從多方面簡明扼要的談及一下,比如:Java 是一門面向對象的高級語言,具有 Compile once, run anywhere(一次編譯,到處運行) 的跨平臺的特性;Java 語言的特性包括泛型, lambda 特性等;基礎類庫包括常用的 utils 包下面的集合,還有 IO/NIO, 網絡,併發,安全等基礎類庫等。

在談談 JVM 的一些基礎概念和機制,這其中包括 Java 的類加載機制,常用版本 JDK(如 JDK8) 內嵌的 Class-Loader, 例如 Bootstrap, Application 和 Extension Class-Loader(拓展類加載器);類的加載的大致過程:加載 -> 驗證 -> 連接 -> 初始化;自定義 Class-Loader 等。還可以說說垃圾回收的基本原理,最常見的垃圾回收器,如 SerialGC、Parallel GC、 CMS、 G1 等。

還有 JDK 包含的一些工具,如編譯器,運行時環境,安全工具,性能診斷(線上線程死鎖,如何鎖定問題?),監控工具等。

Java 內功修煉第一講之談談對 Java 平臺的理解

日常開發中,我們會經常接觸到 JRE(java runtime environment) 或者是 JDK (java development kit)。JRE 也就是 java 運行時環境,它包含了 JVM 和 java 類庫以及其他一些模塊。

題外話:很多 java 開發者不是很清晰 JRE 和 JDK 之間的關係。

JDK, 其實就是 JRE 的一個超集,它提供了更多的工具,比如編譯器,各種診斷工具等。

2.Java 究竟是不是解釋執行呢?

說 Java 是解釋執行這句話比較片面,也是不太準確的。我們開發出的以 .java 為後綴的源代碼,會通過 javac 編譯成 JVM 能夠看懂的字節碼,然後在運行時,通過 Java 虛擬機內嵌的解釋器將字節碼轉換最終計算機能夠看懂的機器碼。

但是常見的 JVM , 比如我們生產環境經常使用的 Oracle JDK 提供的 Hotspot JVM, 都提供了 JIT(just in time) 編譯器,也就是動態編譯器,JIT 能夠將程序中那些熱點代碼編譯成機器碼(大部分程序都是小部分的熱點代碼耗費了系統的大多數資源),這種情況下,所說的部分熱點代碼就屬於編譯執行的範疇,而不是解釋執行。

備註:說到這裡,也許還是有很多人很迷糊,到底解釋執行和編譯執行有啥區別?

舉個形象的栗子,拿翻譯官翻譯的場景說事,解釋執行就好比同聲傳譯,而編譯執行就好比提前翻譯好,到時候直接放錄音即可。

3.解釋執行和編譯執行知識面深入

我們都知道,Java 通常分為編譯期和運行時。但是 Java 的編譯和 C/C++ 又有不同的意義,我們說的編譯通常是通過 javac 命令將 java 源代碼編譯成 .class 字節碼文件,而不是能夠直接運行的機器碼。

在運行時,JVM 會通過類加載器(Class-Loader)加載字節碼,解釋執行或者編譯執行。在主流的 JDK 版本(JDK 8)中, 實際上採用的是混合編譯模式,即解釋執行 + 編譯執行。

另外,Java 虛擬機啟動時,我們可以指定不同的參數對運行模式進行選擇。比如,指定 -Xint, 就是告訴 JVM 只進行解釋執行,而不使用編譯執行,這種模式拋棄了 JIT 帶來的性能優勢。對應的,我們還可以通過 -Xcomp 參數,告訴 JVM 關閉解釋執行。我們可能會覺得這種模式,性能較高,那可未必。-Xcomp 會導致 JVM 啟動變慢很多。

除了上面談到的解釋執行和編譯執行,還有一種叫做 AOT(Ahead-of-Time Compilation), 直接將字節碼編譯成機器碼,這樣避免了 JIT 預熱等方面的開銷,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


分享到:


相關文章: