亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

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

2024-07-13 10:14:23
字體:
來源:轉載
供稿:網友

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

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

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

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

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

1、加載

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

這時虛擬機會做三件事:

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

第二、把文件里的靜態方法和變量放到方法區中;

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

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

主要是對象和方法區的聲明。

2、驗證

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

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

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

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

主要對內部結構的判定

3、準備

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

4、解析

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

5、初始化

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

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

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

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

第四、執行的主類,用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!!1SubClass!!

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

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

6、使用

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

7、卸載

類不再被調用

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

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

在java虛擬機的角度來看,有兩種類加載器,一種叫系統加載器(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、熱加載 現在常用的做法是 自定義類加載器并 將原bug模塊覆蓋-OSGI

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

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

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

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

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

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


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品久久久久久下一站| 国模视频一区二区| 精品美女国产在线| 色哟哟网站入口亚洲精品| 欧美精品一区二区三区国产精品| 在线免费观看羞羞视频一区二区| 福利视频一区二区| 色中色综合影院手机版在线观看| 自拍偷拍亚洲区| 精品爽片免费看久久| 国产精品入口免费视频一| 亚洲激情自拍图| 亚洲欧洲黄色网| 91人人爽人人爽人人精88v| 色七七影院综合| 精品偷拍一区二区三区在线看| 久久久久久久香蕉网| 久久久久一本一区二区青青蜜月| 国产99视频在线观看| 国产日产欧美精品| 欧美亚洲一区在线| 欧美夜福利tv在线| 久久久久成人精品| 国内精品中文字幕| 久久天天躁狠狠躁夜夜爽蜜月| 成人黄色激情网| 亚洲人成毛片在线播放| 久久久久一本一区二区青青蜜月| 国产精品电影观看| 日韩在线精品视频| 欧美在线免费视频| 久久久久久亚洲精品| 久久久999精品视频| 欧美电影免费观看电视剧大全| 欧洲亚洲在线视频| 国产亚洲精品久久久久久牛牛| 亚洲毛片在线观看| 欧美成人免费va影院高清| 91在线精品视频| 97avcom| 欧美专区日韩视频| 欧美亚州一区二区三区| 欧美精品在线观看| 91国产一区在线| 亚州成人av在线| 亚洲精品色婷婷福利天堂| 亚洲一区精品电影| 成人国产精品色哟哟| 亚洲国产成人精品女人久久久| 国产一区二区色| 黑人巨大精品欧美一区二区一视频| 精品久久久一区二区| 亚洲精品视频二区| 国产精品一区二区三区免费视频| 中文字幕日韩免费视频| 亚洲国产一区二区三区四区| 国自产精品手机在线观看视频| 欧美在线一级va免费观看| 亚洲成人亚洲激情| 亚洲欧美国产制服动漫| 91久久国产精品| 精品无人区太爽高潮在线播放| 日韩精品黄色网| 日韩av在线一区二区| 国产精品一区二区三区久久久| 亚洲精品日韩激情在线电影| 日韩在线观看你懂的| 日本亚洲精品在线观看| 91在线观看免费高清| 国产福利精品av综合导导航| 日韩精品中文字幕在线观看| 国产99久久久欧美黑人| 亚洲综合色激情五月| 亚洲国模精品一区| 91精品国产91久久久| 国产精品网站视频| 亚洲成人激情小说| 国产区精品在线观看| 8x拔播拔播x8国产精品| 国产精品一区二区性色av| 欧美日本国产在线| 亚洲第一天堂无码专区| 日韩中文字幕在线| 亚洲男人天堂网站| 国产91对白在线播放| 中文字幕精品一区久久久久| 欧美激情精品久久久久久久变态| 国产精品久久久久福利| 亚洲第一天堂无码专区| 亚洲国产天堂久久综合| 日韩激情第一页| 原创国产精品91| 色综合久久精品亚洲国产| 国产91av在线| 狠狠色狠狠色综合日日五| 国色天香2019中文字幕在线观看| 北条麻妃一区二区三区中文字幕| 欧美日韩综合视频| 中国china体内裑精亚洲片| 国产一区二区动漫| 一区二区三区国产在线观看| 九九久久国产精品| 亚洲一区二区三区乱码aⅴ蜜桃女| 成人网在线免费观看| 国产精品揄拍500视频| 自拍偷拍亚洲欧美| 538国产精品一区二区免费视频| 日韩免费视频在线观看| 亚洲直播在线一区| 欧美人在线视频| 韩国三级电影久久久久久| 国产精品小说在线| 成人中文字幕在线观看| 久久亚洲电影天堂| 国产91精品久久久久久久| 日韩在线www| 亚洲一区第一页| 欧美激情成人在线视频| 黄色成人av在线| 亚洲欧美日韩久久久久久| 成人免费淫片aa视频免费| 日韩中文字幕在线看| 亚洲影院高清在线| 欧美性20hd另类| 日韩欧美在线视频免费观看| 夜夜嗨av一区二区三区四区| 亚洲欧美第一页| 亚洲国产小视频在线观看| 国产精品美女久久久久久免费| 国产精品久久视频| 中文字幕在线看视频国产欧美在线看完整| 91久久久在线| 亚洲激情自拍图| 亚洲91精品在线观看| 成人免费视频网址| 欧美日韩精品二区| 亚洲欧美制服丝袜| 亚洲国产成人一区| 亚洲精品免费网站| 热99在线视频| 午夜精品久久久久久久久久久久| 国产成人精品电影| 91嫩草在线视频| 日韩中文字幕免费看| 国产91精品最新在线播放| 亚洲人高潮女人毛茸茸| 国产精品久久久久aaaa九色| 色妞色视频一区二区三区四区| 欧美猛男性生活免费| 久久精品国产一区| 中文字幕在线看视频国产欧美| 国产成人精品在线视频| 久久久久久久久久久免费| 亚洲二区中文字幕| 日本久久久久亚洲中字幕| 国产亚洲精品久久久久动| 97av在线视频| 国产做受69高潮| 亚洲午夜精品久久久久久久久久久久| 国产日韩在线看| 国产精品偷伦一区二区| 国产亚洲精品久久久久久777| 亚洲精品美女久久久| 91大神福利视频在线|