国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JVM類加載思維導圖

Crazy_Coder / 3615人閱讀

摘要:用一張思維導圖盡可能囊括一下的類加載過程的全流程。本文參考自來自周志明深入理解虛擬機第版,拓展內容建議讀者可以閱讀下這本書。

用一張思維導圖盡可能囊括一下JVM的類加載過程的全流程。

本文參考自來自周志明《深入理解Java虛擬機(第2版)》,拓展內容建議讀者可以閱讀下這本書。

文字版如下:

加載 Loading 過程

通過類的全限定名來獲取定義此類的二進制字節流

非數組類的加載,由類加載器加載,可以是啟動類加載器,也可以是用戶自定義的類加載器

數組類的加載,不由類加載器創建,而是由JVM直接在內部創建

組件類型(數組降一維后的類型)是引用類型,遞歸調用加載過程直到降到一維類型后通過類加載器加載,數組類型最終標識為此類加載器所加載,數組類可見性和組件類型保持一致

組件類型不是引用類型而是原始類型,則該數組類型的類加載器將標識為啟動類加載器,數組類型可見性為public

將這個字節流所代表的靜態存儲結構轉化為方法區的運行時數據結構

在內存中(HotSpot為方法區)生成一個代表了這個類的java.lang.Class對象,作為方法區這個類的各種數據的訪問入口

類加載器

啟動類加載器 Bootstrap ClassLoader,加載/lib中的類

拓展類加載器 Extension ClassLoader,加載/lib/ext中的類

應用程序類加載器 Application ClassLoader,加載用戶類路徑上的ClassPath中的類

自定義類加載器 User ClassLoader

連接 Linking 驗證 Verification

文件格式驗證:字節流是否符合Class文件格式規范

是否以magic開頭

主次版本號是否在虛擬機處理范圍內

常量池中的常量是否有不支持的類型

指向的常量索引值是否有指向不存在常量或不符合類型常量的情況

CONSTANT_Utf8_info的常量是否符合utf8編碼規范

Class文件各個部分及文件本身是否有被刪除或附加的其他信息

元數據驗證:字節碼描述的信息進行語義分析

是否有父類

父類是否繼承了不允許被繼承的類(final的)

如果不是抽象類是否實現了其父類或接口之中要求實現的類

類中字段、方法是否與父類產生矛盾

覆蓋了父類的final字段

不符合規范的方法重載?方法參數類型一致返回值類型不一致

字節碼驗證:通過數據流和控制流分析程序語義的合法性,即類的方法體的校驗分析

保證時刻操作數棧與指令代碼序列能配合工作

保證跳轉指令不會跳轉到方法體以外的字節碼指令上

保證方法體的類型轉換是有效的

符號引用驗證:類的常量池中各種符號引用的信息進行匹配性校驗

符號引用中通過字符串描述的全限定名是否能找到對應類

指定類中是否存在符合方法的字段描述符以及簡單名稱所描述的方法和字段

符號引用中的類、字段和方法的訪問性是否可被當前類所訪問

連接 Linking 驗證 Verification

文件格式驗證:字節流是否符合Class文件格式規范

是否以magic開頭

主次版本號是否在虛擬機處理范圍內

常量池中的常量是否有不支持的類型

指向的常量索引值是否有指向不存在常量或不符合類型常量的情況

CONSTANT_Utf8_info的常量是否符合utf8編碼規范

Class文件各個部分及文件本身是否有被刪除或附加的其他信息

元數據驗證:字節碼描述的信息進行語義分析

是否有父類

父類是否繼承了不允許被繼承的類(final的)

如果不是抽象類是否實現了其父類或接口之中要求實現的類

類中字段、方法是否與父類產生矛盾

覆蓋了父類的final字段

不符合規范的方法重載?方法參數類型一致返回值類型不一致

字節碼驗證:通過數據流和控制流分析程序語義的合法性,即類的方法體的校驗分析

保證時刻操作數棧與指令代碼序列能配合工作

保證跳轉指令不會跳轉到方法體以外的字節碼指令上

保證方法體的類型轉換是有效的

符號引用驗證:類的常量池中各種符號引用的信息進行匹配性校驗

符號引用中通過字符串描述的全限定名是否能找到對應類

指定類中是否存在符合方法的字段描述符以及簡單名稱所描述的方法和字段

符號引用中的類、字段和方法的訪問性是否可被當前類所訪問

準備 Preparation

類變量分配空間

類變量分配零值

類常量分配初始值:由類字段的ConstantValue屬性進行賦值

解析 Resolution

實際上就是把常量池中的符號引用替換為直接引用的過程

符號引用

在常量池中即非字面量的類型

CONSTANT_Class_info

CONSTANT_Fieldref_info

CONSTANT_Methodref_info

CONSTANT_InterfaceMethodref_info

特征

與虛擬機實現的內存布局無關

引用的目標并不一定已經加載到內存中

由虛擬機Class文件格式規范,因此不同虛擬機能夠接受的符號引用格式是確定的

直接引用

表達形式

直接指向目標的虛擬機內存中的指針

相對偏移量

能夠定位到目標的句柄

特征

與虛擬機的內存布局直接相關

引用的目標必須已經存在于內存中

同一符號引用在不同虛擬機中的直接引用一般不同,由虛擬機自己制定格式

符號引用解析

類或接口的解析

對CONSTANT_Class_info符號引用的解析

對全限定名的解析

虛擬機加載類D中的類符號引用N為一個類或接口C的直接引用

C不是數組類型

虛擬機將N代表的全限定名傳遞給D的類加載器來加載C

C被成功加載后(可能是之前已經加載過或者本次執行了首次加載),虛擬機將D中的符號引用N替換為C的直接引用

符號引用驗證,如D是否具備對C的訪問權限

C是數組類型?

虛擬機將N代表的全限定名(如[Ljava.lang.Integer)傳遞給D的類加載器來加載C(詳見數組類加載流程)

D的類加載器先加載C的組件類型(如java.lang.Integer)

虛擬機在方法區生成一個代表了數組維度和組件類型的數組對象

C被成功加載后,虛擬機將D中的符號引用N替換為C的直接引用

符號引用驗證,如D是否具備對C的訪問權限

字段解析

對CONSTANT_Fieldref_info符號引用的解析

對class_index的解析

對nameAndType_index的解析

虛擬機在類D中加載字段符號引用N為字段F的直接引用

虛擬機在N中指定的類C里尋找字段描述符和N中指定的字段描述符一致的字段F

能找到,就將符號引用N替換為F的直接引用

符號引用驗證,如D是否具備對F的訪問權限

找不到,在類C實現的接口中按照繼承關系從下向上尋找字段描述符和N中指定的字段描述符一致的字段F

能找到就將符號引用N替換為F的直接引用

符號引用驗證,如D是否具備對F的訪問權限

找不到,在類C繼承的父類中按照繼承關系從下向上尋找字段描述符和N中指定的字段描述符一致的字段F

能找到就將符號引用N替換為F的直接引用

符號引用驗證,如D是否具備對F的訪問權限

找不到,拋出java.lang.NoSuchFieldError異常

類方法解析

對CONSTANT_Methodref_info符號引用的解析

對class_index的解析

對nameAndType_index的解析

虛擬機在類D中加載類方法符號引用N為方法M的直接引用

虛擬機在N中指定的類C里尋找方法描述符和N中指定的方法描述符一致的方法M

能找到

class_index指定的類不是接口,就將符號引用N替換為M的直接引用

class_index指定的類是接口,拋出java.lang.IncompatibleClassChangeError異常

符號引用驗證,如D是否具備對M的訪問權限

找不到,在類C繼承的父類中按照繼承關系從下向上尋找方法描述符和N中指定的方法描述符一致的方法M

能找到就將符號引用N替換為M的直接引用

符號引用驗證,如D是否具備對M的訪問權限

找不到,在類C實現的接口中按照繼承關系從下向上尋找方法描述符和N中指定的方法描述符一致的方法M

能找到,說明類C是抽象類,拋出java.lang.AbstractMethodError異常(為什么說明C是抽象類呢?C的方法在C中找不到,但是在C實現的接口中找到了,這意味著C實現了接口但是沒有實現接口的這個方法,因此C類只可能是抽象類。)

找不到,拋出java.lang.NoSuchMethodError異常

接口方法解析

對CONSTANT_InterfaceMethodref_info符號引用的解析

對class_index的解析

對nameAndType_index的解析

虛擬機在類D中加載接口方法符號引用N為方法M的直接引用

虛擬機在N中指定的接口C里尋找方法描述符和N中指定的方法描述符一致的方法M

能找到

class_index指定的類是C接口,就將符號引用N替換為M的直接引用

class_index指定的類C不是接口,拋出java.lang.IncompatibleClassChangeError異常

符號引用驗證,接口方法都是public的所以沒有訪問權限的問題

找不到,在接口C繼承的父接口中按照繼承關系從下向上尋找方法描述符和N中指定的方法描述符一致的方法M

能找到就將符號引用N替換為M的直接引用

找不到,拋出java.lang.NoSuchMethodError異常

初始化 Initialization 初始化就是執行()方法的過程 ()

()是編譯期生成在Class字節碼中的,由編譯器自動收集類中的所有類變量的賦值動作和靜態代碼塊static{…}中的語句合并而成

()是類構造器,與實例構造器()不同,虛擬機保證會在調用前先調用其父類的(),因此不需要顯式調用父類構造器

父類的()對類變量的賦值操作優先于子類的()執行

()并非必需,如果類中無靜態代碼塊或對類變量的賦值操作,那么編譯器可以不生成()方法,Class字節碼中也就沒有()方法

接口無靜態代碼塊但是可以用類變量賦值操作,因此也會生成方法,但是不需要先調用父接口的()方法,只有父接口的類變量使用時才調用()方法初始化父接口

虛擬機會保證多線程環境下類的()方法可以阻塞地調用,即線程T1調用類C的()方法初始化C的過程中,線程T2會阻塞而無法進入類C的()方法中的

使用 Using 卸載 Unloading

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/76792.html

相關文章

  • Java相關

    摘要:本文是作者自己對中線程的狀態線程間協作相關使用的理解與總結,不對之處,望指出,共勉。當中的的數目而不是已占用的位置數大于集合番一文通版集合番一文通版垃圾回收機制講得很透徹,深入淺出。 一小時搞明白自定義注解 Annotation(注解)就是 Java 提供了一種元程序中的元素關聯任何信息和著任何元數據(metadata)的途徑和方法。Annotion(注解) 是一個接口,程序可以通過...

    wangtdgoodluck 評論0 收藏0
  • Java編譯期優化思維導圖

    摘要:本文參考自來自周志明深入理解虛擬機第版,拓展內容建議讀者可以閱讀下這本書。和構造方法一一對應,是同一概念在兩個級別的含義收斂的操作自動保證執行父類的執行語句塊初始化類變量字符串加操作替換為或的操作 showImg(https://segmentfault.com/img/remote/1460000016240419?w=3876&h=3614); 本文參考自來自周志明《深入理解Jav...

    sorra 評論0 收藏0
  • 利用MAT分析JVM內存問題,從入門到精通(二)

    摘要:用于列舉最近分析過的文件常用功能欄,從左到右依次是概覽類直方圖支配樹查詢線程視圖報告相關詳細功能。針對那些占用堆內存超過整個堆內存大小的組件做一系列的分析,例如保留集合潛在的內存浪費問題等其他問題。 上一篇文章MAT入門到精通(一)介紹了MAT的使用場景和基本概念,這篇文章開始介紹MAT的基本功能,后面還有兩篇,一篇是MAT的高級功能,另一篇是MAT實戰案例分析。 三、歡迎頁 使用MA...

    amuqiao 評論0 收藏0
  • Java程序員:不識Jvm真面目,只緣身在增刪查改中

    摘要:編譯器只需面向,生成能理解的代碼或字節碼文件。源文件經編譯器,編譯成字節碼程序,通過將每一條指令翻譯成不同平臺機器碼,通過特定平臺運行。漲見識,字節碼執行過程分析。解決辦法減少默認棧的容量來換取更多的線程支持。 前言 JVM是java的核心和基礎,在java編譯器和os平臺之間的虛擬處理器。它是一種基于下層的操作系統和硬件平臺并利用軟件方法來實現的抽象的計算機,可以在上面執行java的...

    or0fun 評論0 收藏0
  • Java程序員:不識Jvm真面目,只緣身在增刪查改中

    摘要:編譯器只需面向,生成能理解的代碼或字節碼文件。源文件經編譯器,編譯成字節碼程序,通過將每一條指令翻譯成不同平臺機器碼,通過特定平臺運行。漲見識,字節碼執行過程分析。解決辦法減少默認棧的容量來換取更多的線程支持。 前言 JVM是java的核心和基礎,在java編譯器和os平臺之間的虛擬處理器。它是一種基于下層的操作系統和硬件平臺并利用軟件方法來實現的抽象的計算機,可以在上面執行java的...

    ivydom 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<