JVM虛擬機系統性學習-類加載子系統

類加載子系統

類加載的時機

類加載的時機主要有 4 個:

  • 遇到 new、getstatic、putstatic、invokestatic 這四條字節碼指令時,如果對應的類沒有初始化,則要先進行初始化
    • new 關鍵字創建對象時
    • 讀取或設置一個類型的靜態字段時(被 final 修飾、已在編譯器將結果放入常量池的靜態類型字段除外)
    • 調用一個類型的靜態方法的時候
  • 對類進行 反射調用
  • 初始化一個類的時候,如果其父類未初始化,要先初始化其父類
  • 虛擬機啟動時,要先加載主類(程序入口)

類加載過程

類的生命周期如下圖:

在這里插入圖片描述

  • 加載

    1. 通過二進制字節流加載 class 文件
    2. 創建該 class 文件在方法區的運行時數據結構
    3. 創建字節碼對象 Class 對象
  • 鏈接

    1. 驗證:目的在于確保 class 文件的字節流中包含信息符合當前虛擬機要求,保證被加載類的正確性

      主要包括四種驗證:文件格式驗證、元數據驗證、字節碼驗證、符號引用驗證

    2. 準備:為類變量(即靜態變量)分配內存并且設置類變量的默認初始值,即零值。

      這里不包含用 final 修飾的 static 變量,因為 final 修飾的變量在編譯為 class 字節碼文件的時候就會分配了,準備階段會顯式初始化

      這里不會為實例變量分配初始化,類變量會分配在方法區,而實例變量是會隨著對象一起分配到 Java 堆中

    3. 解析:將常量池內的符號引用轉換為直接引用的過程

      事實上,解析操作往往會伴隨著 JVM 在執行完初始化之后再執行

      符號引用就是一組符號來描述所引用的莫表。符號引用的字面量形式明確定義在《java虛擬機規范》的Class 文件格式中。直接引用就是直接指向目標的指針、相對偏移量或一個間接定位到目標的句柄。

      解析動作主要針對類或接口、字段、類方法、接口方法、方法類型等。

  • 初始化

    虛擬機在初始化階段才真正開始執行類中編寫的 Java 程序代碼

    初始化階段就是執行類構造器 <clinit>() 方法的過程,<clinit>() 是 Javac 編譯器自動生成的,該方法由編譯器自動收集類中的所有類變量的賦值動作和靜態語句塊中的語句合并生成的,如果一個類中沒有靜態代碼塊, 也沒有變量賦值的動作,那么編譯器可以不為這個類生成 <clinit>() 方法

類加載器

JVM 中類加載是通過類加載器來完成的

在這里插入圖片描述

  • 啟動類加載器(Bootstrap ClassLoader):
    • 負責加載 JAVA_HOME\lib 目錄中的,或通過 -Xbootclasspath 參數指定路徑中的,且被虛擬機認可(按文件名識別,如rt.jar)的類。由 C++ 實現,不是 ClassLoade r的子類
  • 擴展類加載器(Extension ClassLoader):
    • 負責加載 JAVA_HOME\lib\ext 目錄中的,或通過 java.ext.dirs 系統變量指定路徑中的類庫。
  • 應用程序類加載器(Application ClassLoader):
    • 負責加載用戶路徑 classpath 上的類庫
  • 自定義類加載器(User ClassLoader):
    • 作用:JVM自帶的三個加載器只能加載指定路徑下的類字節碼,如果某些情況下,我們需要加載應用程序之外的類文件,就需要用到自定義類加載器

雙親委派機制

加載類的class文件時,Java虛擬機采用的是雙親委派機制,即把請求交給父類加載器去加載

工作原理:

  1. 如果一個類加載器收到了類加載請求,他并不會自己先去加載,而是把這個請求委托給父類的加載器去執行
  2. 如果父類加載器也存在其父類加載器,則繼續向上委托
  3. 如果父類加載器可以完成類加載任務,就成功返回;如果父類加載器無法完成類加載任務,則會由自家在其嘗試自己去加載

優勢:

  1. 避免類的重復加載
  2. 保護程序安全,防止核心API被篡改(例如,如果我們自定義一個java.lang.String類,然后我們去new String(),我們會發現創建的是jdk自帶的String類,而不是我們自己創建的String類)

為什么還需要破壞雙親委派?

  • 在實際應用中,可能存在 JDK 的基礎類需要調用用戶代碼,例如:SPI 就打破雙親委派模式(打破雙親委派意味著上級委托下級加載器去加載類)
    • 比如,數據庫的驅動,Driver 接口定義在 JDK 中,但是其實現由各個數據庫的服務上提供,由系統類加載器進行加載,此時就需要 啟動類加載器 委托子類加載器去加載 Driver 接口的實現

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

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

相關文章

javaSwing酒店管理系統

一、 使用方法&#xff1a; 在使用前&#xff0c;需要到druid.properties 配置文件中&#xff0c;修改自己對應于自己數據庫的屬性&#xff1b;如用戶名&#xff0c;密碼等 driverClassNamecom.mysql.cj.jdbc.Driver urljdbc:mysql:///hotel?useUnicodetrue&characterEn…

midwayjs從零開始創建項目,連接mikro-orm框架(必須有java的springboot基礎)

前言&#xff1a; 我一直都是用java的springboot開發項目&#xff0c;然后進來新公司之后&#xff0c;公司的后端是用node.js&#xff0c;然后框架用的是 midwayjs &#xff0c;然后網上的資料比較少&#xff0c;在此特地記錄一波 文檔&#xff1a; 1.官方文檔&#xff1a;介紹…

vue 前端crypto-js 如何實現加密解密

npm 安裝 crypto-js 引用 import CryptoJS from "crypto-js"; 或者 import CryptoJS from "crypto-js"; //秘鑰 var aesKey "s10dfc3321ba59abbe123057f20f883e"; //將秘鑰轉換成Utf8字節數組 var key CryptoJS.enc.Utf8.parse(aesKey); /…

Spring Boot 3.0 : 集成flyway數據庫版本控制工具

目錄 Spring Boot 3.0 : 集成flyway數據庫版本控制工具flyway是什么為什么使用flyway主要特性支持的數據庫&#xff1a; flyway如何使用spring boot 集成實現引入依賴配置sql版本控制約定3種版本類型 運行SpringFlyway 8.2.1及以后版本不再支持MySQL&#xff1f; 個人主頁: 【?…

常見web漏洞的流量分析

常見web漏洞的流量分析 文章目錄 常見web漏洞的流量分析工具sql注入的流量分析XSS注入的流量分析文件上傳漏洞流量分析文件包含漏洞流量分析文件讀取漏洞流量分析ssrf流量分析shiro反序列化流量分析jwt流量分析暴力破解流量分析命令執行流量分析反彈shell 工具 攻擊機受害機wi…

Unity DOTS中的baking(一) Baker簡介

Unity DOTS中的baking&#xff08;一&#xff09; Baker簡介 baking是DOTS ECS工作流的一環&#xff0c;大概的意思就是將原先Editor下的GameObject數據&#xff0c;全部轉換為Entity數據的過程。baking是一個不可逆的過程&#xff0c;原先的GameObject在運行時不復存在&#x…

leetcode 股票DP系列 總結篇

121. 買賣股票的最佳時機 你只能選擇 某一天 買入這只股票&#xff0c;并選擇在 未來的某一個不同的日子 賣出該股票。 只能進行一次交易 很簡單&#xff0c;只需邊遍歷邊記錄最小值即可。 class Solution { public:int maxProfit(vector<int>& prices) {int res …

Vue-安裝及安裝vscode相應插件

安裝Vue 安裝nodejs&#xff0c; 地址&#xff1a;https://nodejs.org/en 下載后直接安裝。 安裝后重新打開命令行工具&#xff0c;輸入 node -v PS C:\Users\zcl36> node -v v20.10.0 2. 安裝vue包npm install -g vue/cli安裝之后&#xff0c;你就可以在命令行中訪問 vue…

【git】關于git二三事

文章目錄 前言一、創建版本庫1.通過命令 git init 把這個目錄變成git可以管理的倉庫2.將修改的內容添加到版本庫2.1 git add .2.2 git commit -m "Xxxx"2.3 git status 2.4 git diff readme.txt3.版本回退3.1 git log3.2 git reset --hard HEAD^ 二、理解工作區與暫存…

操作系統內部機制學習

切換線程時需要保存什么 函數需要保存嗎&#xff1f;函數在Flash上&#xff0c;不會被破壞&#xff0c;無需保存。函數執行到了哪里&#xff1f;需要保存嗎&#xff1f;需要保存。全局變量需要保存嗎&#xff1f;全局變量在內存上&#xff0c;無需保存。局部變量需要保存嗎&am…

Leetcode—337.打家劫舍III【中等】

2023每日刷題&#xff08;五十二&#xff09; Leetcode—337.打家劫舍III 算法思想 實現代碼 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(null…

I.MX6ULL_Linux_驅動篇(46)linux LCD驅動

LCD 是很常用的一個外設&#xff0c;在Linux 下LCD 的使用更加廣泛&#xff0c;在搭配 QT 這樣的 GUI 庫下可以制作出非常精美的 UI 界面。本章我們就來學習一下如何在 Linux 下驅動 LCD 屏幕。 Linux 下 LCD 驅動簡析 Framebuffer 設備 先來回顧一下裸機的時候 LCD 驅動是怎…

前端入門:HTML初級指南,網頁的簡單實現!

代碼部分&#xff1a; <!DOCTYPE html> <!-- 上方為DOCTYPE聲明&#xff0c;指定文檔類型為HTML --> <html lang"en"> <!-- html標簽為整個頁面的根元素 --> <head> <!-- title標簽用于定義文檔標題 --> <title>初始HT…

單點登錄方案調研與實現

作用 在一個系統登錄后&#xff0c;其他系統也能共享該登錄狀態&#xff0c;無需重新登錄。 演進 cookie → session → token →單點登錄 Cookie 可以實現瀏覽器和服務器狀態的記錄&#xff0c;但Cookie會出現存儲體積過大和可以在前后端修改的問題 Session 為了解決Co…

【其他數學】結式 resultant

結式 resultant 2023年11月30日 #analysis 文章目錄 結式 resultant介紹Sylvester矩陣應用在消元中的應用傳遞函數的化簡 下鏈 介紹 結式用來計算曲線的交點、消元、找參數化曲線的隱含方程。 為了引出定義&#xff0c;思考如下問題&#xff1a; f ( x ) x 2 ? 5 x 6 g (…

UVM建造測試用例

&#xff08;1&#xff09;加入base_test 在一個實際應用的UVM驗證平臺中&#xff0c;my_env并不是樹根&#xff0c;通常來說&#xff0c;樹根是一個基于uvm_test派生的類。真正的測試用例都是基于base_test派生的一個類。 class base_test extends uvm_test;my_env e…

14-2(C++11)類型推導、類型計算

14-2&#xff08;C11&#xff09;類型推導、類型計算 類型推導auto關鍵字auto類型推斷本質auto與引用 聯用auto關鍵字的使用限制 類型計算類型計算分類與類型推導相比四種類型計算的規則返回值后置 類型推導 auto關鍵字 C98中&#xff0c;auto表示棧變量&#xff0c;通常省略…

Leetcode刷題筆記題解(C++):25. K 個一組翻轉鏈表

思路&#xff1a;利用棧的特性&#xff0c;K個節點壓入棧中依次彈出組成新的鏈表&#xff0c;不夠K個節點則保持不變 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ #include <stack> class Solution { …

在國內,現在月薪1萬是什么水平?

看到網友發帖問&#xff1a;現在月薪1W是什么水平&#xff1f; 在現如今的情況下&#xff0c;似乎月薪過萬這個標準已經成為衡量個人能力的一個標準了&#xff0c;尤其是現在互聯網橫行的時代&#xff0c;好像年入百萬&#xff0c;年入千萬就應該是屬于大眾的平均水平。 我不是…

kafka入門(四):消費者

消費者 (Consumer ) 消費者 訂閱 Kafka 中的主題 (Topic) &#xff0c;并 拉取消息。 消費者群組&#xff08; Consumer Group&#xff09; 每一個消費者都有一個對應的 消費者群組。 一個群組里的消費者訂閱的是同一個主題&#xff0c;每個消費者接收主題的一部分分區的消息…