什麼是HotSpot
沒錯,Java是解釋語言,但並不意味著它一定被解釋執行。早期
的虛擬機器確實一條一條指令解釋執行,但人們發現這樣效率太低,
不滿足各種要求,因此出現了許多其它虛擬機器,如JIT的虛擬機器。
HotSpot也是類似一種虛擬機器,自從SUN買下後,已經把它放入
JRE 1.3以及後續版本中。
採用HotSpot的Java虛擬機器,已經很難說Java是被虛擬機器解釋執行了,
原因是HotSpot實際上是把Java的bytecode編譯成Native code,
然後執行。
實際上在HotSpot虛擬機器中,有兩個技術是至關重要的,即動態編譯和
Profiling。HotSpot對bytecode的編譯,不是在程式執行前預先編譯的,
而是在程式執行過程中,動態編譯(compile during run-time),英文稱
Dynamic compilation。其實Just In Time也就是這個意思。
HotSpot是如何動態編譯Javad的bytecode呢?它採用的是一種smart的辦法。
HotSpot裡有一個執行監視器,即Profile Monitor(不知國內如何翻譯Profile),
專門監視程式執行中,哪一部分運用頻度大, 哪些對效能影響至關重要。
當然Profile Monitor有一些演算法,這些演算法未必十全十美,但大體是能較好
獲得相關資訊的。對於那些對程式執行效率影響交大的程式碼,稱為熱點,
即hot spot,HotSpot會把這些部門動態地編譯成機器碼,Native code,
同時也對機器碼進行優化(類似C編譯器的一些優化),從而而提高執行效率。
而那些較少執行的Code,HotSpot虛擬機器就不再浪費時間把它們編譯。
總體來看,Java bytecode是以解釋方式被load到虛擬機器的。但虛擬機器的
分析器根據一段執行,獲知對程式效率影響最大的部分,然後通過動態
編譯,同時進行優化,編譯成機器碼,然後為接下來的執行加速。總的
來說,HotSpot對bytecode有三層處理:不編譯,編譯,編譯並優化。
至於程式哪部分不編譯,哪部分編譯,哪部分做何種優化,則由Profile
Monitor決定。
那麼為什麼Java採用動態編譯器而不是象C++這樣採用靜態編譯器呢?
虛擬機器提供的跨平臺執行條件固然是一方面,動態編譯器也在許多方面
比靜態編譯器優越。Profiling就是一個例子。靜態編譯器通常很難準確
預知程式執行過程中究竟什麼部分最需要優化。靜態編譯器雖然可以把Java
全部編譯成Native Code,但卻做不到動態編譯器那樣的優化。
另一個典型的例子,叫做Method inlining。我們知道無論是在C還是在
Java裡,函式呼叫都是很浪費系統時間的,因為有許多進棧出棧操作。
因此有一種優化辦法,就是把原來的函式呼叫,通過編譯器的編譯,改成
非函式呼叫,把函式程式碼直接嵌到呼叫出,變成順序執行。
但這一方法在Java/C++這樣的物件導向的語言的編譯器中,較難很好實現。
那些靜態編譯器,通常可以把private,static等函式進行Method inlining,
但由於這些物件導向的語言支援函式過載,支援動態聯編(不知道是不是這樣
翻譯,Overridden, dynamic binding),因此靜態編譯器並不知道究竟應該
把函式的哪個實現給inline了。
HotSpot的動態編譯,由於有對函式呼叫的監視,因此可以準確地知道一些環境
下,那些被過載和動態識別的函式可以如何被inline到呼叫者那裡去,因此
實際上對於一些Server應用來說,可以大幅度提高效率。
HotSpot實際上有兩個版本,一個是Server版,一個是Client版。但它們的結構
和本質都是一樣的,只是有些地方優化不一樣。
瞭解了這些,就知道,有時候Java的程式甚至能比C程式執行還快。
相關文章
- HotSpot Virtual Machine Error,不知道是什麼錯誤.HotSpotMacError
- 有了HotSpot JVM為什麼還需要OpenJ9?HotSpotJVM
- 什麼是cookie,什麼是sessionCookieSession
- 什麼是DNS,什麼是HostsDNS
- 什麼是模式? 什麼是框架?模式框架
- 這是什麼這是什麼
- 什麼是WebAuthn、FIDO 是什麼?Web
- ITIL是什麼意思?ITIL是什麼?
- 什麼是跨域,什麼是同源跨域
- 什麼是.NET平臺、什麼是c#、什麼是ASP.NET。C#ASP.NET
- ftp是什麼,ftp是什麼東西?FTP
- Java是什麼_Java是做什麼的?Java
- 什麼是正向代理?什麼是反向代理?
- NLA是什麼?NLA的原理是什麼?
- ###什麼是Linux核心###什麼是MMULinux
- 為什麼要有 Servlet ,什麼是 Servlet 容器,什麼是 Web 容器?ServletWeb
- 什麼是塊元素?什麼是行內元素?
- 什麼是API介面,具體是什麼意思?API
- 什麼是框架?為什麼說 Angular 是框架?框架Angular
- 什麼是Unicode,什麼是UTF-8Unicode
- 什麼是藍海?什麼是紅海?什麼是網際網路思維?
- nginx 是什麼,能幹什麼?Nginx
- 什麼是Django?有什麼用途?Django
- AI三重問:什麼是AI?什麼是AI模型?什麼是AI大模型?AI大模型
- 什麼是重繪repaint?什麼是迴流reflow?AI
- DHCP是什麼?DHCP伺服器是什麼意思?伺服器
- 什麼是CDN?CDN的技術原理是什麼?
- 交換機是什麼,它的工作原理是什麼
- GNU是什麼?和Linux是什麼關係?Linux
- 域名是什麼?申請域名的流程是什麼?
- 什麼是雲端計算?什麼是公司網盤?
- 什麼是eval()?eval是用來幹什麼的?
- 什麼是 Nginx?Nginx
- 什麼是PHPPHP
- 什麼是PodcastAST
- 什麼是Flutter?Flutter
- 敏捷是什麼?敏捷
- SQL是什麼?SQL