問題思考:
JAVA語言具有兩大特性,第一,‘Compile once, run anywhere’即一次編譯,到處運行,通俗來講就是跨平臺運行;第二就是垃圾收集器(Garbage collection)分配內存,開發人員不需要關注內存的分配與回收。
JAVA解決了跨平臺運行,這是與C++等語言不同的,實現的跨平臺并不是因為java語言具有跨平臺的特性,而是由于jvm可以將java語言生成的字節碼解釋運行在各個操作系統,通過jvm這一中間層,實現了對操作系統的解耦。使開發人員不需要關注代碼的操作系統的差異。
JAVA是解釋運行這句話不完全正確,我們開發的JAVA源代碼先被編譯成字節碼,在運行時,通過jvm轉換為可執行的機器碼,有部分熱點代碼可通過jit編譯器(動態編譯器)直接編譯為可運行的機器碼。
JRE,也就是Java運行環境,包含了JVM和Java類庫,以及一些模塊等。而JDK可以看作是JRE的一個超集,提供了更多工具,比如編譯器、各種診斷工具等。
Java語言特性,包括泛型、Lambda等語言特性;
基礎類庫,包括集合、IO/NIO、網絡、并發、安全等基礎類庫。對于我們日常工作應用較多的類庫,面試前可以系統化總結一下,有助于臨場發揮。
知識拓展:
JIT編譯
當JIT編譯啟用時(默認是啟用的),JVM讀入.class文件解釋后,將其發給JIT編譯器。JIT編譯器將字節碼編譯成本機機器代碼。
通常javac將程序源碼編譯,轉換成java字節碼,JVM通過解釋字節碼將其翻譯成相應的機器指令,逐條讀入,逐條解釋翻譯。非常顯然,經過解釋運行,其運行速度必定會比可運行的二進制字節碼程序慢。為了提高運行速度,引入了JIT技術。
在執行時JIT會把翻譯過的機器碼保存起來,已備下次使用,因此從理論上來說,採用該JIT技術能夠,能夠接近曾經純編譯技術。
JIT是just in time,即時編譯技術。使用該技術,可以加速java程序的運行速度。
JIT并不總是奏效,不能期望JIT一定可以加速你代碼運行的速度,更糟糕的是她有可能減少代碼的運行速度。這取決于你的代碼結構,當然非常多情況下我們還是可以如愿以償的。
從上面我們知道了之所以要關閉JITjava.lang.Compiler.disable(); 是由于加快運行的速度。由于JIT對每條字節碼都進行編譯,造成了編譯過程負擔過重。為了避免這樣的情況,當前的JIT僅僅對常常運行的字節碼進行編譯,如循環等
AOT編譯
AOT,Ahead Of Time,指運行前編譯,是兩種程序的編譯方式
Java 9引入了aot編譯方式,能夠將class文件直接編譯成可執行二進制文件。目前Java 9的early access版本已經提供了編譯工具,注意:按照JEP 295描述,目前版本的AOT,僅支持64位Linux操作系統。
AOT可能帶來的好處,是JVM加載這些已經預編譯成二進制庫之后,可以直接調用,而無需再將其運行時編譯成二進制碼。理論上,AOT的方式,可以減少JIT帶來的預熱時間,減少Java應用長期給人帶來的“第一次運行慢”感覺。