1、類的載入、鏈接和初始化 css
類初始化一般包含載入、鏈接、初始化三個步驟。html
(1)進程的結束java
每當執行一個java程序時,將會啓動一個java虛擬機進程,不管程序多麼複雜。有多少線程。都在這個java虛擬機進程裏。下面四種狀況會使得該進程被終止——bootstrap
當該進程結束,那麼該進程在內存中的狀態將會丟失。包含靜態變量的值。緩存
(2)類的載入jvm
類的載入是指將類的class文件讀入內存。併爲之建立一個java.lang.class對象。post
(3)類的鏈接spa
類的鏈接負責把類的二進制數據合併到JRE中,分爲三個階段——線程
(4)類的初始化xml
類的初始化。主要就是對靜態Field進行初始化。
2、類載入器
(1)類載入器簡單介紹
類載入器負責載入所有的類。系統爲所有載入內存裏的類都會生成一個java.lang.class對象。
同一個類僅僅會被載入一次,在JVM中每一個不一樣的類都會有一個不一樣的類載入器負責。
類載入器在不包含用戶本身定義的載入器的狀況下包含三層:
①根載入器,又稱爲引導或者原始載入器,負責載入java的核心類;
②擴展類載入器,負責載入JRE的擴展文件夾中JAR包的類。
③系統類載入器。又稱爲應用載入器。負責JVM啓動時載入來自java命令的-classpath或者CLASSPATH環境變量所指定的JAR包和類路徑。一般是程序執行的當前路徑。因此其稱爲應用類載入器。
三個類載入器的順序是:
bootstrap classloader
|
extension classloader
|
system classloader
假設實用戶本身定義的類載入器,那麼在系統載入器後。將會執行用戶類載入器。
(2)本身定義類載入器
假設咱們需要在啓動類載入時做一些特定需求的行爲,那麼就需要本身定義類載入器了。
本身定義ClassLoader需要繼承ClassLoader抽象類,重寫findClass方法,這種方法定義了ClassLoader查找class的方式。
主要可以擴展的方法有:
findClass 定義查找Class的方式
defineClass 將類文件字節碼載入爲jvm中的class
findResource 定義查找資源的方式
(3)類載入機制
JVM的類載入機制有下面三種:
所謂全盤負責。便是當一個classloader載入一個Class的時候,這個Class所依賴的和引用的所有 Class也由這個classloader負責載入,除非是顯式的使用另一個classloader載入。
所謂父類託付。就是先讓父類載入器先嚐試載入該Class,當父類沒法載入的時候。纔是嘗試從本身的類路徑中去載入。
JVM的ClassLoader採用的是樹形結構,除了BootstrapClassLoader之外。每一個ClassLoader都會有一個parentClassLoader,即父類載入器,用戶本身定義的ClassLoader默認的parendClassLoader是SystemClassLoader,固然你可以本身指定需要用哪個ClassLoader的實例
所謂緩存機制就是保證所有載入過的類都會被緩存。當程序中需要某個類時,會先從緩存區中搜查該類,當緩存區不存在該類對象時,系統纔會讀取該類的二進制文件。