談談對 java 平臺的理解?

談談你對 Java 平臺的理解 ? java 是解釋執行的這句話正確?

回答

首先呢,java 是一門面嚮對象語言,有着反射,泛型,lambda等語言特性,並且有着諸多的Java 類庫,比如 IO/NIO ,網絡,util,安全類庫,併發等。

它有着兩種顯著特性,第一種是容易跨平臺,這種跨平臺不同於C/C++ 需要考慮不同操作系統之間的差異性。java 的跨屏平臺更像是中間件,屏蔽了操作系統的細節,達到解耦的目的,實現跨平臺的優勢。第二種是垃圾回收機制,java 通過垃圾回收機制,可以在大部分情況下,讓程序員不必考慮內存的分配和使用問題。

日常接觸到 JRE 和 JDK ,它們分別表示的是,JRE 是 java 的運行時環境,包括 java 虛擬機(jvm) 和 java 類庫,而 jdk 則是包含 jre ,像是 jre 的一個超集,它裏面還提供了各種診斷工具。

對於 java 是不是解釋運行的說法並不準確,因爲開發的 java 源代碼經過 javac 的編譯稱爲 .class 字節碼文件,而不是機器碼,在 jvm 運行時才被解釋爲機器碼。但是常見的 jvm,大多數情況下都是使用 Oracle JDK 提供的 Hotsopt JVM ,都提供了 JIT 編譯器,JIT 編譯器能在運行時將熱點代碼編譯成機器碼,在這種情況下就屬於編譯執行而不是解釋執行了。

知識擴展

面試時可以從很多方面談起
從語言的本身特性和包含的工具,類庫說起

  • java 是一門面嚮對象語言,有着反射,泛型,lambda等語言特性
  • Java核心類庫包含集合類、線程相關類、IO、NIO、J.U.C併發包等;
  • JDK提供的工具包含:基本的編譯工具、虛擬機性能檢測相關工具,安全工具、診斷和監控工具等。

java 虛擬機說起

  • jvm 的概念
  • jvm 的運行機制
  • 大部分情況下,編程者只需要關心Java語言本身,而無需特意關心底層細節。包括對內存的分配和回收,也全權交給了GC。
  • 對於虛擬機而言,只要是符合規範的字節碼,它們都能被加載執行,當然,能正常運行的程序光滿足這點是不行的,程序本身需要保證在運行時不出現異常。所以,Scala、Kotlin、Jython等語言也可以跑在虛擬機上。

是否時解釋執行?

java 分爲 編譯期和運行時。與 C/C++ 的編譯不同。javac 編譯生產的 .class 爲字節碼而不是機器碼,java 通過 字節碼和 jvm 這種跨平臺抽象,屏蔽了操作系統和硬件的細節。

在運行時,JVM 會通過類加載器(Class-Loader)加載字節碼,解釋或者編譯執行。主流 Java 版本中,如 JDK8 實際是解釋和編譯混合的一種模式,即所謂的混
合模式(-Xmixed)。通常運行在 server 模式的 JVM ,會進行上萬次調用以收集足夠的信息進行高效的編譯,client 模式這個門限是 1500 次。Oracle Hotspot JVM 內置了兩個不同
的 JIT compiler,C1 對應前面說的 client 模式,適用於對於啓動速度敏感的應用,比如普通 Java 桌面應用;C2 對應 server 模式,它的優化是爲長時間運行的服務器端應用設計的。
默認是採用所謂的分層編譯(TieredCompilation)。

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

除了我們日常最常見的 Java 使用模式,其實還有一種新的編譯方式,即所謂的 AOT(Ahead-of-Time Compilation),直接將字節碼編譯成機器代碼,這樣就避免了 JIT 預熱等各方面的開銷,比如 Oracle JDK 9 就引入了實驗性的 AOT 特性,並且增加了新的 jaotc 工具。而且,Oracle JDK 支持分層編譯和 AOT 協作使用,這兩者並不是二選一的關係。

以上是對於極客時間的 java 核心技術面試精講的學習心得和筆記

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章