1. 程式人生 > >你應該知道的關於 HotSpot VM 的內容

你應該知道的關於 HotSpot VM 的內容

ref oracl ret 方法 一次 led 執行 htm 直接

目錄

  • 1 HotSpot VM的歷史
  • 2 HotSpot VM 概述

1 HotSpot VM的歷史

Oracle/Sun JDK 中使用的 JVM 是 HotSpot VM.

SUN 的 JDK 版本從 1.3.1 開始采用 HotSpot 虛擬機, 並於 2006 年底開源, 主要使用C++實現, JNI 接口部分用C實現.

HotSpot 是較新的 JVM, 用來替代 JIT (Just in Time, 即時編譯), 可以大大提高 Java 的運行性能, 即:

Java 起初是把源代碼編譯為 .class 格式的字節碼在虛擬機上執行, 速度較慢;

HotSpot 將常用的部分代碼編譯為本地(native)代碼, 顯著提高了性能.

HotSpot JVM 參數分為標準參數(standard options)、非標準參數(non-standard options) 以及非穩定參數, 可參考: GC學習入門 看這一篇就夠了(基於Oracle JDK 8)

2 HotSpot VM 概述

HotSpot 包括一個解釋器和兩個編譯器(client 和 server, 實際運行中二選一), 解釋與編譯混合執行模式, 默認啟動解釋執行.

編譯器: Java 源代碼被編譯器編譯成 class 字節碼文件, Java 字節碼在運行時可以被動態編譯(JIT)成本地代碼(前提是解釋與編譯混合執行模式且虛擬機不是剛啟動時).

解釋器: 解釋器用來解釋 class 字節碼文件, Java是解釋型語言(區別於編譯型語言).

① 解釋型語言 編寫的程序在運行時才編譯, 再由專門的解釋器解釋執行 —— 每執行一次就要編譯一次, 效率比較低.

② 編譯型語言 編寫的程序在運行前, 需要通過編譯器將代碼編譯成機器語言, 然後直接由相應的操作系統執行.

這類語言編寫的程序執行速度快, 同等條件下對系統要求較低, 因此像開發操作系統、大型應用程序、數據庫系統等時都采用它, 如C/C++、Pascal等都是編譯語言.

而一些網頁腳本、服務器腳本及輔助開發接口這樣的對速度要求不高、對不同系統平臺間的兼容性有一定要求的程序則通常使用解釋性語言,如Java、JavaScript、VBScript、Perl、Python、Ruby、MATLAB 等等。 [2]

解釋性語言,例如java語言,java程序首先通過編譯器編譯成class文件,如果在windows平臺上運行,則通過windows平臺上的java虛擬機(VM)進行解釋。如果運行在linux平臺上,則通過linux平臺上的java虛擬機進行解釋執行。所以說能跨平臺,前提是平臺上必須要有相匹配的java虛擬機。如果沒有java虛擬機,則不能進行跨平臺。 [2]

技術分享圖片

server啟動慢,占用內存多,執行效率高,適用於服務器端應用;

client啟動快,占用內存小,執行效率沒有server快,默認情況下不進行動態編譯,適用於桌面應用程序。

java -version
Java HotSpot(TM) Client VM (build 14.3-b01, mixed mode, sharing)
mixed mode 解釋與編譯 混合的執行模式 默認使用這種模式

java -Xint -version

Java HotSpot(TM) Client VM (build 14.3-b01, interpreted mode, sharing)

interpreted 純解釋模式 禁用JIT編譯

java -Xcomp -version

Java HotSpot(TM) Client VM (build 14.3-b01, compiled mode, sharing)

compiled 純編譯模式(如果方法無法編譯,則回退到解釋模式執行無法編譯的方法)

3.動態編譯

? 動態編譯(compile during run-time),英文稱Dynamic compilation;Just In Time也是這個意思。

? HotSpot對bytecode的編譯不是在程序運行前編譯的,而是在程序運行過程中編譯的。
? HotSpot裏運行著一個監視器(Profile Monitor),用來監視程序的運行狀況。

? java字節碼(class文件)是以解釋的方式被加載到虛擬機中(默認啟動時解釋執行)。 程序運行過程中,那一部分運用頻率大,那些對程序的性能影響重要。對程序運行效率影響大的代碼,稱為熱點(hotspot),HotSpot會把這些熱點動態地編譯成機器碼(native code),同時對機器碼進行優化,從而提高運行效率。對那些較少運行的代碼,HotSpot就不會把他們編譯。

? HotSpot對字節碼有三層處理:不編譯(字節碼加載到虛擬機中時的狀態。也就是當虛擬機執行的時候再編譯),編譯(把字節碼編譯成本地代碼。虛擬機執行的時候已經編譯好了,不要再編譯了),編譯並優化(不但把字節碼編譯成本地代碼,而且還進行了優化)。

? 至於那些程序那些不編譯,那些編譯,那些優化,則是由監視器(Profile Monitor)決定。

4.為什麽不靜態編譯那?

? 為什麽字節碼在裝載到虛擬機之前就編譯成本地代碼那?

? 動態編譯器也在許多方面比靜態編譯器優越。靜態編譯器通常很難準確預知程序運行過程中究竟什麽部分最需要優化。

? 函數調用都是很浪費系統時間的,因為有許多進棧出棧操作。因此有一種優化辦法,就是把原來的函數調用,通過編譯器的編譯,改成非函數調用,把函數代碼直接嵌到調用出,變成順序執行。

? 面向對象的語言支持多態,靜態編譯無效確定程序調用哪個方法,因為多態是在程序運行中確定調用哪個方法。

參考:

http://www.cnblogs.com/zengkefu/p/5633342.html

版權聲明

作者: ma_shoufeng(馬瘦風)

出處: 博客園 馬瘦風的博客

您的支持是對博主的極大鼓勵, 感謝您的閱讀.

本文版權歸博主所有, 歡迎轉載, 但未經博主同意必須保留此段聲明, 且在文章頁面明顯位置給出原文鏈接, 否則博主保留追究法律責任的權利.

你應該知道的關於 HotSpot VM 的內容