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

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

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

一、Java 類加載過程

1、字節(jié)碼編譯

編寫好 Java 源碼 Student.java ,

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

2、加載

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

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

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

3、連接

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

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

在 Student 構(gòu)造方法中 , 會調(diào)用到 1: invokespecial #1 父類構(gòu)造方法 , 如果父類有有參的構(gòu)造方法且沒有聲明無參構(gòu)造方法 , 子類必須實(shí)現(xiàn)一個(gè)相同參數(shù)的構(gòu)造方法 , 否則就會報(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)存劃分 , 并對這些靜態(tài)變量進(jìn)行 默認(rèn)值賦值 , 一般賦值 0 , null 等默認(rèn)值 ; 即使靜態(tài)變量 static int a = 5 已經(jīng)有了賦值 , 但是在該階段暫時(shí)給該靜態(tài)變量賦值 0 ;
  • 解析 : 將 " 常量池 " 中的 " 符號引用 " 轉(zhuǎn)為 " 直接引用 " ;

符號引用 : 下面就是 常量池中的 符號引用 , 引用是 以符號的形式表示出來 的 , 這并不是內(nèi)存中的引用 ; 直接引用 是 將 #1 = Methodref #4.#17 樣式的 符號引用 轉(zhuǎn)為 指向內(nèi)存地址 的 指針引用 ; JVM 線程棧 的 棧幀 中的 動態(tài)鏈接 , 就是持有的一個(gè)指向內(nèi)存的指針 , 該指針指向 棧幀 對應(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ù) | 次版本號 | 主版本號 | 常量池個(gè)數(shù) ) 二、字節(jié)碼文件示例 章節(jié)中的 Java 源碼 , Class 字節(jié)碼 , 字節(jié)碼附加信息 ; )

4、初始化

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

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

總結(jié)

借助下圖理解類加載過程 ;

在這里插入圖片描述

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

相關(guān)文章

  • Java中的RestTemplate使用詳解

    Java中的RestTemplate使用詳解

    這篇文章主要介紹了Java中的RestTemplate使用詳解,Spring內(nèi)置了RestTemplate作為Http請求的工具類,簡化了很多操作,雖然Spring5推出了WebClient,但是整體感覺還是RestTemplate用起來更簡單方便一些,需要的朋友可以參考下
    2023-10-10
  • java算法入門之有效的括號刪除有序數(shù)組中的重復(fù)項(xiàng)實(shí)現(xiàn)strStr

    java算法入門之有效的括號刪除有序數(shù)組中的重復(fù)項(xiàng)實(shí)現(xiàn)strStr

    大家好,我是哪吒,一個(gè)熱愛編碼的Java工程師,本著"欲速則不達(dá),欲達(dá)則欲速"的學(xué)習(xí)態(tài)度,在程序猿這條不歸路上不斷成長,所謂成長,不過是用時(shí)間慢慢擦亮你的眼睛,少時(shí)看重的,年長后卻視若鴻毛,少時(shí)看輕的,年長后卻視若泰山,成長之路,亦是漸漸放下執(zhí)念,內(nèi)心歸于平靜的旅程
    2021-08-08
  • SpringBoot項(xiàng)目中@RestControllerAdvice全局異常失效問題的解決

    SpringBoot項(xiàng)目中@RestControllerAdvice全局異常失效問題的解決

    @RestController注解是一個(gè)用于定義RESTful Web服務(wù)的控制器的特殊注解,它是@Controller和@ResponseBody注解的結(jié)合體,意味著你不需要在每個(gè)處理請求的方法上都添加@ResponseBody,本文給大家介紹了解決SpringBoot項(xiàng)目中@RestControllerAdvice全局異常失效問題
    2024-11-11
  • Spring lazy-init 懶加載的原理小結(jié)

    Spring lazy-init 懶加載的原理小結(jié)

    lazy-init 是一個(gè)非常重要的屬性,可以優(yōu)化應(yīng)用的啟動時(shí)間,尤其是在處理大量bean或者復(fù)雜依賴關(guān)系時(shí),可以顯著提高應(yīng)用的響應(yīng)速度,本文主要介紹了Spring lazy-init 懶加載的原理小結(jié),感興趣的可以了解一下
    2025-04-04
  • java程序員常見的sql錯(cuò)誤

    java程序員常見的sql錯(cuò)誤

    當(dāng)Java程序員在SQL中要寫個(gè)查詢語句是很簡單的。但在Java里類似的語句卻不容易,因?yàn)槌绦騿T不僅要反復(fù)考慮編程范式,而且也要考慮算法的問題。下面我們來看看這幾個(gè)常見的錯(cuò)誤吧
    2019-06-06
  • java 直接調(diào)用python腳本,并傳遞參數(shù)代碼實(shí)例

    java 直接調(diào)用python腳本,并傳遞參數(shù)代碼實(shí)例

    這篇文章主要介紹了java調(diào)用python腳本傳遞參數(shù)的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • java合并list方法代碼實(shí)例

    java合并list方法代碼實(shí)例

    這篇文章主要介紹了java合并list方法代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • JAVA實(shí)現(xiàn)簡單搶紅包算法(模擬真實(shí)搶紅包)

    JAVA實(shí)現(xiàn)簡單搶紅包算法(模擬真實(shí)搶紅包)

    這篇文章主要介紹了JAVA實(shí)現(xiàn)簡單搶紅包算法(模擬真實(shí)搶紅包)的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12
  • Java字符流和字節(jié)流對文件操作的區(qū)別

    Java字符流和字節(jié)流對文件操作的區(qū)別

    本篇文章主要介紹了Java的IO流分為字符流(Reader,Writer)和字節(jié)流(InputStream,OutputStream),字節(jié)流顧名思義字節(jié)流就是將文件的內(nèi)容讀取到字節(jié)數(shù)組,對初學(xué)者很有用,有需要的朋友可以了解一下。
    2016-10-10
  • java基礎(chǔ)入門之IO流

    java基礎(chǔ)入門之IO流

    流是一種抽象概念,它代表了數(shù)據(jù)的無結(jié)構(gòu)化傳遞。。用來進(jìn)行輸入輸出操作的流就稱為IO流。換句話說,IO流就是以流的方式進(jìn)行輸入輸出
    2021-06-06

最新評論

南京市| 汾西县| 乐山市| 西峡县| 阳城县| 中江县| 大英县| 裕民县| 曲阳县| 巴彦县| 哈尔滨市| 泰宁县| 新乡县| 新乡市| 集安市| 磴口县| 探索| 砚山县| 南丹县| 德州市| 新丰县| SHOW| 中卫市| 富锦市| 信丰县| 百色市| 旬阳县| 喀喇沁旗| 镇雄县| 正镶白旗| 合山市| 宁陕县| 淮北市| 南雄市| 翁源县| 永福县| 芜湖县| 正阳县| 娄底市| 屏东市| 象山县|