JVM類加載過程

在Java虛擬機規范中,把描述類的數據從class文件加載到內存,并對數據進行校驗、轉換解析和初始化,最終形成可以被虛擬機直接使用的java.lang.Class對象,這個過程被稱作類加載過程。一個類在整個虛擬機周期內會經歷如下圖的階段,從加載到初始化就是類加載過程。
在這里插入圖片描述

加載階段

這里的加載是整個類加載過程中的一個階段,不等同于類加載,在加載階段,會做以下三件事:

  1. 通過類的全限定名讀取類的二進制流。
  2. 將字節流所代表的的靜態存儲結構轉化為方法區的運行時數據結構。
  3. 在虛擬機內存的堆區中生成一個代表這個類的java.lang.Class對象,用于方法區這個類的各種數據的訪問入口(如下圖所示)。
    在這里插入圖片描述
    由于Java虛擬機對加載class文件的來源并未做限制,所以出現了以下的class文件加載方式:
  4. 從本地系統中直接獲取
  5. 從網絡中獲取,如:Web Applet
  6. 從zip壓縮包中獲取,將zip壓縮后綴改為.jar,也可以直接使用
  7. 動態代理生成
  8. 由其他文件生成,如JSP
  9. 從數據庫中獲取
  10. 加密文件中獲取,如Class文件加密防反編譯

鏈接階段

在加載階段完成之后,class文件的類信息數據就會存儲在方法區,同時在Java虛擬機堆區生成一個對應類的Class對象,這個Class對象會在之后變成程序訪問方法區中的類數據的外部接口。鏈接階段并不是一定等到加載階段完成后才開始,鏈接的部分動作會跟隨加載階段進行(如部分字節碼文件格式的驗證動作)。

  1. 驗證
    驗證是鏈接的第一個階段,這個過程中,JVM會去校驗class文件格式及class文件二進制流中所包含的信息是不是符合虛擬機規范的約束。包含四部分內容的驗證:
  • 文件格式驗證:驗證class文件魔數值是否為0xCAFEBABE、主次版本號、常量類型等。
  • 元數據驗證:對類的元數據信息進行語義校驗。
  • 字節碼驗證:通過數據流分析和控制流分析、確定程序語義是合法的、符合邏輯的。
  • 符號引用驗證:驗證發生在解析階段,主要對常量池中的各種符號引用進行匹配性校驗。
  1. 準備
    在這里插入圖片描述
    在準備階段,會給類變量(被static修飾的靜態變量)分配內存并且初始化類變量初值(零值),如上表就是各種類型對應的零值,從概念上講,這些變量所使用的內存都應當在方法區中進行分配,但是方法區本身是一個邏輯上的區域,在JDK7及之前,HotSpot使用永久代來實現方法區時,實現是完全符合這種邏輯概念的;而在JDK8及之后,類變量則會隨著Class對象一起存放在Java堆中,這時候"類變量在方法區" 就完全是一種對邏輯概念的表述;
    注意:
  2. final修飾的類變量(常量)并不會進行準備階段進行賦初值的操作,在編譯的時候會給屬性添加ConstantValue屬性,準備階段直接完成賦值。
  3. 正因為類變量擁有賦初值這一操作,所以只聲明類變量,不進行賦值動作,程序也能正常執行,如下代碼可以驗證各種類型的初值。
public class ClassLoaderPrepare {public static int i;public static void main(String[] args) {System.out.println(i);}
}
  1. 解析
    解析階段的作用是將符號引用轉為直接引用。每個class文件都對應一個常量池,常量池中存儲了類、接口、字段、方法等各類信息,符號引用是一組符號指向常量池中被引用的目標,要在虛擬機中定位到目標,就需要指向對應目標的內存地址,這種引用就是直接引用。

初始化階段

在鏈接階段的準備階段中,已經為類變量分配了內存地址和初值,在初始化階段就會對這些類變量進行賦值操作。如果一個類含有靜態變量或者靜態代碼塊,java虛擬機就會在編譯為其生成一個方法(類初始化方法),其內容由編譯期間虛擬機收集到的類變量的賦值動作和靜態代碼塊合并而來。
注意:

  1. 方法中,指令的順序是依據指令對應的語句在源文件中出現的順序,靜態代碼塊中只能訪問定義在它之前的變量,如下代碼就會提示非法的前向引用。
  2. 在繼承關系中,父類的方法先于子類執行。
  3. 在多線程同時初始化一個類時,只有其中一個線程能夠執行
public class ClassLoaderCLInit {static {i = 10;System.out.println(i);}public static int i;
}

使用

銷毀

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21246.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21246.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21246.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++編程法則365天一天一條(323)main函數執行之前和之后的動作

在C和C程序中,main 函數之前和之后執行的函數是由編譯器、鏈接器和運行時環境共同決定的。以下是一些通常會在這些階段執行的關鍵函數: 在 main 函數之前執行的函數 啟動代碼(Start-up Code): 這是由編譯器提供的一段代碼&#…

DIYP對接駱駝后臺IPTV管理,退出菜單中顯示用戶名已經網絡信息,MAC,剩余天數,套餐名稱等

演示:https://url03.ctfile.com/f/1779803-1042599473-4dc000?p8976 (訪問密碼: 8976) 后臺加上EPG,增加一些播放源的動態端口替換。 前臺app上,退出菜單中顯示用戶名已經網絡信息,MAC,剩余天數,套餐名稱…

Python知識點17---包

提前說一點:如果你是專注于Python開發,那么本系列知識點只是帶你入個門再詳細的開發點就要去看其他資料了,而如果你和作者一樣只是操作其他技術的Python API那就足夠了。 Python的包,你可以把它看成是一個大的模塊,它…

JAVA基礎|多線程

什么是線程? 線程(Thread)是一個程序內部的一條執行流程。 多線程是什么? 多線程是指從軟硬件上實現的多條執行流程的技術(多條線程由CPU負責調度執行) 一. 如何在程序中創建出多條線程? Ja…

新接手業務的線上Bug特別多怎么辦?

文章目錄 接手:保證質量順利過渡緊急質量審計臨時增加測試頻次灰度發布加強監控與預警建立快速反饋機制 打補丁:針對性解決質量問題Bug 分析與分類測試策略優化環境一致性 搞基建:全流程質量控制需求分析與評審設計階段的評審與驗證代碼質量控…

Windows10系統中安裝與配置PyTorch(無GPU版本)

文章目錄 1. 什么是PyTorch2. PyTorch的安裝與配置(無GPU)2.1 創建環境2.2 安裝pytorch庫(無GPU)2.3 驗證安裝結果 1. 什么是PyTorch PyTorch 是一種用于構建深度學習模型且功能完備的開源框架,通常用于處理圖像識別和…

JVM學習-自定義類加載器

為什么要自定義類加載器 隔離加載類 在某些框架內進行中間件與應用的模塊隔離,把類加載到不同的環境,如Tomcat這類Web應用服務器,內部自定義了好幾種類加載器,用于隔離同一個Web應用服務器上的不同應用程序 修改類加載的方式 …

OpenCV 的幾種查找圖像中輪廓邊緣的方法

原始圖片: 1、Sobel() Sobel 算子結合了高斯平滑和微分,用于計算圖像的梯度,從而突出顯示邊緣。 import cv2# 讀取圖像 image cv2.imread(image.png, cv2.IMREAD_GRAYSCALE)# 使用 Sobel 算子查找水平和垂直邊緣 sobel_x cv2.Sobel(image…

建筑企業有閑置資質怎么辦?

如果建筑企業擁有閑置資質,可以考慮以下幾種方式來充分利用這些資質: 1. 租賃或轉讓資質: 將閑置的建筑資質租賃給其他企業或個人使用,或者通過轉讓的方式將資質出售給有需要的企業或個人。 2. 提供咨詢服務: 利用建…

git分布式版本控制系統(四)

目前世界上最先進的分布式版本控制系統 官方網址:https://git-scm.com 學習目標: 1 了解 git 前世今生 2 掌握 git 基礎概念、基礎操作 3 各種 git 問題處理 4 互聯網常用 gitflow(工作流程規范) 5 git 代碼提交規范 6 git 分支管理及命名規范 常見問…

OneForall工具的下載安裝和使用(Windows和Linux)

目錄 OneForall的介紹 OneForall的下載 OneForall的安裝 安裝要求 安裝步驟(git 版) 安裝(kali) OneForall的使用命令 在Windows 在Linux(kali) OneForall的結果說明 免責聲明 本文所提供的文字和…

車輛前向碰撞預警系統性能要求和測試規程

前言 本文整理《GB/T 33577-2017 智能運輸系統-車輛前向碰撞預警系統性能要求和測試規程》國標文件關鍵信息,FCW系統性能和測試右給深層次的認識。 術語和定義 車輛前向碰撞預警系統 forward vehicle collision warning system自車 subject vehicle(SV)目標車輛 target ve…

【Linux】查找和壓縮

一、文件查找 1、命令查找 which 2、文件查找、依賴數據庫 locate 3、文件查找 find 語法:find [path] [options] [expression] [action] ①按文件名 -name按名 -iname可不區分大小寫 ②按文件大小 5M:5M以上文件 5M:5M文件 -…

高中數學:解三角形相關公式總結及用法總結

一、正弦定理 二、余弦定理 三、三角形面積公式 由正弦定理,可以推出三角形的面積公式: S*ab*sinC S*ac*sinB S*bc*sinA 四、使用方法總結 五、練習 例題1 解析 對條件等式進行變形,結合余弦定理,求出∠A的度數,從而…

【面經分享-CPP篇】[建議收藏!!] C++基礎20問-01

🍭 大家好這里是清隆學長 ,一枚熱愛算法的程序員 ? 本系列打算持續跟新c面試基礎 👏 感謝大家的訂閱? 和 喜歡💗 文章目錄 1.題目:解釋C中的RAII機制。2.題目:解釋C中的智能指針及其類型。3.題目&#xf…

從內存到sql的upsert

業務的upsert ? 在寫業務時,大家一開始都會以順序流程的方式開始著手寫代碼,CR時再看代碼,會有不一樣的感覺。 1. 需求描述 ? 現有一張數據庫表,表字段結構如下: 字段名稱類型描述uuidstring數據的唯一鍵datastrin…

代碼隨想錄算法訓練營第四十六天|KM52. 攜帶研究材料、518. 零錢兌換 II、377. 組合總和 Ⅳ

代碼隨想錄算法訓練營第四十六天 KM52. 攜帶研究材料 題目鏈接:KM52. 攜帶研究材料 確定dp數組以及下標的含義:j的含義是當前背包的最大容量,dp[j]背包內物品的總價值確定遞推公式:背包最大容量固定為j,每個循環嘗試…

Nginx01-HTTP簡介與Nginx簡介(安裝、命令介紹、目錄介紹、配置文件介紹)

目錄 HTTP簡介HTTP原理查看訪問網站的詳細流程curl -vwget --debug 查看網站訪問量HTTP協議版本HTTP協議交互HTTP 請求請求報文起始行請求頭 HTTP響應響應報文起始行響應頭 Nginx常見的Web服務常見網站服務 安裝NginxNginx目錄結構Nginx啟動管理Nginx常用命令 Nginx配置文件主配…

國內外主流大模型語言技術大比拼

國內外主流大模型語言技術對比 2024 自2017年起,美國深度布局人工智能,全面融入經濟、文化與社會。至2023年,中國憑借自研技術平臺嶄露頭角,ChatGPT及其技術成國家戰略焦點,引領未來科技浪潮。中美競逐,人工…

Milvus向量數據庫:開啟向量搜索新紀元

Milvus向量數據庫:開啟向量搜索新紀元 隨著人工智能和機器學習技術的飛速發展,向量數據在各個領域的應用越來越廣泛,如推薦系統、自然語言處理、計算機視覺等。在這樣的背景下,如何高效地存儲、查詢和管理向量數據成為了一個重要的…