Classloader機制

1.概述?緩存

類加載器:負責.class文件加載到內存中,併爲之生成對應的Class對象,也就是字節碼對象。這樣就可使用這個類中的成員變量和方法了。而被加載到內存中的class文件就會變成class對象。spa

常見的類加載器有三種,每一個加載器負責加載不一樣的位置的類:code

  (1)Bootstrap:根類加載器對象

  (2)ExtClassLoader:擴展類加載器blog

  (3)AppClassLoader:系統、應用類加載器內存

關於上述加載器的區別:get

說明:一、Bootstrap是最頂級的加載器。加載類文件不是咱們本身書寫的,是JRE/lib/rt.jar包下的。只有將這個包下面的全部類加載到內存中,纔可使用這個包下的全部類。class

            2.ExtClassLoader擴展類加載器,是用來加載JRE/lib/ext/*.jar這個包下的全部類,在這個jar包中,都是jdk內部本身使用的。變量

    3.AppClassLoader系統/應用類加載器。是用來加載ClassPath指定全部的jar或目錄,classPath表示存放類路徑。擴展

2.委託機制

全盤負責委託機制:

ClassLoader(類加載器)加載類用的是全盤負責委託機制。

1)全盤負責:當一個ClassLoader(類加載器)加載一個類的時候,那麼在這個類中所引用的全部其它的類一般也都由這個類加載器來加載。

舉例:好比上述代碼中咱們在 ClassLoaderDemo1 類中書寫以下代碼:

public class ClassLoaderDemo1 {

public static void main(String[] args) {

// 獲取當前類的加載器

ClassLoader loader = ClassLoaderDemo1.class.getClassLoader();

//輸出當前類的類加載器

System.out.println(loader);//sun.misc.Launcher$AppClassLoader@b0014f0

//獲取AppClassLoader類加載器的父類

ClassLoader parent = loader.getParent();

//輸出AppClassLoader類加載器的父類加載器

System.out.println(parent);//sun.misc.Launcher$ExtClassLoader@325e9e34

}

} 

說明:因爲咱們在ClassLoaderDemo1 類中使用了System類,那麼System類也應該由ClassLoaderDemo1的類加載器加載到內存中。

換句話說,若是在A類中使用了B類,那麼A類的加載器就會將B類也會加載到內存中,就是一個類的加載器同時把多個類都加載了。

2)委託機制:先讓Parent(父)類加載器尋找,只有在Parent找不到的時候,才從本身的範圍中尋找。

可是呢,全盤負責要和委託機制一塊兒使用,一個類加載器在加載一個類的時候不是上來就先加載類,而是先諮詢這個類加載器的父親,先看他的父類加載器有沒有要加載的類,若是已經存在要加載的類了,那麼子類加載器就不會加載,由於在加載就會重複,產生衝突了,只有在父類加載器中找不到的時候,才從本身的範圍中尋找。

舉例:仍是上述的代碼,因爲ClassLoaderDemo1 類是被 AppClassLoader 類加載器加載內存中的,那麼根據全盤負責機制,AppClassLoader 類加載器也會將System類加載到內存中,可是在加載的時候,根據委託機制AppClassLoader 類加載器會先去諮詢他的父親ExtClassLoader 類加載器,而這個類加載器中也沒有System類,那麼又會去諮詢ExtClassLoader 類加載器的父類Bootstrap類加載器,而在這個類加載器中是能夠加載System類的,因此做爲子類加載器AppClassLoader 就不會加載了,這樣才能保證一個類只會被加載一次,任何一個類同時只會被加載一次。

若是一個類在父類加載器中找到了,那麼就會把這個類加載以後保存到cache(緩存)中。

3)類加載器的cache(緩存)機制:若是cache中保存了這個類就直接返回它,若是沒有才加載這個類,而後存入cache中,下一次若是有其餘類在使用的時候就不會在加載了,直接去cache緩存拿便可。這就是爲何每一個類只加載一次,內存只有一份的緣由。

舉例:仍是上述代碼中,當第一次使用System類的時候,那麼System類就會被加載了,那麼System類就會存儲到內存中了,當下面代碼中咱們再一次使用System類的時候,因爲內存中已經有了,那麼就不會在去加載了,這時會直接拿過來用便可。

所以方法區中每個類的字節碼文件只有一份的緣由由全盤負責、委託機制和類加載器的cache(緩存)機制共同決定。

相關文章
相關標籤/搜索