038.[轉] JVM啟動過程與類載入

来源:https://www.cnblogs.com/badboyh2o/archive/2019/07/29/11267068.html
-Advertisement-
Play Games

From: https://blog.csdn.net/luanlouis/article/details/40043991 Step 1.根據JVM記憶體配置要求,為JVM申請特定大小的記憶體空間 JVM啟動時按照其配置要求,申請一塊記憶體,並根據JVM規範和實現將記憶體劃分為幾個區域。 所有的類的定義信 ...


From: https://blog.csdn.net/luanlouis/article/details/40043991

Step 1.根據JVM記憶體配置要求,為JVM申請特定大小的記憶體空間

JVM啟動時按照其配置要求,申請一塊記憶體,並根據JVM規範和實現將記憶體劃分為幾個區域。

所有的類的定義信息都會被載入到方法區。

 

 

 

Step 2. 創建一個引導類載入器實例,初步載入系統類到記憶體方法區區域中;

JVM申請好記憶體空間後,JVM會創建一個引導類載入器(Bootstrap Classloader)實例,引導類載入器是使用C++語言實現的。
引導類載入器(Bootstrap Classloader)會讀取{JRE_HOME}/lib下的jar包和配置(JVM虛擬機運行時所需的基本系統級別的類),然後將這些系統類載入到方法區內,如java.lang.String, java.lang.Object等等。 

 

 

Step 3. 創建JVM 啟動器實例 Launcher,並取得類載入器ClassLoader

此時,JVM虛擬機調用已經載入在方法區的類sun.misc.Launcher 的靜態方法 getLauncher(), 獲取 sun.misc.Launcher 實例。

sun.misc.Launcher launcher = sun.misc.Launcher.getLauncher(); //獲取Java啟動器
ClassLoader classLoader = launcher.getClassLoader();          //獲取類載入器ClassLoader用來載入class到記憶體來;
// 返回 AppClassLoader 實例,AppClassLoader將ExtClassLoader作為自己的父載入器。

 

sun.misc.Launcher 使用了單例模式設計,保證一個JVM虛擬機內只有一個sun.misc.Launcher實例。
在Launcher的內部,其定義了兩個類載入器(ClassLoader),分別是sun.misc.Launcher.ExtClassLoader和sun.misc.Launcher.AppClassLoader,
這兩個類載入器分別被稱為拓展類載入器(Extension ClassLoader) 和 應用類載入器(Application ClassLoader).

 

拓展類載入器(Extension Class Loader):

  該載入器是用於載入 java 的拓展類 ,拓展類一般會放在 {JRE_HOME}/lib/ext/ 目錄下,用來提供除了系統類之外的額外功能。拓展類載入器是是整個JVM載入器的Java代碼可以訪問到的類載入器的最頂端,即是超級父載入器,拓展類載入器是沒有父類載入器的。

 

應用類載入器(Applocatoin Class Loader):

  該類載入器是用於載入用戶代碼,是用戶代碼的入口。我經常執行指令 java   xxx.x.xxx.x.x.XClass , 實際上,JVM就是使用的AppClassLoader載入 xxx.x.xxx.x.x.XClass 類的。應用類載入器將拓展類載入器當成自己的父類載入器,當其嘗試載入類的時候,首先嘗試讓其父載入器-拓展類載入器載入;如果拓展類載入器載入成功,則直接返回載入結果Class<T> instance,載入失敗,則會詢問是否引導類載入器已經載入了該類;只有沒有載入的時候,應用類載入器才會嘗試自己載入。由於xxx.x.xxx.x.x.XClass是整個用戶代碼的入口,在Java虛擬機規範中,稱其為 初始類(Initial Class).

 

## 雙親委派模型類載入: --------

 

 

 

Step 4. 使用類載入器ClassLoader載入Main類

通過 launcher.getClassLoader()方法返回AppClassLoader實例,接著就是AppClassLoader載入我們寫的 xxx.xxx.TestMain類的時候了。

當AppClassLoader要載入 xxx.xxx.TestMain.class時,會去查看該類的定義,class文件中有一個叫常量池(Constant Pool)的結構體來存儲該class的常量信息。常量池中有CONSTANT_CLASS_INFO類型的常量,表示該class中聲明瞭要用到那些類。.xxx.xxx.TestMain類要想正常工作,首先要能夠保證這些其內部聲明的類載入成功。所以AppClassLoader要先將這些類載入到記憶體中。

 

 

JVM方法區的類信息區是按照類載入器進行劃分的,每個類載入器會維護自己載入類信息;
某個類載入器在載入相應的類時,會相應地在JVM記憶體堆(Heap)中創建一個對應的Class<T>,用來表示訪問該類信息的入口

 

Step 5. 使用Main類的main方法作為程式入口運行程式

 

 

 

Step 6. 方法執行完畢,JVM銷毀,釋放記憶體

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、log 1.推薦網站:https://www.cnblogs.com/yyds/p/6901864.html 該網站為日誌處理logging模塊簡介 2.logging模塊提供模塊級別的函數記錄日誌,包含四大組件。 3.日誌的級別 (1)不同的用戶關註不同的程式信息 (2)分級:(級別從小到大, ...
  • 消息無序產生的原因 消息隊列,既然是隊列就能保證消息在進入隊列,以及出隊列的時候保證消息的有序性,顯然這是在消息的生產端(Producer),但是往往在生產環境中有多個消息的消費端(Consumer),儘管消費端在拉取消息時是有序的,但各個消息由於網路等方面原因無法保證在各個消費端中處理時有序。 場 ...
  • 1.二維數組 定義:一維數組中的一維數組;數組中的元素,還是數組。 //二維數組初始化 int[][] b=new int[行號(高維下標)][列號(低維下標)]; int[][] b={{1,2,3},{4,5,6}}; //二維數組遍歷 2.在類中定義的變數:成員變數 在類中定義的方法:成員方法 ...
  • Java從1.5開始,增加了靜態導入的語法,靜態導入使用 語句,分為兩種: 1. 導入指定類的某個 靜態 成員變數、方法。 2. 導入指定類的全部的 靜態 成員變數、方法。 下麵是代碼演示: 可以看到,使用 可以省略寫包名;而使用 ,則連類名都可以省略。 ...
  • 題目如下: 題面看著很簡單,但小心有坑。 Java中方法的參數傳遞機制是值傳遞,所以不能簡單的在 方法中使用 、`b 20`,可以參考。。。。。。 示例答案一:使用System.exit()終止虛擬機 示例答案二:重寫列印流的println方法 ...
  • 實例一: <?php $filename = 'test'; //導出文件 header("Content-type: application/vnd.ms-excel; charset=utf-8"); Header("Content-Disposition: attachment; filena ...
  • 在前面的過程中,我們創建了4個project: "服務發現" 我們使用Eureka 作為服務發現組件,學習了 ,`Eureka Client`的使用。 Eureka Server 1. 加依賴 2. 加註解 3. 改配置 使用Sprint Boot 項目三部曲,我們可以快速添加一個新組件,並正常使用 ...
  • 1.引用的概念 2.可變類型和不可變類型 3.哈希 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...