Java語言實現機制

Java語言實現機制java

 

1.Java虛擬機(Java Virtual Machine)程序員

 

Java虛擬機(JVM)是在一臺計算機上由軟件模擬也能夠用硬件來實現的假想的計算機。它定義了指令集(至關於中央處理器CPU)、寄存器集、類文件結構棧、垃圾收集堆、內存區域。web

 

首先,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完成。app

 

(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規範,是否破壞系統完整性,是否

 

引發操做數堆棧上溢或下溢,代碼的參數類型是否準確,有無非法數據轉換,有無訪問限制違例等。

相關文章
相關標籤/搜索