JVM故障處理與類加載全解析

1、故障處理工具

基礎故障處理工具
jps:
可以列出正在運行的虛擬機進程,并顯示虛擬機執行主類(Main Class,main()函數所在的類)名稱以及這些進程的本地虛擬機唯一ID(LVMID,Local Virtual Machine Identifier)
jstat:
jstat(JVM Statistics Monitoring Tool)是用于監視虛擬機各種運行狀態信息的命令行工具
jinfo:
jinfo(Configuration Info for Java)的作用是實時查看和調整虛擬機各項參數,windos使用該命令會受到限制
jmap:
jmap(Memory Map for Java)命令用于生成堆轉儲快照,jinfo命令一樣,jmap有部分功能在Windows平臺下是受限的
jhat:
JDK提供jhat(JVM Heap Analysis Tool)命令與jmap搭配使用,來分析jmap生成的堆轉儲快照。可以通過HTTP界面可視化
.java文件不可以直接被jhat分析我們需要先調用以下代碼,轉換文件格式
jstack:
jstack(Stack Trace for Java)命令用于生成虛擬機當前時刻的線程快照(一般稱為threaddump或者javacore文件)。

2、類文件結構

class文件是一組以8個字節為基礎單位的二進制流,各個數據項目嚴格按照順序緊湊的排列在文件之中,中間沒有添加任何分隔符。
魔數和版本號
????????Class文件的魔數是確定這個文件是否為一個能被虛擬機接收的Class文件——取值為0xCAFEBABE
????????版本號分為主版本號和次版本號,高版本可以向下兼容低版本。虛擬機完全拒絕執行超過其版本號的Class文件
常量池
????????常量池存儲:字面量和符號引用。常量池的每一個常量都是一個表
訪問標志
????????這個標志用于識別一些類或接口層次的訪問信息。
類索引、父類索引、接口索引集合
????????class文件中有這三項數據來確定該類型的繼承關系
字段表集合
????????用于描述接口或類中聲明的變量
方法表集合
屬性表集合

3、類加載

類加載:JVM把類的數據從Class文件加載到內容,并對數據進行校驗、轉換解析和初始化,最終形成可以被虛擬機直接使用的Java類型
類加載的時機
類的生命周期可以被定義為以下七個過程
加載——驗證——準備——初始化——卸載順序是確定的
有且僅有六種情況需要進行初始化(主動引用
  1. 遇到 new、getstatic、putstatic 或 invokestatic 這四條字節碼指令時
  • 典型場景:使用 new 關鍵字實例化對象、讀取或設置一個類的靜態字段(被 final 修飾、已在編譯期把結果放入常量池的靜態字段除外)、調用一個類的靜態方法
  1. 使用 java.lang.reflect 包的方法對類進行反射調用的時候
  2. 當初始化一個類的時候,如果發現其父類還沒有進行過初始化,則需要先觸發其父類的初始化
  3. 當虛擬機啟動時,用戶需要指定一個要執行的主類(包含 main () 方法的那個類),虛擬機會先初始化這個主類
  4. 當使用 JDK 7 新加入的動態語言支持時
  5. 當一個接口中定義了 JDK 8 新加入的默認方法(被 default 關鍵字修飾的接口方法)時,如果有這個接口的實現類發生了初始化,該接口要在其之前被初始化
除此之外,所有引用類型的方式都不會觸發初始化,稱為被動引用。
給個例子
package org.fenixsoft.classloading;
/*** 被動使用類字段演示一:* 通過子類引用父類的靜態字段,不會導致子類初始化**/
public class SuperClass {static {System.out.println("SuperClass init!");}public static int value = 123;
}
public class SubClass extends SuperClass {static {System.out.println("SubClass init!");}}
/*** 非主動使用類字段演示**/
public class NotInitialization {public static void main(String[] args) {System.out.println(SubClass.value);}
}
????????上述代碼運行之后,只會輸出“SuperClass init!”,而不會輸出“SubClass init!”。對于靜態字段,只有直接定義這個字段的類才會被初始化,因此通過其子類來引用父類中定義的靜態字段,只會觸發父類的初始化而不會觸發子類的初始化。
類的加載過程
加載、驗證、準備、解析、初始化
加載過程
????????通過類的全限定名獲得字節流
????????將字節流(靜態)轉換為方法區的運行時數據結構
????????在內存生成該對象作為方法區這個類的訪問接口
驗證
????????目的是確保Class文件的字節流中包含的信息符合《Java虛擬機規范》的全部約束要求。保證這些能正確地存儲到方法區。
文件格式驗證:保證輸入的字節流能正確地解析并存儲于方法區之內
元數據驗證
字節碼驗證
符號引用驗證
準備
只準備空間,這里的 初始值默認賦該類型的零值,若類變量被 final 修飾且為基本類型或字符串,則會在準備階段初始化為指定值,靜態常量直接賦值
解析
把符號引用直接轉為直接引用的過程
初始化
把準備階段賦的0值,轉換為實際數據
使用
卸載
類加載器
????????任意一個類,都必須由加載它的類加載器和這個類本身一起共同確立其在Java虛擬機中的唯一性,換句話說只有同一個類加載器加載出來的兩個相同的類才相等。
類加載器分類
  • 啟動類加載器Bootstrap ClassLoader:加載固定路徑下,固定JRE/lib下的核心類庫(如rt.jar)
  • 擴展類加載器Extension ClassLoader:加載JRE/lib/ext下的擴展類,是對Java語言的擴展
  • 應用程序類加載器Application ClassLoader:加載用戶類路徑(ClassPath)上的類
  • 自定義ClassLoader:用戶自定義的類加載器
雙親委派模型
雙親委派
雙親委派模型的工作流程
????????如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器去完成,每一個層次的類加載器都是如此,因此所有的加載請求最終都應該傳送到最頂層的啟動類加載器中,只有當父加載器反饋自己無法完成這個加載請求(它的搜索范圍中沒有找到所需的類)時,子加載器才會嘗試自己去完成加載
  • 類加載請求先委托父加載器處理
  • 父加載器無法完成時子加載器才嘗試加載
優點:
  • 避免重復加載
  • 防止核心API被篡改
破壞雙親委派
破壞雙親委派,指的是類加載器在某些場景下不遵循 “先委托父類加載器” 的規則。例如:
Tomcat 的類加載器設計
????????Tomcat 需要支持多個 Web 應用隔離(同一類在不同應用中可加載不同版本),因此其類加載器結構也破壞了雙親委派。
Tomcat 的類加載順序(以 WebAppClassLoader 為例):
  1. 先加載 Web 應用的/WEB-INF/classes目錄下的類;
  2. 再加載/WEB-INF/lib目錄下的 JAR 包;
  3. 最后才委托父類加載器(Common ClassLoader)加載。

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

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

相關文章

Python 第三方庫的安裝與卸載全指南

在 Python 開發中,第三方庫是提升效率的重要工具。無論是數據分析、Web 開發還是人工智能領域,都離不開豐富的第三方資源。本文將詳細介紹 Python 第三方庫的安裝與卸載方法,幫助開發者輕松管理依賴環境。 一、第三方庫安裝方法 1. pip 工具…

RabbitMQ 高級特性之消息分發

1. 為什么要消息分發當 broker 擁有多個消費者時,就會將消息分發給不同的消費者,消費者之間的消息不會重復,RabbitMQ 默認的消息分發機制是輪詢,但會無論消費者是否發送了 ack,broker 都會繼續發送消息至消費者&#x…

Linux操作系統從入門到實戰:怎么查看,刪除,更新本地的軟件鏡像源

Linux操作系統從入門到實戰:怎么查看,刪除,更新本地的軟件鏡像源前言一、 查看當前鏡像源二、刪除當前鏡像源三、更新鏡像源四、驗證前言 我的Linux版本是CentOS 9 stream本篇博客我們來講解怎么查看,刪除,更新國內本…

兩臺電腦通過網線直連形成局域網,共享一臺wifi網絡實現上網

文章目錄一、背景二、實現方式1、電腦A(主)2、電腦B3、防火墻4、驗證三、踩坑1、有時候B上不了網一、背景 兩臺windows電腦A和B,想通過**微軟無界鼠標(Mouse without Borders)**實現一套鍵盤鼠標控制兩臺電腦&#xf…

Java Reference類及其實現類深度解析:原理、源碼與性能優化實踐

1. 引言:Java引用機制的核心地位在JVM內存管理體系中,Java的四種引用類型(強、軟、弱、虛)構成了一個精巧的內存控制工具箱。它們不僅決定了對象的生命周期,還為緩存設計、資源釋放和內存泄漏排查提供了基礎設施支持。…

華為云對碳管理系統的全生命周期數據處理流程

碳管理系統的全生命周期數據處理流程包含完整的數據采集、處理、治理、分析和應用的流程架構,可以理解為是一個核心是圍繞數據的“采集-傳輸-處理-存儲-治理-分析-應用”鏈路展開。以下是對每個階段的解釋,以及它們與數據模型、算法等的關系: 1. 設備接入(IoTDA) 功能: …

大模型安全風險與防護產品綜述 —— 以 Otter LLM Guard 為例

大模型安全風險與防護產品綜述 —— 以 Otter LLM Guard 為例 一、背景與安全風險 近年來,隨著大規模預訓練語言模型(LLM)的廣泛應用,人工智能已成為推動文檔處理、代碼輔助、內容審核等多領域創新的重要技術。然而,…

1.2.2 計算機網絡分層結構(下)

繼續來看計算機網絡的分層結構,在之前的學習中,我們介紹了計算機網絡的分層結構,以及各層之間的關系。我們把工作在某一層的軟件和硬件模塊稱為這一層的實體,為了完成這一層的某些功能,同一層的實體和實體之間需要遵循…

實訓八——路由器與交換機與網線

補充——基本功能路由器:用于不同邏輯網段通信的交換機:用于相同邏輯網段通信的1.網段邏輯網段(IP地址網段):IP地址的前三組數字代表不同的邏輯網段(有限條件下);IP地址的后一組數字…

C++——構造函數的補充:初始化列表

C中,構造函數為成員變量賦值的方法有兩種:構造函數體賦值和初始化列表。構造函數體賦值是在構造函數里面為成員變量賦值,如:class Data { public://構造函數體賦值Data(int year,int month,int day){_year year;_month month;_d…

代碼隨想錄|圖論|12島嶼周長

leetcode:106. 島嶼的周長 題目 題目描述 給定一個由 1(陸地)和 0(水)組成的矩陣,島嶼是被水包圍,并且通過水平方向或垂直方向上相鄰的陸地連接而成的。 你可以假設矩陣外均被水包圍。在矩陣中恰好擁有…

開發制作模仿參考抄別人的小程序系統

很多老板看見別人公司的小程序系統界面好看,功能強大,使用人數多。就想要抄襲模仿參考別人家的小程序系統。想要了解一下有沒有侵權風險,以及怎么開發制作開發制作模仿參考抄別人的小程序系統。首先回答第一個問題,只要你的小程序…

c語言中的數組IV

數組的集成初始化 集成初始化的定位 數組的大小 數組的賦值 不能直接將一個數組a賦值給數組b&#xff0c;只能通過遍歷來實現 遍歷數組 示例——檢索元素在數組中的位置#include <stdio.h> int search(int key,int a[],int length); int main(void){int a[] {2,4,6,7,1,…

LDO選型

目錄 一、最大輸出電流 二、最大輸入電壓 三、最大功率&#xff1a;Pmax 四、負載動態調整率 五、輸入電源紋波抑制比&#xff1a;PSRR 一、最大輸出電流 參考TI LM1117IMPX-3.3/NOPB數據手冊 由于LDO轉換效率很低&#xff0c;LDO的標稱最大電流 ≥ 實際最大負載電流 1…

飛算JavaAI:重構Java開發的“人機協同”新范式

目錄一、從需求到架構&#xff1a;AI深度參與開發“頂層設計”1.1 需求結構化&#xff1a;自然語言到技術要素的準確轉換1.2 架構方案生成&#xff1a;基于最佳實踐的動態匹配二、編碼全流程&#xff1a;從“手寫代碼”到“人機協同創作”2.1 復雜業務邏輯生成&#xff1a;以“…

解決SQL Server SQL語句性能問題(9)——SQL語句改寫(7)

9.4.15. 消除join場景一 與Oracle等其他關系庫類似,SQL Server中,join作為基本語法用于SQL語句中相關表之間的連接,有些場景中,join既可以增強SQL語句的可讀性,同時,又可以提升SQL語句的性能,但有些場景中,join會導致CBO為SQL語句產生次優的查詢計劃,進而出現SQL語句…

深度學習-數據準備

一、數據準備 1.1定義 數據準備&#xff08;Data Preparation&#xff09; 是數據分析與機器學習流程中的核心環節&#xff0c;指將原始數據轉換為適合分析或建模的結構化格式的過程。 1.2組成 數據準備主要由兩個部分組成&#xff0c;一個是劃分數據集&#xff0c;一個是構建…

IPA軟件源預覽系統源碼(源碼下載)

這是一款IPA軟件源預覽系統源碼&#xff0c;搭建這個源碼一定記住沒有軟件源的別搭建&#xff0c;因為你玩不明白&#xff0c;不是做IPA軟件源的不要下載這套源碼&#xff0c;簡單的測試了&#xff0c;UI很舒服&#xff0c;喜歡的自行部署&#xff01; 源碼下載&#xff1a;htt…

python 數據分析 單細胞測序數據分析 相關的圖表,常見于腫瘤免疫微環境、細胞亞群功能研究 ,各圖表類型及邏輯關系如下

這是一組 單細胞測序數據分析 相關的圖表&#xff0c;常見于腫瘤免疫微環境、細胞亞群功能研究 &#xff0c;各圖表類型及邏輯關系如下&#xff1a;使用kimi doubao 和deepseek &#xff0c;分析圖標和pdf 豆包最好&#xff0c;用豆包分析| 圖表類型 A、E&#xff08;堆疊柱狀…

表達式索引海外云持久化實踐:關鍵技術解析與性能優化

隨著全球數字化轉型加速&#xff0c;表達式索引技術正成為海外云服務商提升數據庫性能的核心方案。本文將深度解析如何通過云原生架構實現索引持久化&#xff0c;對比主流云平臺的技術實現差異&#xff0c;并給出跨國業務場景下的優化建議。 表達式索引海外云持久化實踐&#x…