如今讓你談談對Java平臺的理解,你是否會感受內容過於龐大?這個問題是比較寬泛的,Java發展到如今已經不單單是語言這麼簡單了,Java平臺涉及的,包括但不只限於下面提到的這些內容:java
這些內容沒法在一個篇幅中都提到。本文從Java等基本特性開始,先來回答一個問題「Java是編譯執行語言,這句話對嗎?」,咱們又該如何理解Java的「書寫一次 ,處處執行」呢?安全
Java語言自己最顯著的兩大特性是「書寫一次,處處運行(Write Once,run anywhere)「,以及垃圾收集。這兩點都和C++有明顯的區別。網絡
」書寫一次,處處運行「的能力是基於Java 虛擬機(JVM)的。Java源代碼編譯後生成的.class文件並非最終的機器碼,而是一種能夠被JVM解析的格式,稱爲字節碼。JVM將字節碼翻譯成機器碼後執行機器碼來運行程序。只要在不一樣的操做系統上安裝好JVM後,.class文件即可以在這些JVM上運行。工具
從這個過程來看,字節碼是在JVM中被解釋執行的,那麼「Java是解釋執行的語言」這句話正確嗎?這句話不太準確,常見的JVM,好比咱們最常常使用的Oracle JDK提供的JVM,都提供了JIT(Just-In-Time)編譯器,也就是一般所說的即時編譯(https://en.wikipedia.org/wiki/Just-in-time_compilation)。爲了提升熱點代碼的執行效率,在運行時,JVM會把這些代碼編譯成與本地平臺相關的機器碼,並進行各類層次的優化,這種狀況下,熱點代碼就屬於「編譯執行」而不是解釋執行。JVM提供了不一樣的參數來對這兩種模式進行指定,例如-Xint
告訴JVM只進行解釋執行,不對代碼進行編譯,這種模式就拋棄了JIT帶來的性能上的優化。同時另外一個參數-Xcomp
則是告訴JVM不要進行解釋執行,這種模式也叫作「最大優化級別」,但實際上也並不必定會高效。oop
總的來講,Java的「編譯」和C/C++的編譯含義是不一樣的。Java源代碼編譯後生成的.class文件中是字節碼,而不是能夠直接運行的機器碼。JVM經過類加載器(class-loader)來加載字節碼,進行解釋執行或編譯執行。除了上面說到的這兩種編譯模式外,還有一種編譯模式稱爲AOT(Ahead-of-Time Compilation)(https://en.wikipedia.org/wiki/Ahead-of-time_compilation),AOT能夠將字節碼直接編譯成機器碼,在JDK 9中便引入了這些特性。更多的細節能夠參考文檔http://openjdk.java.net/jeps/295。性能
JVM自己是一個強大的平臺,它除了使得Java源代碼編譯生成的字節碼具有」書寫一次,處處運行「的能力外,只要符合格式的字節碼,均可以運行在JVM上,因此大量的JVM語言的字節碼均可以在JVM上運行,例如Scala。優化
關於Java平臺的更多內容,請看後續文章。操作系統