照明網站建設新媒體
JVM構成部分
類加載系統(tǒng)
類加載子系統(tǒng)的作用是將磁盤中的.class文件加載到內存當中。工作過程如下:
- 加載:通過類全路徑名獲取二進制字節(jié)流;將這個二進制字節(jié)流代表的數存儲構轉化為方法區(qū)運行時數據結構;在內存生成一個代表該類的Class對象,作為方法區(qū)該類的訪問入口。
- 鏈接
- 驗證:驗證加載的.class文件是否正確
- 準備:為static對象分配內存并賦零值
- 解析:符號引用(一組能描述目標對象的字面量,如全路徑名)解析為直接引用(指向目標對象的指針,相對偏移量或能間接定位目標的句柄)
- 初始化:給對象賦真實的值
類加載器
用于實現類的加載動作,對于任意一個類,都必須由加載它的類加載器和這個類本身一起共同確立其在Java虛擬機中的唯一性,每 一個類加載器,都擁有一個獨立的類名稱空間。比較兩個類是否“相等”,只有在這兩個類是由同一個類加載器加載的前提下才有意義,否則,即使這兩個類來源于同一個 Class文件,被同一個Java虛擬機加載,只要加載它們的類加載器不同,那這兩個類就必定不相等。
- 引導類類加載器()
- BootstrapClassLoader:加載jre中ib目錄下的類
- 自定義類加載器(繼承ClassLoader抽象類)
- ExtClassLoader:加載jre中ib/ext目錄下的類
- AppClassLoader:加載當前項目classpath下的類
雙親委派
工作過程是:類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器去完成,每一個層次的類加載器都是如此,因此所有的 加載請求最終都應該傳送到最頂層的啟動類加載器中,只有當父加載器反饋自己無法完成這個加載請 求(它的搜索范圍中沒有找到所需的類)時,子加載器才會嘗試自己去完成加載。雙親委派實現:
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {synchronized (getClassLoadingLock(name)) {// First, check if the class has already been loadedClass<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {if (parent != null) {c = parent.loadClass(name, false);} else {c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}if (c == null) {// If still not found, then invoke findClass in order// to find the class.long t1 = System.nanoTime();c = findClass(name);// this is the defining class loader; record the statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}}