亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java高級(jí)之虛擬機(jī)加載機(jī)制的實(shí)例講解

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

Jvm要加載的是二進(jìn)制流,可以是.class文件形式,也可以是其他形式,按照它加載的標(biāo)準(zhǔn)來設(shè)計(jì)就不會(huì)有太大問題。

以下主要就機(jī)制和標(biāo)準(zhǔn)兩個(gè)問題分析一番:

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

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

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

1、加載

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

這時(shí)虛擬機(jī)會(huì)做三件事:

第一、通過全限定名讀取文件的二進(jìn)制流;

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

第三、生成一個(gè)對(duì)象放入堆中,作為訪問入口。

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

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

2、驗(yàn)證

確保二進(jìn)制流符合虛擬機(jī)的要求, 不符合會(huì)報(bào)VerifyError。

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

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

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

主要對(duì)內(nèi)部結(jié)構(gòu)的判定

3、準(zhǔn)備

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

4、解析

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

5、初始化

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

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

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

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

第四、執(zhí)行的主類,用main方法的類。其他被動(dòng)初始化的情況不需要考慮。

小例子:

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í)行結(jié)果說明一個(gè)問題: 子類調(diào)用父類變量的時(shí)候 ,子類沒有初始化,因?yàn)?此時(shí)的代碼關(guān)系跟子類無關(guān) ;子類初始化的時(shí)候,父類也沒有再初始化,因?yàn)?父類在當(dāng)前方法體中已經(jīng)初始化 過了。接口與父類的唯一區(qū)別在于, 接口初始化不會(huì)要求父接口,只有用到父接口才會(huì)初始化 ,同樣的都會(huì)生成類構(gòu)造器。

這個(gè)時(shí)候加載類構(gòu)造器,會(huì)初始化類中所有變量,當(dāng)然父類先于子類初始化

6、使用

加載完之后,該怎么樣調(diào)用怎么樣調(diào)用,繪圖啊,計(jì)算啊等等

7、卸載

類不再被調(diào)用

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

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

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

偽代碼如下:

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提倡我們?nèi)グ炎约赫{(diào)用類的邏輯寫在findClass里,這樣有助于雙親委派機(jī)制的正常使用。

破壞1、重寫loadClass

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

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

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

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

1、可以獨(dú)立安裝,但不可獨(dú)立運(yùn)行

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

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

以上這篇Java高級(jí)之虛擬機(jī)加載機(jī)制的實(shí)例講解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java ConcurrentHashMap用法案例詳解

    Java ConcurrentHashMap用法案例詳解

    這篇文章主要介紹了Java ConcurrentHashMap用法案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Spring中的事務(wù)控制知識(shí)總結(jié)

    Spring中的事務(wù)控制知識(shí)總結(jié)

    我們講了轉(zhuǎn)賬方法存在著事務(wù)問題,當(dāng)在業(yè)務(wù)層方法更新轉(zhuǎn)入賬戶時(shí)發(fā)現(xiàn)異常,更新收款方賬戶則會(huì)出錯(cuò).當(dāng)時(shí)是通過自定義事務(wù)管理器進(jìn)行整體事務(wù)的處理.其實(shí)Spring 提供了業(yè)務(wù)層的事務(wù)處理解決方案,并且 Spring 的事務(wù)控制都是基于 AOP 的,需要的朋友可以參考下
    2021-06-06
  • 實(shí)例講解JAVA設(shè)計(jì)模式之備忘錄模式

    實(shí)例講解JAVA設(shè)計(jì)模式之備忘錄模式

    這篇文章主要介紹了JAVA設(shè)計(jì)模式之備忘錄模式的的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • MyBatis多表操作查詢功能

    MyBatis多表操作查詢功能

    這篇文章主要介紹了MyBatis多表操作,包括一對(duì)一查詢,一對(duì)多查詢的模型,多對(duì)多查詢的需求,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-11-11
  • 帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之二叉樹

    帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之二叉樹

    這篇文章主要為大家介紹了Java數(shù)據(jù)結(jié)構(gòu)和算法之二叉樹,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Springcloud實(shí)現(xiàn)服務(wù)多版本控制的示例代碼

    Springcloud實(shí)現(xiàn)服務(wù)多版本控制的示例代碼

    這篇文章主要介紹了Springcloud實(shí)現(xiàn)服務(wù)多版本控制的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 分析Netty直接內(nèi)存原理及應(yīng)用

    分析Netty直接內(nèi)存原理及應(yīng)用

    Netty作為一個(gè)流行的應(yīng)用框架,它的強(qiáng)悍之處是性能強(qiáng)悍,可以輕松承載數(shù)萬并發(fā); 其編程模型簡(jiǎn)單,容易上手; 這就給大家打開了一扇通向高性能的大門。高效io模型略去不說,我們今天主要來看看內(nèi)存控制這塊的強(qiáng)大之處
    2021-06-06
  • 淺談java接口的冪等性及解決方案

    淺談java接口的冪等性及解決方案

    本文主要介紹了java接口的冪等性及解決方案,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • java獲取百度網(wǎng)盤真實(shí)下載鏈接的方法

    java獲取百度網(wǎng)盤真實(shí)下載鏈接的方法

    這篇文章主要介紹了java獲取百度網(wǎng)盤真實(shí)下載鏈接的方法,涉及java針對(duì)URL操作及頁面分析的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • macOS中搭建Java8開發(fā)環(huán)境(基于Intel?x86?64-bit)

    macOS中搭建Java8開發(fā)環(huán)境(基于Intel?x86?64-bit)

    這篇文章主要介紹了macOS中搭建Java8開發(fā)環(huán)境(基于Intel?x86?64-bit)?的相關(guān)資料,需要的朋友可以參考下
    2022-12-12

最新評(píng)論