JVM(java虛擬機的發展史):
(1)Sun Classic
- classic jvm要么采用純解釋器解釋執行,要么采用JIT編譯執行,一旦JIT進行編譯執行,則解釋器不再生效
- 如果使用JIT編譯代碼,則JIT會對每個方法,每行代碼都進行編譯,對於那種只需運行一次,不具有編譯價值的代碼,也會被JIT編譯執行。迫於程序響應時間的壓力,此階段的JIT不敢采用編譯耗時的優化技術,所以及時采用JIT輸出本地代碼,他的執行效率也和C代碼有很大差距。被人詬病“java語言很慢”
(2)Exact VM
- Exact VM進入了高性能虛擬機時代,開始使用編譯器解釋器混合模式
- Exact VM使用了精確式內存管理,他能判定內存中摸個位置的數據具體是什么類型。eg:內存中有一個數是12345,ExactVM可以判斷他是一個int數字,還是一個指向內存12345地址的引用。這種精確式內存管理,在gc時,可以直接回收引用類型的數據,少了像classic vm時代gc時的數據類型查找過程
(3)HotSpot虛擬機
- Hot Spot是當前jdk采用的虛擬機 (1.4以后)
- 熱點代碼探測技術:通過計數器找出最具編譯價值的代碼,通知JIT以方法為單位進行編譯。如果方法被頻繁調用,則觸發標准編譯;如果方法中循環次數很多,觸發棧上替換編譯動作。
- HotSpot無需等待本地代碼輸出后才能執行程序,使得即時編譯壓力減小,有助於采用更更多的代碼優化技術。輸出高質量的操作系統本地代碼
實現跨平台性能的原理:
(1).我們都知道,java語言有個機制,就是不論是在哪個平台上編寫的代碼,在其他平台上都可以運行。一些語言卻不行,比如在window平台下編寫的語言在Linux系統下就無法運行,這個原因首先得從平台的機制說起。
我們所說的平台是由CPU和操作系統組成的,CPU的種類有很多,比如Inter,AMD等。這些不同品牌的CPU使用的指令集。而操作系統是充當用戶和計算機之間交互的界面軟件,不同的操作系統支持不同的CPU,嚴格意義上說是不同的操作系統支持不同CPU的指令集。例如 windows和liunx都支持Intel和AMD的復雜指令集,但並不支持PowerPC所使用的精簡指令集,而早期的MAC電腦使用的是PowerPC處理器,所以也就無法在MAC下直接安裝windows,直到05年MAC改用了Intel的CPU,才使在MAC下安裝windows成為可能。但問題來了,原來的MAC 操作系統也只支持PowerPC,在Intel上也不能安裝,怎么辦?所以蘋果公司也得重寫自己的MAC操作系統以支持這種變化。最后總結下,我們要知道,不同的操作系統支持不同的CPU指令集,現在的windows,liunx,mac,solaris都支持Intel與AMD的CPU指令集。
(2).我們一般說語言跨平台是說編譯后的文件跨平台,並不是源程序跨平台。一般來說特定編譯器編譯的程序只能在特定平台運行。而java編譯器編譯出來的文件並不是機器語言,而是基於Unicode的字節碼文件(.class)。之后使用java虛擬機(jvm)將字節碼文件翻譯成特定平台下的機器碼然后運行。也就是說,只要在不同平台上安裝對應的JVM,就可以運行字節碼文件,運行我們編寫的Java程序。而這個過程中,我們編寫的Java程序沒有做任何改變,僅僅是通過JVM這一”中間層“,就能在不同平台上運行,真正實現了”一次編譯,到處運行“的目的。所以,運行Java程序必須有JVM的支持,因為編譯的結果不是機器碼,必須要經過JVM的再次翻譯才能執行。即使你將Java程序打包成可執行文件(例如 .exe),仍然需要JVM的支持。
