8. JVM類裝載的執行過程

1. JVM介紹和運行流程-CSDN博客

2. 什么是程序計數器-CSDN博客

3. java 堆和 JVM 內存結構-CSDN博客

4. 虛擬機棧-CSDN博客

5. JVM 的方法區-CSDN博客

6. JVM直接內存-CSDN博客

7. JVM類加載器與雙親委派模型-CSDN博客

8. JVM類裝載的執行過程-CSDN博客

9. JVM垃圾回收-CSDN博客

10. 垃圾回收的算法-CSDN博客

11. JVM中的分代回收-CSDN博客

12. JVM的垃圾回收器-CSDN博客

13. G1垃圾回收器-CSDN博客

14. 垃圾回收的引用區別-CSDN博客

15. JVM調優的參數設置-CSDN博客

16. JVM調優工具-CSDN博客


1.?JVM類裝載

類裝載(Class Loading)是Java虛擬機(JVM)將類的字節碼文件(.class文件)加載到內存,并對數據進行校驗、轉換解析和初始化,最終形成可以被JVM直接使用的Java類型的過程。

這是Java程序運行的基礎機制,也是實現Java"一次編寫,到處運行"特性的關鍵環節。

類裝載的核心目標是:

  1. 將類的二進制數據讀入內存

  2. 將靜態存儲結構轉換為運行時數據結構

  3. 生成對應的Class對象作為訪問入口

  4. 確保加載的類安全有效


2.?類裝載的生命周期?

類從加載到虛擬機中開始,直到卸載為止,它的整個生命周期包括了:加載、驗證、準備、解析、初始化、使用和卸載這7個階段。

其中,驗證、準備和解析這三個部分統稱為連接(linking)?

1. 加載(Loading)

  • 任務:查找并加載類的二進制數據

  • 過程

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

    • 將字節流代表的靜態存儲結構轉換為方法區的運行時數據結構

    • 在堆中生成一個代表該類的Class對象,作為方法區數據的訪問入口

  • 特點

    • 數組類由JVM直接創建,不通過類加載器

    • 非數組類的加載可以通過內置或自定義的類加載器完成

2. 驗證(Verification)

  • 目的:確保Class文件的字節流符合JVM規范,不會危害虛擬機安全

  • 驗證內容

    • 文件格式驗證(魔數、版本號等)

    • 元數據驗證(語義分析)

    • 字節碼驗證(程序邏輯驗證)

    • 符號引用驗證(常量池中的引用檢查)

3. 準備(Preparation)

  • 任務:為類變量分配內存并設置初始值

  • 特點

    • 只分配類變量(static變量),不包括實例變量

    • 初始值通常是數據類型的零值(如0、0L、null、false等)

    • 對final static常量會直接賦程序指定的值

4. 解析(Resolution)

  • 任務:將常量池中的符號引用替換為直接引用

  • 解析類型

    • 類或接口的解析

    • 字段解析

    • 方法解析

    • 接口方法解析

  • 特點

    • 解析可能在初始化之后才進行(動態綁定)

    • 如果解析失敗會拋出NoSuchMethodError等錯誤

5. 初始化(Initialization)

  • 任務:執行類構造器<clinit>()方法

  • 過程

    • 按順序執行靜態變量賦值和靜態代碼塊

    • 保證父類的<clinit>()先于子類執行

    • 接口的<clinit>()不需要先執行父接口的

  • 觸發條件(以下情況必須立即初始化):

    1. 使用new、getstatic、putstatic或invokestatic指令時

    2. 反射調用類時

    3. 初始化子類發現父類未初始化時

    4. 虛擬機啟動時指定的主類

    5. 使用動態語言支持時相關方法句柄對應的類未初始化

<clinit>()方法詳解

<clinit>()是Java編譯器自動生成的類構造器方法(Class Constructor Method),它負責執行類的初始化工作。這個特殊的方法名稱中的"clinit"是"class initialization"的縮寫。

  1. 自動生成

    • 由編譯器自動收集類中的所有靜態變量賦值語句靜態代碼塊(static{}塊)合并產生

    • 如果沒有靜態變量賦值或靜態代碼塊,編譯器不會生成<clinit>()方法

  2. 執行順序

    • 父類的<clinit>()先于子類執行

    • 靜態變量和靜態代碼塊按源代碼中的出現順序執行

    • 接口的<clinit>()不需要先執行父接口的(除非使用父接口的變量)

  3. 線程安全

    • JVM會保證一個類的<clinit>()方法在多線程環境下被正確地加鎖同步

    • 如果一個線程正在執行<clinit>(),其他線程會阻塞等待

6. 使用(Using)

  • 類完成初始化后進入使用階段

  • 可以創建實例、調用方法、訪問字段等

7. 卸載(Unloading)

  • 條件

    • 類的所有實例都已被回收

    • 加載該類的ClassLoader已被回收

    • 對應的Class對象沒有被引用

  • 特點

    • 由JVM的垃圾回收器完成

    • 卸載通常發生在方法區(元空間)垃圾回收時

    • 由啟動類加載器加載的類通常不會被卸載


3. 總結

類裝載的執行過程?

  • 加載:查找和導入class文件
  • 驗證:保證加載類的準確性
  • 準備:為類變量分配內存并設置類變量初始值
  • 解析:把類中的符號引用轉換為直接引用
  • 初始化:對類的靜態變量,靜態代碼塊執行初始化操作
  • 使用:JVM 開始從入口方法開始執行用戶的程序代碼
  • 卸載:當用戶程序代碼執行完畢后,JM便開始銷毀創建的Class對象。

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

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

相關文章

Linux操作系統之信號:信號的產生

前言&#xff1a;上篇文章我們大致講解了信號的有關概念&#xff0c;為大家引入了信號的知識點。但光知道那些是遠遠不夠的。本篇文章&#xff0c;我將會為大家自己的講解一下信號的產生的五種方式&#xff0c;希望對大家有所幫助。一、鍵盤&#xff08;硬件&#xff09;產生信…

pdf拆分

文章目錄 背景目標實現下載 背景 好不容易下載的1000頁行業報告&#xff0c;領導非要按章節拆分成20份&#xff01;學術論文合集需要按作者拆分投稿&#xff0c;手動分頁到懷疑人生…客戶發來加密合同&#xff0c;要求每5頁生成獨立文檔&#xff0c;格式還不能亂&#xff01; …

vue3使用mermaid生成圖表,并可編輯

效果圖實際代碼<template><div class"mermaid-container" style"z-index: 99999" ref"wrapperRef"><!-- 控制欄 --><div class"control-bar"><div class"control-bar-flex control-bar-tab-wrap"…

tcp/quic 的滑動窗口

一、滑動窗口 rwnd&#xff1a; 接收端窗口&#xff0c;接收方在每次發送ACK確認報文時&#xff0c;會包含一個 rwnd (Receive Window Size) 字段&#xff0c;指明自己當前剩余的接收緩沖區大小&#xff08;即可用窗口&#xff09;&#xff0c;這里是否是socket的接收緩沖區&am…

JVM監控及診斷工具-命令行篇

18.1. 概述 性能診斷是軟件工程師在日常工作中需要經常面對和解決的問題&#xff0c;在用戶體驗至上的今天&#xff0c;解決好應用的性能問題能帶來非常大的收益。 Java 作為最流行的編程語言之一&#xff0c;其應用性能診斷一直受到業界廣泛關注。可能造成 Java 應用出現性能…

Jenkins 版本升級與插件問題深度復盤:從 2.443 到 2.504.3 及功能恢復全解析

前言&#xff1a;問題溯源與升級必要性 在 Jenkins 持續集成體系中&#xff0c;插件生態是其強大功能的核心驅動力。然而&#xff0c;某次例行維護中&#xff0c;團隊對 Jenkins 2.443 環境的插件進行批量升級后&#xff0c;意外觸發連鎖反應 &#xff1a; SSH Server 插件功能…

Ribbon實戰

一、前置知識 1.1 負載均衡定義 負載均衡指的是將網絡請求通過不同的算法分配到不同的服務器上的技術&#xff0c;從而提升系統的性能。 1.2 負載均衡工具 負載均衡工具可以分分為客戶端負載均衡工具和服務端負載均衡工具&#xff0c;它們的區別如下。 表1-1 負載均衡工具…

cs285學習筆記(一):課程總覽

根據 Fall 2023 學期的官方課程日程&#xff0c;這里是 CS?285 全課程的 Lecture 大綱及內容摘要&#xff0c;詳細對應周次和主題&#xff0c;方便你快速定位每節課要點、相關作業與視頻資源 &#x1f3af; 官方課程地址 YouTobe 視頻地址 blibli視頻(帶中文字幕) &#x…

OkHttp SSE 完整總結(最終版)

1. SSE 基礎概念 什么是 SSE&#xff1f; SSE&#xff08;Server-Sent Events&#xff09;是一種 Web 標準&#xff0c;允許服務器向客戶端推送實時數據。 核心特點 單向通信&#xff1a;服務器 → 客戶端 基于 HTTP 協議&#xff1a;使用 GET 請求 長連接&#xff1a;連…

聚寬sql數據庫傳遞

自建數據庫從聚寬到Q-MT自動化交易實戰 從接觸聚寬以來一直都是手動跟單&#xff0c;在網上看到許多大佬的自動交易文章&#xff0c;心里也不禁十分癢癢。百說不如一練&#xff0c;千講不如實干。經過一番努力&#xff0c;終于成功實盤了&#xff0c;效果還可以&#xff0c;幾…

es里為什么node和shard不是一對一的關系

提問&#xff1a; 既然多個shard會被分配到同一個node上&#xff0c;那么為什么不把多個shard合并成一個然后存在當前node上呢&#xff0c;簡而言之也就是讓node和shard形成一對一的關系呢 &#xff1f;非常好的問題&#xff0c;這正是理解Elasticsearch分片&#xff08;shard…

淺談npm,cnpm,pnpm,npx,nvm,yarn之間的區別

首先做一個基本的分類 名稱描述npm,cnpm,yarn,pnpm都是Javascript包管理器nvm是Node.js版本控制器npx命令行工具 I.npm,cnpm,yarn,pnpm npm (Node Package Manager) npm是Node.js默認的包管理器&#xff0c;隨Node.js的安裝會一起安裝。使用npm可以安裝&#xff0c;發布&…

滑動窗口-76.最小覆蓋子串-力扣(LeetCode)

一、題目解析1.不符合要求則返回空串("")2.子串中重復字符的數量要不少于t中該字符的數量二、算法原理解法1&#xff1a;暴力枚舉哈希表這里的暴力枚舉也可以優化&#xff0c;即在包含t中元素處枚舉&#xff0c;如在A、B和C處開始枚舉&#xff0c;減少不必要的枚舉 解…

從零構建搜索引擎 build demo search engine from scratch

從零構建搜索引擎 build demo search engine from scratch 我們每天都會使用搜索引擎&#xff1a;打開google等搜索引擎&#xff0c;輸入關鍵詞&#xff0c;檢索出結果&#xff0c;這是一次搜索&#xff1b;當打開歷史記錄旁邊的&#x1f50d;按鈕&#xff0c;輸入關鍵詞&#…

pytorch小記(二十九):深入解析 PyTorch 中的 `torch.clip`(及其別名 `torch.clamp`)

pytorch小記&#xff08;二十九&#xff09;&#xff1a;深入解析 PyTorch 中的 torch.clip&#xff08;及其別名 torch.clamp&#xff09;深入解析 PyTorch 中的 torch.clip&#xff08;及其別名 torch.clamp&#xff09;一、函數簽名二、簡單示例三、廣播支持四、與 Autograd…

快速分頁wpf

/*沒有在xaml設置上下文window.context是因為 命名空間一直對應不上 所以在xaml.cs 里面綁定*/ <Window x:Class"DataGrid.views.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft…

如何徹底禁用 Chrome 自動更新

如何徹底禁用 Chrome 自動更新 隨著谷歌將 Chrome 瀏覽器版本升級至 138&#xff0c;它即將徹底拋棄對 Manifest V2 擴展的支持。許多用戶希望將瀏覽器版本鎖定在 138&#xff0c;以繼續使用 uBlock Origin、Tampermonkey 等常用擴展。 本文總結了四種有效方法&#xff0c;幫助…

流批一體的“奧卡姆剃刀”:Apache Cloudberry 增量物化視圖應用解析

引言&#xff1a;流批一體&#xff0c;理想與現實的鴻溝 在數據驅動的今天&#xff0c;“實時”二字仿佛擁有魔力&#xff0c;驅使著無數企業投身于流批一體架構的建設浪潮中。我們渴望實時洞察業務變化&#xff0c;實時響應用戶需求。以 Apache Flink 為代表的流處理引擎&…

C# 入門教程(三):詳解字段、屬性、索引器及各類參數與擴展方法

文章目錄一、字段、屬性、索引器、常量1.字段2.屬性2.1 什么是屬性2.2 屬性的聲明2.3 屬性與字段的關系3 索引器4. 常量二、傳值 輸出 引用 數組 具名 可選參數&#xff0c;擴展方法2.1 傳值參數2.1.1 值類型 傳參2.1.2 引用類型 傳參2.2 引用參數2.2.1 引用參數-值類型 傳參2.…

《美術教育研究》是什么級別的期刊?是正規期刊嗎?能評職稱嗎?

?問題解答&#xff1a;問&#xff1a;《美術教育研究》是不是核心期刊&#xff1f;答&#xff1a;不是&#xff0c;是知網收錄的第一批認定學術期刊。問&#xff1a;《美術教育研究》級別&#xff1f;答&#xff1a;省級。主管單位&#xff1a; 安徽出版集團有限責任公司 主辦…