1. 程式人生 > >淺談JVM(一) ClassLoader的雙親委派和沙箱機制

淺談JVM(一) ClassLoader的雙親委派和沙箱機制

JVM(Java Virtual Machine)   java虛擬機器 

JVM執行在作業系統之上,與計算機硬體沒有互動

JVM整體執行流程需要用到的資源 可以說分以下標紅的5部分組成

class files 被java命令執行 將類資訊通過類裝載器(ClassLoader)載入並初始化生成 Class模版放入執行時資料區(Runtime Data Area)

執行時資料區包括 5部分 : 方法區 和 堆(執行緒公有)   java棧和本地方法棧和程式計數器(執行緒私有)

執行引擎(Execution Engine)負責從java棧中取得命令解釋成作業系統可識別命令,並交給作業系統執行

本地介面(Native Interface)和本地方法庫

  融合了別的程式語言(C/C++)為java所用,java誕生時c和c++處於統治地位,

java或多或少會使用c/c++實現一些底層方法(native)方法,於是專門在記憶體中開闢了一塊區域來登記native方法,

在執行引擎執行時載入native libraies,目前這些方法使用越來越少了.

今天總結一部分

ClassLoader

負責載入class檔案,class檔案在檔案開頭有特定的檔案標示,並且ClassLoader只負責class檔案的載入,至於它是否可以執行,則由Execution Engine決定

目前瞭解4種類載入器:

1.BootstrapClassLoader 啟動類載入器

這貨是用C++編寫的   是最頂層的類裝載器,用來載入jre/lib/rt.jar下的類

2.ExtensionClassLoader拓展類載入器

用來載入jre/lib/ext/*.jar的所有類

3.AppClassLoader 應用類載入器

應用類載入器,也叫系統類載入器,用來載入當前應用classpath下的所有類

4.User-Definend 使用者自定義的類載入器

繼承 java.lang.ClassLoader類實現裡面的方法,自定義載入類的方法

雙親委派機制

雙親委派模型的式作過程是:如果一個類載入器收到了類載入的請求,它首先不會自己去嘗試載入這個類,而是把這個請求委派給父類載入器去完成,每一個層次的類載入器都是如此,因此所有的載入請求最終都應該傳送到頂層的啟動類載入器中,只有當父載入器反饋自己無法完全這個載入請求時,子載入器才會嘗試自己去載入。

沙箱機制

沙箱機制是由基於雙親委派機制上 採取的一種JVM的自我保護機制,假設你要寫一個java.lang.String 的類,由於雙親委派機制的原理,此請求會先交給Bootstrap試圖進行載入,但是Bootstrap在載入類時首先通過包和類名查詢rt.jar中有沒有該類,有則優先載入rt.jar包中的類,因此就保證了java的執行機制不會被破壞.