談談你對java平台的理解?


問題:談談你對java平台的理解?java是解釋執行,這句話對嗎?
典型回答:java本身是一種面向對象的語言,具有很好的跨平台的能力,能夠做到“write once ,run anywhere”。另外就是GC機制,java通過垃圾回收器回收分配內存,程序員無需自己操心內寸的回收問題。
     我們日常會接觸到jre和jdk。jre是java運行環境,包含了jvm和java類庫等。jdk則是在jre的基礎上提供了更多的工具,比如編譯器,和一些診斷工具等。
     java是解釋執行,這句話不是很准確。java代碼在執行時,先通過javac編譯為字節碼bytecode,在運行時,通過jvm內嵌解釋器轉換為最終機器碼。但常見jvm,比如Oracle JDK提供的Hotspot JVM,都提供了jit(just in time)動態編譯器,能夠在運行時將熱點代碼編譯成機器碼,這部分屬於編譯執行。
 
對於這個問題,還有其他方面可以擴展,比如:
     java語言特性,包括泛型,lambda表達式等特性。
     基礎類庫,包含集合,IO/NIO,網絡,並發,安全等。
     對於日常使用較多的類庫,可以整理一下。
     jvm的知識和概念,如java類加載機制,常用版本jdk的內嵌Class-Loader,如Bootstap,Application,Extension Class-Loader,自定義Class-Loader等。還有GC機制,常見垃圾回收器如Serial GC,Paraller GC,CMS,G1等。
如下圖所示:
 

 

 
 
 
關於解釋執行和編譯執行的問題,可以深入討論一下。
     通常我們不是java分為編譯期和運行時。java的編譯期和C/C++是不同的,java編譯生成的是.class字節碼文件,而不是可以直接執行的機器碼。
java是通過字節碼和jvm來實現一次編譯,到處執行的。
     運行時,java通過類加載器Class-Loader加載字節碼,解釋或編譯執行。主流jdk版本,如jJDK 8實際上是一中混合模式(Xmixed)。Oracle Hotspot JVM內置兩個JIT編譯器,C1對應對啟動速度敏感的client模式,C2對應長時間運行的sever模式。默認采用分層編譯(TieredCompilation)。
     虛擬機啟動時可以指定不同參數對於運行模式進行選擇。如使用-Xint只使用解釋執行,不使用編譯執行。這樣的話摒棄了JIT編譯器的性能優勢。解釋器是逐條讀入,逐條解釋執行的。-Xcomp參數是關閉解釋器,這種模式會使jvm的啟動慢得多。同時有些JIT優化方式,不進行profiling往往不能有效優化。
     Jdk9提供一種AOT(Ahead-of-Time compilation)的編譯模式,直接將字節碼編譯成機器碼。避免了JIT預熱等方面的開銷。
 
 
       
 
 
 
 
 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM