欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java虛擬機(jī)原理:類加載過(guò)程詳解

 更新時(shí)間:2021年09月09日 08:43:43   作者:韓曙亮  
這篇文章主要介紹了Java中類加載過(guò)程全面解析,具有一定參考價(jià)值,需要的朋友可以了解下,希望能夠給你帶來(lái)幫助

一、Java 類加載過(guò)程

1、字節(jié)碼編譯

編寫好 Java 源碼 Student.java ,

使用 javac 將上述 Java 源碼編譯成 Class 字節(jié)碼文件 Student.class ,

2、加載

加載 : 通過(guò) " 類加載子系統(tǒng) " 將該字節(jié)碼文件 , 加載到 Java 虛擬機(jī)內(nèi)存中 的 方法區(qū) , 然后開(kāi)始執(zhí)行 " 連接 " 操作 ,

類加載時(shí)機(jī) : Java 程序執(zhí)行時(shí) , 并不是一開(kāi)始將所有的字節(jié)碼文件都加載到內(nèi)存中 , 而是用到時(shí)才進(jìn)行加載 ;

  • 通過(guò) new 關(guān)鍵字創(chuàng)建實(shí)例對(duì)象 ;
  • 通過(guò) Class 反射 獲取類 ;
  • 如 : Class.forName(“Xxx”) 獲取類 ;
  • 序列化 / 反序列化 ;
  • 調(diào)用 clone 克隆對(duì)象 ;
  • 有 main 函數(shù)的類 , 會(huì)默認(rèn)自動(dòng)加載 ;
  • 調(diào)用子類 , 如果之前沒(méi)有加載過(guò)父類 , 則 自動(dòng)加載父類 ;

3、連接

連接操作 分為 3 3 3 個(gè)步驟 :

  • 驗(yàn)證 : 對(duì) 字節(jié)碼文件 進(jìn)行校驗(yàn) , 查看該字節(jié)碼格式是否正確 , 如 : 是否以 0xCAFEBABE 開(kāi)頭 , 字段表 , 方發(fā)表 , 屬性表 等格式是否正確 , 進(jìn)行校驗(yàn) ;
  • 校驗(yàn)示例 : 假設(shè)校驗(yàn)如下字節(jié)碼數(shù)據(jù) , 原始數(shù)據(jù)是 【Java 虛擬機(jī)原理】Class 字節(jié)碼二進(jìn)制文件分析 一 ( 字節(jié)碼文件附加信息 | 魔數(shù) | 次版本號(hào) | 主版本號(hào) | 常量池個(gè)數(shù) ) 二、字節(jié)碼文件示例 章節(jié)中的 Java 源碼 , Class 字節(jié)碼 , 字節(jié)碼附加信息 ;

在 Student 構(gòu)造方法中 , 會(huì)調(diào)用到 1: invokespecial #1 父類構(gòu)造方法 , 如果父類有有參的構(gòu)造方法且沒(méi)有聲明無(wú)參構(gòu)造方法 , 子類必須實(shí)現(xiàn)一個(gè)相同參數(shù)的構(gòu)造方法 , 否則就會(huì)報(bào)錯(cuò) ;

Constant pool:
   #1 = Methodref          #4.#17         // java/lang/Object."<init>":()V
{
  public Student();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 1: 0
}
  • 準(zhǔn)備 : 在該階段 , 在 方法區(qū) 中 , 為 類中的靜態(tài)變量 進(jìn)行內(nèi)存劃分 , 并對(duì)這些靜態(tài)變量進(jìn)行 默認(rèn)值賦值 , 一般賦值 0 , null 等默認(rèn)值 ; 即使靜態(tài)變量 static int a = 5 已經(jīng)有了賦值 , 但是在該階段暫時(shí)給該靜態(tài)變量賦值 0 ;
  • 解析 : 將 " 常量池 " 中的 " 符號(hào)引用 " 轉(zhuǎn)為 " 直接引用 " ;

符號(hào)引用 : 下面就是 常量池中的 符號(hào)引用 , 引用是 以符號(hào)的形式表示出來(lái) 的 , 這并不是內(nèi)存中的引用 ; 直接引用 是 將 #1 = Methodref #4.#17 樣式的 符號(hào)引用 轉(zhuǎn)為 指向內(nèi)存地址 的 指針引用 ; JVM 線程棧 的 棧幀 中的 動(dòng)態(tài)鏈接 , 就是持有的一個(gè)指向內(nèi)存的指針 , 該指針指向 棧幀 對(duì)應(yīng)方法 在運(yùn)行時(shí) 常量池中的 內(nèi)存地址 ; 該內(nèi)存地址是在 方法區(qū) 中的 ;

Constant pool:
   #1 = Methodref          #4.#17         // java/lang/Object."<init>":()V
   #2 = Fieldref           #3.#18         // Student.name:Ljava/lang/String;
   #3 = Class              #19            // Student
   #4 = Class              #20            // java/lang/Object

( 分析的數(shù)據(jù)是 【Java 虛擬機(jī)原理】Class 字節(jié)碼二進(jìn)制文件分析 一 ( 字節(jié)碼文件附加信息 | 魔數(shù) | 次版本號(hào) | 主版本號(hào) | 常量池個(gè)數(shù) ) 二、字節(jié)碼文件示例 章節(jié)中的 Java 源碼 , Class 字節(jié)碼 , 字節(jié)碼附加信息 ; )

4、初始化

初始化 : 對(duì)變量進(jìn)行 指定賦值 ;

如 : 有靜態(tài)變量 static int a = 5 , 在 連接 過(guò)程中的 準(zhǔn)備 階段 , 為該變量賦值默認(rèn)值 0 ; 在 初始化 階段 , 為其賦值 代碼 中設(shè)置的真正的 指定初始值 5 ;

總結(jié)

借助下圖理解類加載過(guò)程 ;

在這里插入圖片描述

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的等多內(nèi)容!

相關(guān)文章

  • IDEA之翻譯器的使用Translation

    IDEA之翻譯器的使用Translation

    這篇文章主要介紹了IDEA之翻譯器的使用Translation,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java中比較運(yùn)算符compareTo()、equals()與==的區(qū)別及應(yīng)用總結(jié)

    Java中比較運(yùn)算符compareTo()、equals()與==的區(qū)別及應(yīng)用總結(jié)

    這篇文章主要給大家介紹了關(guān)于Java中比較運(yùn)算符compareTo()、equals()與==的區(qū)別及應(yīng)用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • java LRU(Least Recently Used )詳解及實(shí)例代碼

    java LRU(Least Recently Used )詳解及實(shí)例代碼

    這篇文章主要介紹了java LRU(Least Recently Used )詳解及實(shí)例代碼的相關(guān)資料,Java里面實(shí)現(xiàn)LRU緩存通常有兩種選擇,一種是使用LinkedHashMap,一種是自己設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu),使用鏈表+HashMap,需要的朋友可以參考下
    2016-11-11
  • Spring請(qǐng)求參數(shù)校驗(yàn)功能實(shí)例演示

    Spring請(qǐng)求參數(shù)校驗(yàn)功能實(shí)例演示

    這篇文章主要介紹了Spring請(qǐng)求參數(shù)校驗(yàn)功能實(shí)例演示,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-05-05
  • RocketMQ源碼分析之Broker過(guò)期消息清理機(jī)制

    RocketMQ源碼分析之Broker過(guò)期消息清理機(jī)制

    這篇文章主要為大家介紹了RocketMQ源碼分析之Broker過(guò)期消息清理機(jī)制示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Spring Security使用多種加密方式進(jìn)行密碼校驗(yàn)的代碼示例

    Spring Security使用多種加密方式進(jìn)行密碼校驗(yàn)的代碼示例

    在Web應(yīng)用中,密碼的安全存儲(chǔ)和驗(yàn)證是至關(guān)重要的,本文將通過(guò)一個(gè)具體的代碼示例,介紹和總結(jié)如何在Spring Security中使用多種加密方式進(jìn)行密碼校驗(yàn),文中通過(guò)代碼講解得非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • Mybatis 數(shù)據(jù)庫(kù)連接池的實(shí)現(xiàn)示例

    Mybatis 數(shù)據(jù)庫(kù)連接池的實(shí)現(xiàn)示例

    在Java應(yīng)用程序中,與數(shù)據(jù)庫(kù)的連接是非常昂貴的,因此,當(dāng)我們使用MyBatis進(jìn)行數(shù)據(jù)操作時(shí),需要一個(gè)連接池來(lái)分配并管理這些連接,本文主要介紹了Mybatis 數(shù)據(jù)庫(kù)連接池的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • Maven生成及安裝jar包到本地倉(cāng)庫(kù)的方法

    Maven生成及安裝jar包到本地倉(cāng)庫(kù)的方法

    這篇文章主要介紹了Maven生成及安裝jar包到本地倉(cāng)庫(kù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • SpringBoot+MinIO實(shí)現(xiàn)文件切片極速詳解

    SpringBoot+MinIO實(shí)現(xiàn)文件切片極速詳解

    在現(xiàn)代Web應(yīng)用中,文件上傳是一個(gè)常見(jiàn)的需求,尤其是對(duì)于大文件的上傳,如視頻、音頻或大型文檔,所以本文就來(lái)為大家介紹一下如何使用Spring Boot和MinIO實(shí)現(xiàn)文件切片極速上傳技術(shù)吧
    2023-12-12
  • Java中Arrays.sort()方法的比較器詳解

    Java中Arrays.sort()方法的比較器詳解

    這篇文章主要介紹了Java中Arrays.sort()方法的比較器詳解,Arrays.sort(Object[] a)此方法看似沒(méi)有要求我們實(shí)現(xiàn)比較器,對(duì)于基本數(shù)據(jù)類型,String類型確實(shí)如此,因?yàn)檫@些類型中已經(jīng)自帶了compareTo()方法,需要的朋友可以參考下
    2023-12-12

最新評(píng)論