多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php框架 > 框架設計 > Java高級之虛擬機加載機制

Java高級之虛擬機加載機制

來源:程序員人生   發布時間:2016-06-20 17:00:17 閱讀次數:3866次



  本文來自http://blog.csdn.net/liuxian13183/ ,援用必須注明出處!


前兩節我們探討了Java類內存模塊,文件結構,和Jvm的回收機制,今天我們再來探討1下它的文件加載機制,都知道Jvm要加載的是2進制流,可以是.class文件情勢,也能夠是其他情勢,總之依照它加載的標準來設計就不會有太大問題,以下主要就機制和標準兩個問題分析1番

首先來講Java類文件的加載機制,跟變量的加載機制類似,它先把Class文件加載入內存,再對數據進行驗證、解析和初始化,終究構成虛擬機可以直接使用的Java類型。由于Java是采取JIT機制,所以加載時會比較慢,但優點也明顯,具有高度靈活性,支持動態加載和動態連接。接下來就講講類的加載進程:

1個類加載的基本進程是依照下面的順序來,但也有不嚴格依照這個順序來的,也有打亂順序來的,如動態加載就得先初始化再解析。

1、加載- 由虛擬機自行決定,但也有由于下面的階段要履行而履行上面階段的情況。這時候虛擬機會做3件事,第1、通過全限定名讀取文件的2進制流,第2、把文件里的靜態方法和變量放到方法區中,第3、生成1個對象放入堆中,作為訪問入口。注意第1條,僅是讀取2進制流,沒說具體從甚么文件中讀,也沒說從哪里讀,所以造就Java很強的擴大性,可以從Jar、Zip中,也能夠從網絡層、數據庫層等 。主要是對象和方法區的聲明。

2、驗證 確保2進制流符合虛擬機的要求,不符合會報VerifyError。 第1、文件格式驗證,是不是有魔數,是不是符合Java文件的要求,詳見:Java高級之類結構的認識;第2、元數據驗證,是不是符合Java代碼規范,如abstract類是不是直接被實例化,普通類有沒有間接或直接父類Object等;第3、字節碼驗證,對數據流和控制流進行分析,保證不會做出危害虛擬機的行動,如是不是調用不存在的指令,是不是把父類賦值給子類,是不是把對象賦值給1個非此類型的對象等;第4、符號援用驗證,主要是類、變量、方法描寫是不是能找的到,如全限定名是不是能找到該文件,是不是具有可訪問性等。主要對內部結構的判定

3、準備 為類變量賦初值,通常為0值如靜態變量,而不會為實例變量賦值。

4、解析 將常量池中的符號援用轉化為直接援用的進程。這里說的符號援用指變量類型,直接援用指可以直接定位到對象的句柄。類、方法、字段、接口解析,根據全限定名取得相干對象,拿到它的類型,若無對所在類訪問權會拋出IllegalAccessError,無字段NoSuchFieldError,無方法NoSuchMethodError,是類不是接口會拋出IncompatibleClassChangeError

5、初始化 根據程序要求加載類和必要的資源。有且唯一4種情況,需要主動初始化后才能履行接下來的操作 ,所以要先履行上面的4步。第1、有new或static關鍵字的類,new生成對象,static靜態加載,這兩個很明顯要履行初始化了;第2、使用類有父類,這沒辦法了;第3、反射類里的方法,那肯定要初始化了對不對;第4、履行的主類,用main方法的類。其他被動初始化的情況不需要斟酌。

小例子:

public class SuperClass { static { System.out.println("SuperClass!!"); } public static int value = 1; }
public class SubClass extends SuperClass { static { System.out.println("SubClass!!"); } }
public class TestClassLoad { public static void main(String[] args) { System.out.println(SubClass.value); SuperClass superClass = new SubClass(); } }

SuperClass!! 1 SubClass!!
履行結果說明1個問題:子類調用父類變量的時候,子類仿佛沒有初始化,由于此時的代碼關系跟子類無關;子類初始化的時候,父類仿佛也沒有再初始化,由于父類在當前方法體中已初始化過了。接口與類的父接口或類的唯1區分在于,接口初始化不會要求父接口,只有用到父接口才會初始化,一樣的都會生成<clinit>類構造器。

這個時候加載類構造器<clinit>,會初始化類中所有變量,固然父類先于子類初始化

6、使用 加載完以后,該怎樣樣調用怎樣樣調用,繪圖啊,計算啊等等

7、卸載  類不再被調用


兩個類是不是相等,主要在于第1使用同1個加載器加載,第2全限定名地址1致


為何要提出上面的問題呢?接下來要講講虛擬機的1個加載機制。

在虛擬機的角度來看,有兩種類加載器,1種叫系統加載器(Bootstrap ClassLoader),1種叫自定義加載器(extends ClassLoader),這類呢又分為兩個,1種叫利用加載器,1種叫擴大類加載器,1般默許為前者;而我們的利用程序加載主要由上面3個加載器相互配合完成的。3者的關系如Application-->Extension-->Bootsrap,雙親委派機制是指兩兩以組合的方式,子加載器先去調用父加載器的方法,沒找到目標對象再去用子加載器

偽代碼以下:

loadClass(String name,boolean resolve){

Class c=findLoadedClass()

if(c==null){

try{

if(parent !=null)

c=parent.loadClass(name,false);

else

c=findBootstrapClassOrNull(name);

}catch(ClassNotFoundException e){ }

}

if(c==null)

c=findClass(name);

}

Java提倡我們去把自己調用類的邏輯寫在findClass里,這樣有助于雙親委派機制的正常使用。

破壞1、重寫loadClass

破壞2、使用線程上下文加載器去讓父加載器去調用子加載器的方法

破壞3、熱加載 現在經常使用的做法是自定義類加載器并將原bug模塊覆蓋-OSGI

但由于自定義加載器之間的規則如果混亂,出現同時相互援用的問題,那末會終究找不到類,而出現線程死鎖和內存泄漏的問題。


下1節我們會討論1下線程并發的問題。



生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: www啪| www黄色免费 | 国产精品成人一区二区三区 | 亚洲欧美卡通成人制服动漫 | 在线观看免费亚洲 | 日本 免费 高清 | 欧美黑人在线视频 | www一区 | 久久国产综合精品欧美 | 成人午夜大片免费视频77777 | 在线观看日本一区 | 欧美一区二区三区视频在线观看 | 黑人高h | 欧美黄色片免费观看 | 成人天堂在线 | 国产精品视频永久免费播放 | 伊人久久大香线蕉亚洲 | 精品一区二区三区在线视频观看 | 中国国产一国产一级毛片视频 | 国产在线精品福利91香蕉 | 性香港xxxxx免费视频播放 | 在线播放网站 | 亚洲成年网站 | 久久精品国产亚洲片 | 成人国产精品久久久免费 | 久久视频精品a线视频在线观看 | 手机看片日韩欧美 | 成人国产精品一级毛片了 | 久久天天躁狠狠躁夜夜躁 | 欧美第六页 | 1区1区3区4区产品亚洲 | 亚洲精品国产一区二区三 | 国产女人的一级毛片视频 | 久久久www免费人成看片 | 久久综合久久综合久久 | 一区二区三区四区无限乱码在线观看 | 永久免费在线观看视频 | 黄色网址免费在线 | 精品国产一区二区三区在线观看 | 欧美日韩国产精品综合 | 亚洲一区日韩二区欧美三区 |