每一個Java虛擬機都由一個類加載器子系統(class loader subsystem),負責加載程序中的類型(類和接口),并賦予唯一的名字。每一個Java虛擬機都有一個執行引擎(execution engine)負責執行被加載類中包含的指令。
數據區中的一部分是整個程序共有,其他部分被單獨的線程控制。每一個Java虛擬機都包含方法區(method area)和堆(heap),他們都被整個程序共享。Java虛擬機加載并解析一個類以后,將從類文件中解析出來的信息保存與方法區中。程序執行時創建的 對象都保存在堆中。
Java虛擬機中的類加載器分為兩種:原始類加載器(primordial class loader)和類加載器對象(class loader objects)。原始類加載器是Java虛擬機實現的一部分,類加載器對象是運行中的程序的一部分。不同類加載器加載的類被不同的命名空間所分割。
像其他對象一樣,類加載器對象和Class對象都保存在堆中,被加載的信息被保存在方法區中。1、加載、連接、初始化(Loading, Linking and Initialization) 類加載子系統不僅僅負責定位并加載類文件,他按照以下嚴格的步驟作了很多其他的事情:1)、加載:尋找并導入指定類型(類和接口)的二進制信息2)、連接:進行驗證、準備和解析①驗證:確保導入類型的正確性②準備:為類型分配內存并初始化為默認值③解析:將字符引用解析為直接飲用3)、初始化:調用Java代碼,初始化類變量為合適的值
此圖看出jvm內存結構
JVM內存結構主要包括兩個子系統和兩個組件。兩個子系統分別是Classloader子系統和Executionengine(執行引擎)子系統;兩個組件分別是Runtimedataarea(運行時數據區域)組件和Nativeinterface(本地接口)組件。
類加載機制
JVM的類加載是通過ClassLoader及其子類來完成的,類的層次關系和加載順序可以由下圖來描述:
?
?
雙親委派模型的工作過程?
1、當前 ClassLoader 首先從自己已經加載的類中,查詢是否此類已經加載,如果已經加載則直接返回原來已經加載的類。? ? 一定程度上防止自有的類被篡改
每個類加載器都有自己的加載緩存,當一個類被加載了以后就會放入緩存,等下次加載的時候就可以直接返回了。
2、當前 ClassLoader 的緩存中沒有找到被加載的類的時候
委托父類加載器去加載,父類加載器采用同樣的策略,首先查看自己的緩存,然后委托父類的父類去加載,一直到 bootstrap ClassLoader。
當所有的父類加載器都沒有加載的時候,再由當前的類加載器加載,并將其放入它自己的緩存中,以便下次有加載請求的時候直接返回。
?