淺談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)和本地方法庫
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的執行機制不會被破壞.