最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java高級之虛擬機加載機制的實例講解

 更新時間:2017年12月09日 09:16:33   作者:tpiniu  
下面小編就為大家分享一篇Java高級之虛擬機加載機制的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

Jvm要加載的是二進制流,可以是.class文件形式,也可以是其他形式,按照它加載的標準來設計就不會有太大問題。

以下主要就機制和標準兩個問題分析一番:

首先來Java類文件的加載機制 ,跟變量的加載機制類似,它先把Class文件加載入內存,再對數(shù)據(jù)進行驗證、解析和初始化,最終形成虛擬機可以直接使用的Java類型。由于Java是采用JIT機制,所以加載時會比較慢,但優(yōu)點也明顯,具有高度靈活性,支持動態(tài)加載和動態(tài)連接。

接下來就講講類的加載過程:

一個類加載的基本過程是按照下面的順序 來,但也有不嚴格按照這個順序來的,也有打亂順序來的,如動態(tài)加載就得先初始化再解析。

1、加載

由虛擬機自行決定,但也有由于下面的階段要執(zhí)行而執(zhí)行上面階段的情況。

這時虛擬機會做三件事:

第一、通過全限定名讀取文件的二進制流;

第二、把文件里的靜態(tài)方法和變量放到方法區(qū)中;

第三、生成一個對象放入堆中,作為訪問入口。

注意第一條,僅是讀取二進制流,沒說具體從什么文件中讀,也沒說從哪里讀,所以造就Java很強的擴展性,可以從Jar、Zip中,也可以從網(wǎng)絡層、數(shù)據(jù)庫層等 。

主要是對象和方法區(qū)的聲明。

2、驗證

確保二進制流符合虛擬機的要求, 不符合會報VerifyError。

第一、文件格式驗證,是否有魔數(shù),是否符合Java文件的要求;

第二、元數(shù)據(jù)驗證,是否符合Java代碼規(guī)范,如abstract類是否直接被實例化,普通類有無間接或直接父類Object等;第三、字節(jié)碼驗證,對數(shù)據(jù)流和控制流進行分析,保證不會做出危害虛擬機的行為,如 是否調用不存在的指令,是否把父類賦值給子類,是否把對象賦值給一個非此類型的對象等;

第四、符號引用驗證,主要是類、變量、方法描述是否能找的到,如全限定名是否能找到該文件,是否具有可訪問性等。

主要對內部結構的判定

3、準備

為類變量賦初值,通常為0值如靜態(tài)變量,而不會為實例變量賦值。

4、解析

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

5、初始化

根據(jù)程序要求加載類和必要的資源。有且僅有四種情況,需要主動初始化后才能執(zhí)行接下來的操作 ,所以要先執(zhí)行上面的四步。

第一、有new或static關鍵字的類,new生成對象,static靜態(tài)加載,這兩個很明顯要執(zhí)行初始化了;

第二、使用類有父類,這沒辦法了;

第三、反射類里的方法,那肯定要初始化了對不對;

第四、執(zhí)行的主類,用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!!

執(zhí)行結果說明一個問題: 子類調用父類變量的時候 ,子類沒有初始化,因為 此時的代碼關系跟子類無關 ;子類初始化的時候,父類也沒有再初始化,因為 父類在當前方法體中已經初始化 過了。接口與父類的唯一區(qū)別在于, 接口初始化不會要求父接口,只有用到父接口才會初始化 ,同樣的都會生成類構造器。

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

6、使用

加載完之后,該怎么樣調用怎么樣調用,繪圖啊,計算啊等等

7、卸載

類不再被調用

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

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

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

偽代碼如下:

loadClass(String name,boolean resolve){
Class c=findLoadedClass()
if(c==null){
if(parent !=null)
c=parent.loadClass(name,false);
c=findBootstrapClassOrNull(name);
}catch(ClassNotFoundException e){ }
if(c==null)
c=findClass(name);
}

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

破壞1、重寫loadClass

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

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

但由于自定義加載器之間的規(guī)則如果混亂,出現(xiàn)同時互相引用的問題,那么會最終找不到類,而出現(xiàn)線程死鎖和內存泄露的問題。

關于熱修復,也被稱為插件,目前比較流行的有HotFix、Nuwa、DroidFix、AndFix等,這些框架均可以在github或其他地方找到,原理如上,方法多樣,有覆蓋的、有重定向的等等,通過配置、設置action等方式;而作為插件需要滿足以下條件:

1、可以獨立安裝,但不可獨立運行

2、具有向下兼容性,即可拓展性

3、只能運行在宿主程序中,而且可以被禁用、替換

以上這篇Java高級之虛擬機加載機制的實例講解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java 分割字符串詳解及實例代碼

    Java 分割字符串詳解及實例代碼

    這篇文章主要介紹了 Java 分割字符串詳解及實例代碼的相關資料,需要的朋友可以參考下
    2016-12-12
  • SpringBoot啟動應用及回調監(jiān)聽原理解析

    SpringBoot啟動應用及回調監(jiān)聽原理解析

    這篇文章主要介紹了SpringBoot啟動應用及回調監(jiān)聽原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • javaWeb項目部署到阿里云服務Linux系統(tǒng)的詳細步驟

    javaWeb項目部署到阿里云服務Linux系統(tǒng)的詳細步驟

    這篇文章主要介紹了javaWeb項目部署到阿里云服務Linux系統(tǒng),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • MyBatis 引入映射器的方法

    MyBatis 引入映射器的方法

    本文通過實例代碼給大家分享mybatis 引入映射器的方法,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-09-09
  • 詳解SpringBoot實現(xiàn)事件同步與異步監(jiān)聽

    詳解SpringBoot實現(xiàn)事件同步與異步監(jiān)聽

    這篇文章主要通過示例為大家詳細介紹了SpringBoot中的事件的用法和原理以及如何實現(xiàn)事件同步與異步監(jiān)聽,快跟隨小編一起學習學習吧
    2022-06-06
  • java中抽象類、抽象方法、接口與實現(xiàn)接口實例詳解

    java中抽象類、抽象方法、接口與實現(xiàn)接口實例詳解

    這篇文章主要給大家介紹了關于java中抽象類、抽象方法、接口與實現(xiàn)接口的相關資料,文中通過示例代碼將四者介紹的非常詳細,并且簡單介紹了抽象類和接口的區(qū)別,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。
    2017-11-11
  • Java 中synchronize函數(shù)的實例詳解

    Java 中synchronize函數(shù)的實例詳解

    這篇文章主要介紹了Java 中synchronize函數(shù)的實例詳解的相關資料,希望通過本文能幫助到大家理解使用synchronize函數(shù)的使用方法,需要的朋友可以參考下
    2017-09-09
  • SpringBoot登錄判斷過程代碼實例

    SpringBoot登錄判斷過程代碼實例

    這篇文章主要介紹了SpringBoot登錄判斷代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • SpringBoot實現(xiàn)MapperScan添加動態(tài)配置(占位符)

    SpringBoot實現(xiàn)MapperScan添加動態(tài)配置(占位符)

    這篇文章主要介紹了SpringBoot實現(xiàn)MapperScan添加動態(tài)配置(占位符),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • Maven構建生命周期詳細介紹

    Maven構建生命周期詳細介紹

    這篇文章主要介紹了Maven構建生命周期詳細介紹,小編覺得還是挺不錯的,這里分享給大家,需要的朋友可以參考下。
    2017-11-11

最新評論

咸阳市| 阳春市| 荥阳市| 炎陵县| 临江市| 宁国市| 苗栗县| 舟曲县| 灌云县| 磐石市| 新源县| 米脂县| 武山县| 高清| 临漳县| 皋兰县| 晴隆县| 玉树县| 北流市| 长乐市| 米脂县| 集贤县| 宜宾市| 都安| 鸡西市| 乐昌市| 利津县| 天等县| 安平县| 杭州市| 景德镇市| 陆丰市| 康乐县| 吉林市| 南乐县| 镇巴县| 巩留县| 马关县| 大姚县| 夏邑县| 台山市|