Java語言實現機制
1.Java虛擬機(Java Virtual Machine)
Java虛擬機(JVM)是在一台計算機上由軟件模擬也可以用硬件來實現的假想的計算機。它定義了指令集(相當於中央處理器CPU)、寄存器集、類文件結構棧、垃圾收集堆、內存區域。
首先,Java編譯器在獲取Java應用程序的源代碼后,把它編譯成符合Java虛擬機規范的字節碼(byte code)的class文件,class文件是JVM中可執行文件的格式。Java編譯器針對Java虛擬機產生的class文件,Java虛擬機規范為不同的硬件平台提供了不同的編譯代碼
規范,該規范使Java軟件獨立於平台。然后,Java解釋器負責將Java字節碼文件解釋執行,邊解釋邊執行,這樣,運行速度受到一定影響。為了提高運行速度,java提供了另一種解釋運行的方法JIT(Just In Time),可以一次解釋完,再運行特定平台上的機器碼,
這樣就實現了跨平台、可移植的功能。
在Java的運行環境中,每個Java解釋器,不管他是Java開發工具,還是可運行的applets的web瀏覽器,都可以執行Java虛擬機。字節碼的運行要經過下面三個步驟:
(1)加載代碼:由Class Loader完成。
(2)校驗代碼:由Bytecode Verifier完成。
(3)執行代碼:由Runtime Interpreter完成。
部分校驗過的字節碼被編譯成原始機器碼並直接運行於硬件平台。這就使Java軟件代碼能夠以與C或C++接近的速度運行,只是在加載時,因為要編譯成原始機器碼而略有延遲。
構成Java軟件程序的字節碼在運行時被加載、校驗並在解釋器中運行。當運行applets時,字節碼可被下載,然后由建於瀏覽器中的JVM進行解釋。解釋器具備兩種功能,一是執行字節碼,二是對底層硬件平台做適當調用。
Java虛擬機提供了編譯代碼的規范,它要求代碼的格式由字節碼構成,由JVM字節碼編寫的程序必須保持適當的類型約束。對這種類型約束的檢查,大部分是在編譯時完成的。
Java虛擬機也提供了硬件平台規范,它能夠解讀獨立於平台的已編譯好的字節碼文件,每個由Sun批准的Java虛擬機規范中有所指定的類文件格式,如:每個文件都包含最多一個public類。
Java虛擬機執行過程有三個典型特點:
(1)多線程:Java虛擬機支持多個線程的同時運行,這些線程獨立的執行Java代碼,處理公共數據區和私有棧中的數據。
(2)動態連接:Java程序之所以適合在網絡上運行,其主要原因是由於Java虛擬機具有動態連接特性。
(3)異常處理:Java虛擬機提供了可靠的異常處理。

2.Java垃圾回收機制(Garbage Collection)
Java語言中任何事物都封裝在類中,每個類都會創建一個或多個實例對象,每個對象都有生命周期,我們需要時就去創建、調用它,不用時就應清楚它(稍后再用)。這種動態的實例對象是被存放在內存堆(Memory Heap)中的,隨着科技的發展,我們可以不斷更新
擴展硬件設施,但任何存儲介質都是有極限的,那么內存也不異常,對於不再使用的對象,我們應該將其清除,從而釋放資源。許多編程語言都允許在程序運行時動態分配存儲器,分配存儲器的過程由於語言句法的不同而不同,當不再需要分配存儲器或存儲器指針溢
出范圍時,程序或運行環境應停止繼續分配存儲器,進行內存回收,但如何進行內存回收卻是一件很困難很復雜的事情,在C、C++或其他語言中,程序員負責回收已分配的內存。由於存儲器是動態分配的,通常我們無法准確判斷存儲器應在何時被釋放。這就為程序運
行留下隱患,當系統運行中沒有能夠被分配的存儲器時,就會導致程序癱瘓。Java語言解除了程序員釋放已分配存儲器的責任,是通過提供一個系統級線程對內存使用進行跟蹤實現的,由於Java是單根結構,任何一個類都直接或間接地繼承於java.lang.Object類,所
以系統級線程可以跟蹤每一次存儲器的分配情況,並且可以逐級回溯,定期檢測出不再使用的內存,在系統空閑時自動進行回收。垃圾收集是在Java程序的生命周期中自動進行的,我們無法判斷垃圾回收線程何時啟動,要執行多長時間,這使得程序在運行期間出現一
種不連貫的狀態,並且在一定程度上降低了程序的運行效率,但這個代價還是值得的。
3.代碼安全性檢測(Code Security)
Java的安全性的考慮最初來源於Java Applet,由於它可以被輕易的下載到web瀏覽器上運行,改變了以往傳統模式下桌面計算機系統的應用軟件的更新方式,這種移動代碼可以經Internet的web瀏覽器自動下載和更新,在享受便捷快速的技術更新的同時也帶來了安全
隱患。Java v1.0采用了沙箱(sandbox)安全模型,它的主要思想是像applet這樣通過遠程下載的代碼只能受限的訪問系統資源,如不能訪問本地文件、不能建立新的網絡連接等,它們的行為受限於沙箱之中。由於這個模型約束太多,大大削弱了移動代碼的優勢。在
Java v1.1中采用了信任安全模型,其主要思想是使用戶可以有選擇的授權給遠程代碼,如果遠程某地資源可以被信任,那么帶有此地簽名的代碼將被授權可以訪問本地的資源系統,其他不被信任的代碼仍受限於沙箱內。Java2平台則采用了域管理方式的安全模型,無
論是本地代碼還是遠程代碼都可以通過配置的策略,設定可訪問的資源域,這種策略更好的支持了企業級的應用,同時也消除了區分本地代碼和遠程代碼帶來的困難。上面已經講過字節碼需要進行校驗,實際上Java代碼再運行之前要經過幾次檢驗,大都是從安全角度
考慮,JVM將代碼輸入一個字節碼校驗器以測試代碼段格式並進行規則檢查,檢查偽造指針、違反對象訪問權限或試圖改變對象類型的非法代碼、對象域訪問是否合法等。在運行時還要進行字節碼校驗,主要判斷字節碼是否符合JVM規范,是否破壞系統完整性,是否
引起操作數堆棧上溢或下溢,代碼的參數類型是否准確,有無非法數據轉換,有無訪問限制違例等。
