第1章 Java的開發運行環境
學好Java最重要的一個步驟就是上機編程,熟悉Java的開發運行環境是成為Java程序員的第一步。本章將詳細介紹如何安裝并配置好Sun公司提供的JDK1.5 for Windows,如何編制一個簡單的Java程序,如何編譯一個Java源程序,如何運行編譯好的class文件以及如何避免初學者常犯的錯誤。通過本章的學習,將輕松地邁入Java的殿堂。
1.1 Java的運行環境與虛擬機
任何一個可執行文件,都必須在某個平臺上才能運行。例如,Windows下的exe文件,必須在Windows環境下、X86硬件平臺上才能運行。這些exe文件,通常是使用C/C++、Pascal或VB等語言編程,然后通過編譯、鏈接而形成的。在這些可執行文件中,包含了運行它的硬件平臺的相關信息,所以如果要把它移植到其他平臺上,必須要重新編譯,甚至要修改源文件。
Java和這些語言不同,它的最大特點就是平臺無關性。Java文件經編譯后,生成的是一個后綴名為class的文件。這是一種字節碼文件,它不像普通可執行文件那樣包含硬件信息,而是完全與硬件平臺無關,也就是無法直接由操作系統調用運行。所以Java的應用程序,需要一個更為復雜的平臺才能運行。這個運行平臺,包括計算機操作系統、適配器、Java虛擬機、Java基本軟件和Java應用程序接口,它們負責將Java的字節碼翻譯成硬件可以接受的指令。整個運行系統的結構如圖1.1所示。
圖1.1 Java運行系統
Java運行系統執行Java應用程序的過程包括三個步驟:首先是代碼的裝入,然后是代碼的驗證,最后是代碼的執行。
代碼的裝入由類裝配器完成,它主要負責裝入程序運行時所需要的全部代碼,包括程序運行中調用到的其他類。當類裝配器裝入一個類后,該類被放在自己的命名空間中,除了通過符號引用其他類之外,該類不能影響其他類所在的空間。當裝入了運行程序所需要的所有類后,運行系統就能確定整個可執行程序的內存布局。
然后,被裝入的代碼將由字節碼驗證器進行安全檢查,以確保字節代碼不存在違反訪問權限、不規范的數據類型和非法調用等問題。
通過校驗之后,代碼就可以運行了。Java的字節碼有兩種運行方式:
? 解釋執行方式:通過“解釋器”,將字節碼翻譯成機器碼,然后由“運行支持庫”將機器碼送往硬件執行。整個執行過程是一邊翻譯一邊執行,稱為解釋執行。Java系統一般采用這種方式。
? 即時編譯方式:通過“代碼生成器”,先一次性地將所有字節碼翻譯成適用于特定計算機系統的機器碼,然后送往硬件執行。對程序運行速度要求較高時,一般采用這種方式。
從圖1.1可以看出,Java的字節碼并沒有直接運行在硬件平臺上,而是在一個虛擬的軟件平臺上運行。這個虛擬的軟件平臺,被稱為Java虛擬機(Java Virtual Machine,JVM)。為了讓編譯產生的字節碼可以更好地解釋與執行,通常把JVM分成6個功能模塊:JVM解釋器、指令系統、寄存器、棧、存儲區和碎片回收區。
? JVM解釋器:JVM解釋器負責將字節碼轉換成為CPU能執行的機器指令。
? 指令系統:指令系統同硬件計算機很相似。一條指令分成操作碼和操作數兩部分。操作碼為8位二進制數,操作數可以根據需要而定。操作碼是為了說明一條指令的功能,所以JVM可以有多達256種不同的操作指令。
? 寄存器:JVM有自己的虛擬寄存器,這樣就可以快速地和JVM的解釋器進行數據交換。為了實現必需的功能,JVM設置了4個常用的32位寄存器:pc(程序計數器)、optop(操作數棧頂指針)、frame(當前執行環境指針)和vars(指向當前執行環境中第一個局部變量的指針)。
? 棧:JVM棧是指令執行時數據和信息存儲的場所和控制中心,它提供給JVM解釋器運算時所需要的信息。
? 存儲區:JVM存儲區用于存儲編譯后的字節碼等信息。
? 碎片回收區:JVM碎片回收,是指將那些使用后的Java類的具體實例從內存中進行回收。因此,可以避免開發人員自己編程控制內存的麻煩。隨著JVM的不斷升級,其碎片回收技術和算法也更加合理。比較經典的算法有引用計數、復制、標記-清除和標記-整理。在JVM 1.4.1版以后,產生了一種代收集技術。簡單地說,就是利用對象在程序中生存的時間劃分成代,以這個代為標準進行碎片回收。
?說明:JVM的運用,真正讓Java實現了“一次編譯,處處運行”,它是整個運行系統的核心