作者:龔勛 時(shí)間:2007-06-14 21:16 出處:ccidnet.com 責(zé)編:月夜寒簫
摘要:Java基礎(chǔ):JVM(Java 虛擬機(jī))的詳細(xì)講解
可能有很多學(xué)習(xí)Java的朋友還不知道Java的運(yùn)行原理、Java虛擬機(jī)是怎么工作的,本文將為你詳細(xì)講解(JVM)Java 虛擬機(jī)。
在Java中引入了虛擬機(jī)的概念,即在機(jī)器和編譯程序之間加入了一層抽象的虛擬的機(jī)器。這臺(tái) 虛擬的機(jī)器在任何平臺(tái)上都提供給編譯程序一個(gè)的共同的接口。編譯程序只需要面向虛擬機(jī),生成虛擬機(jī)能夠理解的代碼,然后由解釋器來(lái)將虛擬機(jī)代碼轉(zhuǎn)換為特定 系統(tǒng)的機(jī)器碼執(zhí)行。在Java中,這種供虛擬機(jī)理解的代碼叫做字節(jié)碼(ByteCode),它不面向任何特定的處理器,只面向虛擬機(jī)。每一種平臺(tái)的解釋器 是不同的,但是實(shí)現(xiàn)的虛擬機(jī)是相同的。Java源程序經(jīng)過(guò)編譯器編譯后變成字節(jié)碼,字節(jié)碼由虛擬機(jī)解釋執(zhí)行,虛擬機(jī)將每一條要執(zhí)行的字節(jié)碼送給解釋器,解 釋器將其翻譯成特定機(jī)器上的機(jī)器碼,然后在特定的機(jī)器上運(yùn)行。
可以說(shuō),Java虛擬機(jī)是Java語(yǔ)言的基礎(chǔ)。它是Java技術(shù)的重要組成部分。Java虛 擬機(jī)是一個(gè)抽象的計(jì)算機(jī),和實(shí)際的計(jì)算機(jī)一樣,它具有一個(gè)指令集并使用不同的存儲(chǔ)區(qū)域。它負(fù)責(zé)執(zhí)行指令,還要管理數(shù)據(jù)、內(nèi)存和寄存器。Java解釋器負(fù)責(zé) 將字節(jié)代碼翻譯成特定機(jī)器的機(jī)器代碼。Java是一種簡(jiǎn)單的語(yǔ)言。它用到的概念不多,而且多為程序員所熟悉。如果你是一名程序員,掌握J(rèn)ava對(duì)你來(lái)說(shuō)是 易如反掌的事。即使你沒(méi)有學(xué)過(guò)任何編程語(yǔ)言,學(xué)習(xí)Java也要比學(xué)習(xí)C++要容易的多。
由于Java最初是為控制電子產(chǎn)品設(shè)計(jì)的,因此它必須簡(jiǎn)單明了。為了保證這種簡(jiǎn)單 性,Java去掉了C++中許多復(fù)雜的、冗余的、有二義性的概念,例如操作符重載、多繼承、數(shù)據(jù)類(lèi)型自動(dòng)轉(zhuǎn)換等。為了將程序員從復(fù)雜的內(nèi)存管理的負(fù)擔(dān)中解 脫出來(lái),同時(shí)也是為了減少錯(cuò)誤,Java使用了自動(dòng)內(nèi)存垃圾收集機(jī)制,程序員只要在需要的時(shí)候申請(qǐng)即可,不需要釋放,而由Java自己來(lái)收集、釋放內(nèi)存中 的無(wú)用的塊。
與C++相比,Java有著更強(qiáng)的面向?qū)ο筇匦?,是一種比較純粹的面向?qū)ο笳Z(yǔ)言。一般我們使 用的一些所謂的面向?qū)ο蟮木幊陶Z(yǔ)言,如C++,Object Pascal等,實(shí)際上都是一種混合型的語(yǔ)言,即在過(guò)程式的語(yǔ)言中加上面向?qū)ο蟮臄U(kuò)展。在Java中,幾乎萬(wàn)物皆對(duì)象,就連一些基本數(shù)據(jù)類(lèi)型,如整型、字 符型、浮點(diǎn)型等,在Java中都可以作為對(duì)象處理。Java的面向?qū)ο筇匦詭缀蹩梢耘cSmalltalk媲美,但是其適用于分布式計(jì)算環(huán)境的特性卻遠(yuǎn)遠(yuǎn)超 過(guò)了Smalltalk。
Java是一種支持分布式操作的程序設(shè)計(jì)語(yǔ)言。使用Java提供的URL類(lèi),用戶可以象訪問(wèn) 本地文件一樣訪問(wèn)網(wǎng)絡(luò)上的對(duì)象,使用非常方便。在客戶機(jī)/服務(wù)器的模式下,Java還可以將運(yùn)算從服務(wù)器端分散到客戶端,提高系統(tǒng)的效率,避免了服務(wù)器的 瓶頸制約。Java的網(wǎng)絡(luò)類(lèi)庫(kù)支持分布式的編程。Socket類(lèi)提供可靠的流式網(wǎng)絡(luò)的連接,支持TCP/IP協(xié)議。通過(guò)編寫(xiě)協(xié)議句柄,程序員還可以擴(kuò)充 Java支持的協(xié)議集合。
Java提供非常有效的安全控制。由于Java應(yīng)用于網(wǎng)絡(luò)程序的開(kāi)發(fā),因而安全性變的至關(guān)重 要。因?yàn)镴ava小程序需要下載到客戶端解釋執(zhí)行,所以,如果沒(méi)有安全控制,就會(huì)給一些網(wǎng)絡(luò)黑客以可乘之機(jī),這對(duì)用戶來(lái)說(shuō)是非常危險(xiǎn)的。所幸的 是,Java的安全機(jī)制可以有效的防止病毒程序的產(chǎn)生、下載程序?qū)Ρ镜匚募到y(tǒng)的破壞,以及網(wǎng)絡(luò)黑客竊取密碼和入侵。
Java是一種非常健壯的語(yǔ)言。因?yàn)樵贘ava中使用了以下手段:
不支持指針。在C++程序中,指針的錯(cuò)誤使用通常的程序中BUG的元兇。在Java中徹底去掉了指針,杜絕了內(nèi)存的非法訪問(wèn),從而保證了程序的可靠性。
強(qiáng)類(lèi)型語(yǔ)言
自動(dòng)內(nèi)存垃圾收集機(jī)制。Java自動(dòng)收集無(wú)用的內(nèi)存單元,進(jìn)而防止了由于內(nèi)存泄漏導(dǎo)致的動(dòng)態(tài)內(nèi)存分配問(wèn)題。
完善的異常處理機(jī)制,既簡(jiǎn)化了錯(cuò)誤處理任務(wù)和恢復(fù),也增加了程序的可讀性。
Java具有非常好的平臺(tái)無(wú)關(guān)性和可移植性。因?yàn)镴ava最初是為對(duì)電子產(chǎn)品編程而設(shè)計(jì)的, 所以它具有完美的平臺(tái)無(wú)關(guān)性。它使用一種與平臺(tái)無(wú)關(guān)的代碼──字節(jié)碼,而不是通常的特定機(jī)器上的機(jī)器碼,由平臺(tái)上的Java虛擬機(jī)中的Java解釋器解釋 執(zhí)行。Java虛擬機(jī)是免費(fèi)的,在許多平臺(tái)上都有。
Java提供了良好的可移植性。使用Java作為編程語(yǔ)言,只要進(jìn)行一次程序開(kāi)發(fā)工作,所開(kāi)發(fā)的程序不需要經(jīng)過(guò)任何改動(dòng),便能在各種平臺(tái)上運(yùn)行。Java使用兩種方法使Java的應(yīng)用程序不依賴與具體的系統(tǒng):
采用基于國(guó)際標(biāo)準(zhǔn)的數(shù)據(jù)類(lèi)型。Java的原始數(shù)據(jù)類(lèi)型在任何機(jī)器上都是一樣的,例如整型總是32位,長(zhǎng)整型總是64位等。
提供了一個(gè)用于訪問(wèn)底層操作系統(tǒng)功能的可擴(kuò)展類(lèi)庫(kù)。
Java是一種高性能的語(yǔ)言。“魚(yú)與熊掌不可兼得”,通常,健壯性、安全性、平臺(tái)無(wú)關(guān)性、可 移植性等方面的提高總是要以犧牲性能為代價(jià)的。Java也不例外,Java的內(nèi)存管理增加了運(yùn)行時(shí)系統(tǒng)的復(fù)雜性,因?yàn)镴ava運(yùn)行時(shí)系統(tǒng)必須內(nèi)嵌一個(gè)內(nèi)存 管理模塊;同樣,Java程序的解釋執(zhí)行的效率也要低于直接執(zhí)行編譯后的源碼的效率。但是Java采用了一些很好的措施來(lái)彌補(bǔ)這些性能上的差距:
生成高效的字節(jié)碼。Java字節(jié)碼的設(shè)計(jì)充分考慮了性能的因素,字節(jié)碼的格式簡(jiǎn)單,解釋器可以生成高效的機(jī)器碼。
提供了即時(shí)編譯和嵌入C代碼的可選措施。即時(shí)編譯是指在運(yùn)行時(shí)把字節(jié)碼編譯成機(jī)器碼。支持多線程。Java提供了對(duì)多線程的語(yǔ)言級(jí)的接口,而且Java環(huán)境本身就是多線程的。
Java對(duì)多線程有良好的支持。多線程技術(shù)可以提高程序執(zhí)行的并發(fā)度,提高圖形用戶界面的交互性能。Java提供了語(yǔ)言內(nèi)置的多線程控制,簡(jiǎn)化了多線程應(yīng)用程序的開(kāi)發(fā),還支持線程的同步控制。
Java是一種動(dòng)態(tài)的語(yǔ)言。動(dòng)態(tài)特性是面向?qū)ο筇匦缘囊粋€(gè)延伸,它使得程序能夠適應(yīng)不斷變化的執(zhí)行環(huán)境。Java的動(dòng)態(tài)性主要表現(xiàn)在以下幾個(gè)方面:
Java的類(lèi)有運(yùn)行時(shí)的表示,這樣,即使在運(yùn)行時(shí)刻,程序也能辨別類(lèi)之間的關(guān)系和類(lèi)型信息,可以動(dòng)態(tài)的從本地或網(wǎng)上把一個(gè)類(lèi)鏈接到運(yùn)行系統(tǒng)中去。
Java的類(lèi)在運(yùn)行過(guò)程中動(dòng)態(tài)的裝載,因此,Java可以在分布式的環(huán)境中動(dòng)態(tài)的維護(hù)應(yīng)用程序和Java類(lèi)庫(kù)之間的一致性。當(dāng)類(lèi)庫(kù)升級(jí)后,應(yīng)用程序無(wú)需重新編譯,也一樣可以利用新類(lèi)庫(kù)中新增的功能。
支持動(dòng)態(tài)數(shù)據(jù)類(lèi)型和動(dòng)態(tài)協(xié)議。通過(guò)編寫(xiě)協(xié)議句柄,Java可以支持新的、自定義的傳輸協(xié)議,編寫(xiě)內(nèi)容句柄,可以支持新的數(shù)據(jù)類(lèi)型。