Java Virtual Machine 就是指Java虛擬器,以下簡稱VM.關于VM的概念,最早出自CPU模擬器
,眾所周知的PC上的游戲機模擬器采用的便是和Java VM類似的技術.java source code被編譯成byte code后,其實已經是很類似機器代碼了,只不過沒有真正能運行這類code的CPU而已,于是為了能達到在不同平臺上運行的目的,VM的概念被大力推廣. 從簡單的角度說,VM其實就是把java bytecode 翻譯成特定的機器代碼, 這和解釋型編程語言不同,我們會在下面講到.
第一代的VM大多采用直接解釋的方法,也就是說一句一句地把bytecode翻譯成機器代碼. 但這里有個缺點,如遇到循環, VM就不得不一次次重復翻譯已經被翻譯過的代碼. 而每一次翻譯均需消耗一定的cpu時間
. 于是出現了第二代的VM - JIT (Just In Time Compiler)它只在bytecode需要被翻譯時才做翻譯工作.怎么實現呢? 打個比方,JIT VM可以事先把一段bytecode翻成machine code,并把這段code放進buffer, 當運行循環是,就反復調用這段翻譯好的代碼! JIT的效率取決于他分析重復調用的本領,把翻譯的工作量限制到最小,以便讓出CPU時間來運行程序邏輯.
第三代的VM叫hotspot,我們以后做介紹.
有了VM以后等于有了一個虛擬的CPU, 但我們還需要一定的外部設備來幫助完成計算任務,于是出現了JNI, 它的作用在不同的場合有不同的含義. 有時你可一用JNI直接寫一個設備驅動程序
, 有時JNI可被作為lightweight wrapper來封裝本地系統的資源.再加上Java本身提供的標準庫,VM提供了再多平臺應用的環境!在一個系統中JVM往往不是唯一的, 如果你在win32中安裝了JDK,IE和Netscape,哪很有可能你已經有了三種不同的Virtual Machine. 至于你的程序在那個VM上運行,完全取決于你系統的設置. 大體上如果是運行applet,那么browser的VM會成為默認的平臺. 當然你可以
用jdk的plug-in取代IE的MS JVM.
每臺win32系統都包含了一個MS implement的VM,如果安裝了Java SDK哪你就可以用jview來從command line啟動VM process. 你可以在一臺電腦上同時運行幾個同種或不同種的VM, 每一個都會運行在獨立process中.
下面是一些系統的屬性,你可以從中獲得關于VM的一些訊息!
用 System.getProperty(String propertyName)
properyName: 含義:
-----------------------------------------------------
java.version - JRE version
java.vendor - JRE vendor
java.vendor.url - Vendor URL
java.home - Installation directory
java.vm.specification.version - JVM 標準的版本
java.vm.specification.vendor - JVM 標準的開發商
java.vm.specification.name -
java.vm.version - JVMachine implementation version:
java.vm.vendor - JVM implementation vendor
java.vm.name - JVM implementation name
java.specification.version - JRE specification version
java.specification.vendor - JRE specification vendor
java.specification.name - JRE specification name:
java.class.version - Class format version number:
java.class.path - Java CLASSPATH