JVM--類加載器

概念

????????類加載器:只參與加載過程中的字節碼獲取并加載到內存中的部分;java虛擬機提供給應用程序去實現獲取類和接口字節碼數據的一種技術,也就是說java虛擬機是允許程序員寫代碼去獲取字節碼信息

????????類加載是加載的第一步,主要有以下三個步驟:

? ? ? ? ????????(1)通過全類名獲取定義此類的二進制字節流;

? ? ? ? ????????(2)將字節碼文件的靜態存儲結構轉換成方法區運行時的數據結構;

? ? ????????? ? (3)在內存中生成一個該類的class對象,作為方法區的訪問入口;

????????類加載器:

? ? ? ????????? (1)類加載器是負責加載類的一個對象,用于類加載中加載這一步;

? ? ? ????????? (2)每一個java類都有一個引用指向加載他的ClassLoader;

? ? ? ????????? (3)數組類不是通過ClassLoader創建的(數組類沒有對應的二進制字節流),是有jvm直接生成的

其實除了加載類之外,類加載器還可以加載 Java 應用所需的資源如文本、圖像、配置文件、視頻等等文件資源。本文只討論其核心功能:加載類。

類加載器的分類

? ? ? ? (1)jvm底層源碼實現:實現語言和虛擬機底層語言一致,比如Hotspot使用C++。主要目的是保證Java程序運行中基礎類被正確地加載,比如java.lang.String,Java虛擬機需要確保其可靠性。

? ? ? ? (2)java代碼實現:jdk默認提供的類加載器,或者是程序員按照需求定制,所有java實現的類加載類都需要繼承classloader這個抽象類。

jdk8以前:

啟動類加載器

  • 啟動類加載器(Bootstrap ClassLoader)是由Hotspot虛擬機提供的、使用C++編寫的類加載器。

  • 默認加載Java安裝目錄/jre/lib下的類文件,比如rt.jar,tools.jar,resources.jar等。

/*** 啟動程序類加載器案例*/
public class BootstrapClassLoaderDemo {public static void main(String[] args) throws IOException {ClassLoader classLoader = String.class.getClassLoader();System.out.println(classLoader);System.in.read();}
}

? ? ? ?上面的代碼打印出來的類加載器為null,因為啟動類加載器在jdk8中是由c++來編寫的,在java代碼中獲取不安全,所以返回了null。

如果用戶想擴展一些比較基礎的jar包,讓啟動類加載器加載,有兩種途徑:

  • 放入jre/lib下進行擴展。不推薦,盡可能不要去更改JDK安裝目錄中的內容,會出現即時放進去由于文件名不匹配的問題也不會正常地被加載。

  • 使用參數進行擴展。推薦,使用-Xbootclasspath/a:jar包目錄/jar包名 進行擴展,參數中的/a代表新增。

擴展類加載器和應用程序加載器

(1)擴展類加載器和應用程序加載器都是由jdk提供,使用java代碼編寫;

(2)它們的源碼都位于sun.misc.Launcher中,是一個靜態內部類。繼承自URLClassLoader(具備通過目錄或者指定jar包將字節碼文件加載到內存中)

擴展類加載器

? ? ? ?擴展類加載器(Extension Class Loader)是JDK中提供的、使用Java編寫的類加載器。默認加載Java安裝目錄/jre/lib/ext下的類文件。

/*** 擴展類加載器*/
public class ExtClassLoaderDemo {public static void main(String[] args) throws IOException {ClassLoader classLoader = ScriptEnvironment.class.getClassLoader();System.out.println(classLoader);}
}

通過擴展類加載器去加載用戶jar包:

  • 放入/jre/lib/ext下進行擴展。不推薦,盡可能不要去更改JDK安裝目錄中的內容。

  • 使用參數進行擴展使用參數進行擴展。推薦,使用-Djava.ext.dirs=jar包目錄 進行擴展,這種方式會覆蓋掉原始目錄,可以用;(windows):(macos/linux)追加上原始目錄

如下圖中:

????????使用引號將整個地址包裹起來,這樣路徑中即便是有空格也不需要額外處理。路徑中要包含原來ext文件夾,同時在最后加上擴展的路徑。

應用程序加載器

/*** 應用程序類加載器案例*/
public class AppClassLoaderDemo {public static void main(String[] args) throws IOException, InterruptedException {//當前項目中創建的Student類Student student = new Student();ClassLoader classLoader = Student.class.getClassLoader();System.out.println(classLoader);//maven依賴中包含的類ClassLoader classLoader1 = FileUtils.class.getClassLoader();System.out.println(classLoader1);Thread.sleep(1000);System.in.read();}
}

雙親委派機制

? ? ? ? 概念:

????????????????向上檢查是加載過這個類,向下加載;在類加載的過程中,每個類加載器都會先檢查是

????????否已經加載了該類,如果已經加載則直接返回,否則會將加載請求委派給父類加載器。

例子:

????????B類在擴展類加載器加載路徑中,同樣應用程序類加載器接到了加載任務,按照案例1中的方式一層一層向上查找,發現都沒有加載過。那么啟動類加載器會首先嘗試加載。它發現這類不在它的加載目錄中,向下傳遞給擴展類加載器。

如果第二次再接收到加載任務,同樣地向上查找。擴展類加載器發現已經加載過,就可以返回了。

????????作用:

????????????????1.保證類加載的安全性。通過雙親委派機制避免惡意代碼替換JDK中的核心類庫,比如

????????java.lang.String,確保核心類庫的完整性和安全性。

????????????????2.避免重復加載。雙親委派機制可以避免同一個類被多次加載。

打破雙親委派機制:

(1)自定義類加載器;

(2)線程上下文加載器;

(3)osgi框架的類加載器;

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

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

相關文章

ECMAScript 6語法

1.ES6簡介 ECMAScript 6(簡稱ES6)是于2015年6月正式發布的JavaScript語言的標準,正式名為ECMAScript 2015(ES2015)。它的目標是使得JavaScript語言可以用來編寫復雜的大型應用程序,成為企業級開發語言 。 …

聯想Y7000+RTX4060+i7+Ubuntu22.04運行DeepSeek開源多模態大模型Janus-Pro-1B+本地部署

直接上手搓了: conda create -n myenv python3.10 -ygit clone https://github.com/deepseek-ai/Janus.gitcd Januspip install -e .pip install webencodings beautifulsoup4 tinycss2pip install -e .[gradio]pip install pexpect>4.3python demo/app_januspr…

Tez 0.10.1安裝

個人博客地址:Tez 0.10.1安裝 | 一張假鈔的真實世界 具體安裝步驟參照官網安裝手冊即可。此處只對官網手冊進行補充。 從官網下載apache-tez-0.10.1-bin.tar.gz進行安裝未成功,出現下面的異常。最終按照官網源代碼編譯的方式安裝測試成功。 環境 Had…

FastAPI + GraphQL + SQLAlchemy 實現博客系統

本文將詳細介紹如何使用 FastAPI、GraphQL(Strawberry)和 SQLAlchemy 實現一個帶有認證功能的博客系統。 技術棧 FastAPI:高性能的 Python Web 框架Strawberry:Python GraphQL 庫SQLAlchemy:Python ORM 框架JWT&…

微服務入門(go)

微服務入門(go) 和單體服務對比:里面的服務僅僅用于某個特定的業務 一、領域驅動設計(DDD) 基本概念 領域和子域 領域:有范圍的界限(邊界) 子域:劃分的小范圍 核心域…

深入解析 Linux 內核內存管理核心:mm/memory.c

在 Linux 內核的眾多組件中,內存管理模塊是系統性能和穩定性的關鍵。mm/memory.c 文件作為內存管理的核心實現,承載著頁面故障處理、頁面表管理、內存區域映射與取消映射等重要功能。本文將深入探討 mm/memory.c 的設計思想、關鍵機制以及其在內核中的作用,幫助讀者更好地理…

安卓通過網絡獲取位置的方法

一 方法介紹 1. 基本權限設置 首先需要在 AndroidManifest.xml 中添加必要權限&#xff1a; xml <uses-permission android:name"android.permission.INTERNET" /> <uses-permission android:name"android.permission.ACCESS_NETWORK_STATE" /&g…

【B站保姆級視頻教程:Jetson配置YOLOv11環境(二)SSH連接的三種方式】

B站同步視頻教程&#xff1a;https://www.bilibili.com/video/BV1m5wUeyEQD/ 在Jetson設備上配置YOLOv11環境時&#xff0c;SSH連接是實現遠程高效開發與管理的關鍵一環。不同的網絡環境和硬件配置可能會影響SSH連接的方式&#xff0c;本文將結合相關視頻內容&#xff0c;詳細…

視頻拼接,拼接時長版本

目錄 視頻較長&#xff0c;分辨率較大&#xff0c;這個效果很好&#xff0c;不耗用內存 ffmpeg imageio&#xff0c;適合視頻較短 視頻較長&#xff0c;分辨率較大&#xff0c;這個效果很好&#xff0c;不耗用內存 ffmpeg import subprocess import glob import os from nats…

Vue.js 什么是 Composition API?

Vue.js 什么是 Composition API&#xff1f; 今天我們來聊聊 Vue 3 引入的一個重要特性&#xff1a;組合式 API&#xff08;Composition API&#xff09;。如果你曾在開發復雜的 Vue 組件時感到代碼難以維護&#xff0c;那么組合式 API 可能正是你需要的工具。 什么是組合式 …

Selenium配合Cookies實現網頁免登錄

文章目錄 前言1 方案一&#xff1a;使用Chrome用戶數據目錄2 方案二&#xff1a;手動獲取并保存Cookies&#xff0c;后續使用保存的Cookies3 注意事項 前言 在進行使用Selenium進行爬蟲、網頁自動化操作時&#xff0c;登錄往往是一個必須解決的問題&#xff0c;但是Selenium每次…

計算機畢業設計Python+知識圖譜大模型AI醫療問答系統 健康膳食推薦系統 食譜推薦系統 醫療大數據 機器學習 深度學習 人工智能 爬蟲 大數據畢業設計

溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 作者簡介&#xff1a;Java領…

關于el-table翻頁后序號列遞增的組件封裝

需求說明&#xff1a; 項目中經常會用到的一個場景&#xff0c;表格第一列顯示序號&#xff08;1、2、3...&#xff09;&#xff0c;但是在翻頁后要遞增顯示序號&#xff0c;例如10、11、12&#xff08;假設一頁顯示10條數據&#xff09;&#xff0c;針對這種情況&#xff0c;封…

Elasticsearch的索引生命周期管理

目錄 說明零、參考一、ILM的基本概念二、ILM的實踐步驟Elasticsearch ILM策略中的“最小年齡”是如何計算的&#xff1f;如何監控和調整Elasticsearch ILM策略的性能&#xff1f; 1. **監控性能**使用/_cat/thread_pool API基本請求格式請求特定線程池的信息響應內容 2. **調整…

AI大模型開發原理篇-3:詞向量和詞嵌入

簡介 詞向量是用于表示單詞意義的向量&#xff0c; 并且還可以被認為是單詞的特征向量或表示。 將單詞映射到實向量的技術稱為詞嵌入。在實際應用中&#xff0c;詞向量和詞嵌入這兩個重要的NLP術語通常可以互換使用。它們都表示將詞匯表中的單詞映射到固定大小的連續向量空間中…

[內網安全] 內網滲透 - 學習手冊

這是一篇專欄的目錄文檔&#xff0c;方便讀者系統性的學習&#xff0c;筆者后續會持續更新文檔內容。 如果沒有特殊情況的話&#xff0c;大概是一天兩篇的速度。&#xff08;實驗多或者節假日&#xff0c;可能會放緩&#xff09; 筆者也是一邊學習一邊記錄筆記&#xff0c;如果…

【學術會議征稿-第二屆生成式人工智能與信息安全學術會議(GAIIS 2025)】人工智能與信息安全的魅力

重要信息 時間&#xff1a;2025年2月21日-23日 地點&#xff1a;中國杭州 官網&#xff1a;http://www.ic-gaiis.org 簡介 2025年第二屆生成式人工智能與信息安全將于 2025年2月21日-23日在中國杭州舉行。主要圍繞“生成式人工智能與信息安全”的最新研究展開&#xff0c;…

Vscode的AI插件 —— Cline

簡介 vscode的一款AI輔助吃插件&#xff0c;主要用來輔助創建和編輯文件&#xff0c;探索大型項目&#xff0c;使用瀏覽器并執行終端命令&#xff08;需要多個tokens&#xff09;&#xff0c;可以使用模型上下文協議&#xff08;MCP&#xff09;來創建新工具并擴展自己(比較慢…

2024 CVPR Highlight Learning-Feedback

圖像增強 Towards Robust Event-guided Low-Light Image Enhancement: A Large-Scale Real-World Event-Image Dataset and Novel Approach 解決的主要問題是低光照條件下的圖像增強 通過多尺度整體融合分支提取事件和圖像的結構和紋理信息&#xff0c;并引入信噪比&#xff0…

小白一命速通JS中的windowglobal對象

筆者注意到JS中的window對象與global對象經常被混淆&#xff0c;盡管它們在相當一部分使用情況下可以等同&#xff0c;但是本質上仍然存在很多不同&#xff0c;下面是對于兩者的詳細拆解 1. window 對象 定義&#xff1a;window 對象表示 瀏覽器環境中的全局上下文。作用域&am…