面試官:說一下類別載入的過程(10張圖解)
載入
#當我們要使用一個類別的時候,要透過ClassLoader將類別載入到記憶體中
「類別載入階段主要完成以下三件事情」
透過全類名,取得類的二進位流 解析類別的二進位流為方法區內的資料結構 建立一個java.lang.Class類別的實例,表示該類型,作為方法區這個類別的存取入口

「透過全類別名,取得類別的二進位流的方式有很多種”
從zip壓縮包取得 從網路取得 執行階段計算生成,如動態代理技術 ...
#「對於非陣列類型的載入階段,也就是可以使用Java虛擬機器內建的類別載入器去完成,也可以使用使用者自訂的類別載入器去完成”
連結
「連結這個階段主要分為3個部分,驗證,準備,解析」
驗證
#「驗證階段主要是確保Class檔案的格式正確,運行時不會危害虛擬機器的安全」
驗證階段的規則很多,但大致分為如下4個階段「具體詳細的內容,我就不詳細解釋了,可以看《深入理解Java虛擬機》,本篇文章偏向於做一個總結,把握類別加載的一個整體流程,而不對細節進行闡述”
準備
「準備階段主要是為類別的靜態變數分配內存,並將其初始化為默認值”
常見的資料類型的預設值如下
資料型別 | 預設值 |
---|---|
byte | # (byte)0 |
short | (short)0 |
int | #0 |
long | 0L |
float | 0.0f |
#double | 0.0d |
boolean | false |
char | '\u0000' |
#參考 | null |
「如果類別靜態變數的欄位屬性表中存在ConstantValue屬性,則直接執行賦值語句」
那麼什麼情況下類別靜態變數的欄位屬性表中存在ConstantValue屬性呢?
類別靜態變數為基本資料類型,並且被final修飾 #類別靜態變數為String類型,被final修飾,並且以字面量的形式賦值
為了方便查看Class檔案的字節碼,我在IDEA下載了一個外掛程式jclasslib Bytecode viewer,非常方便。用以下程式碼透過字節碼的形式驗證一下
public class Person { private static int age = 10; private static final int length = 160; private static final String name = "name"; private static final String loc = new String("loc"); }
「所以length和name屬性在準備階段就會賦值為ConstantValue指定的值」
#「那麼age和loc屬性會在哪個階段賦值呢?是在初始化階段,後面會詳細介紹哈」
##解析
「將類,接口,字段和方法的符號引用(在常數池中)轉為直接引用」符號引用:用一組符號來描述所引用的目標 直接引用;直接指向指向目標的指標
加入我寫了一個如下的類別public class Student { private String name; private int age; public String getName() { return this.name; } }
以欄位為例,name和age對應的物件並不是直接指向記憶體位址,而是用字串來進行描述(即符號引用)。解析階段就是將這些描述轉為直接指向目標的指標(即直接引用)
初始化
「执行类静态成员变量赋值语句和静态代码块中的语句」

我们把上面的Student代码改成如下形式
public class Student { private String name; private int age = 10; private static int gender = 1; { System.out.println("构造代码块"); } static { System.out.println("静态代码块"); } public Student() { System.out.println("构造函数"); } public String getName() { return this.name; } }
可以看到字节码中包含了3个方法,getName方法我们知道,从字节码的角度分析一波
「

从字节码可以看到
调用父类的 方法 非静态成员变量赋值 执行构造代码块 执行构造函数
「
从字节码可以看到
執行靜態變數的賦值語句 執行靜態程式碼區塊中的語句 需要注意的一點是,「Java虛擬機會保證子類別的 方法執行前,父類別的 方法已經執行完畢」
「理解
#我這裡就直接總結結論,大家可以寫demo驗證一下 - 「沒有繼承狀況的執行順序」
靜態程式碼區塊和靜態成員變量,執行順序由編寫順序決定(只會執行一次哈)
建構程式碼區塊和非靜態成員變量,執行順序由編寫順序決定 #建構子
「有繼承情況的執行順序」
需要確保堆中的Sample類別及其子類別都已經被回收 #載入Sample類別的MyClassLoader已經被回收 Sample類別對應的Class物件已經被回收
可以看到對方法區的類型資料回收的條件比較苛刻,但是收效甚微,所以有些垃圾收集器不會對方法區的類型資料進行回收
總結
類別載入過程
變數的賦值過程
以上是面試官:說一下類別載入的過程(10張圖解)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

你一定知道 Spring , 那說說 Aop 的去全部通知順序, Spring Boot 或 Spring Boot 2 對 aop 的執行順序影響?說說你在 AOP 中遇到的那些坑?

OOM 意味著程式存在漏洞,可能是程式碼或 JVM 參數配置引起的。這篇文章跟讀者聊聊,Java 進程觸發了 OOM 後如何排查。

Java並發程式設計系列番外篇C A S(Compare and swap),文章風格依然是圖文並茂,簡單易懂,讓讀者們也能與面試官瘋狂對線。

在很多公司的筆試題中,千萬別小看,都是有坑的,一不小心自己就掉進去了。遇到這種關於循環的筆試題,建議,自己冷靜思考,一步一步來。

上週,一位群組裡的朋友去平安保險面試了,結果有些遺憾,蠻可惜的,但希望你不要氣餒,正如你所說的,面試中遇到的問題,基本上都是可以通過背面試題解決的,所以請加油!

這篇來看看 Java String類別的 5 題面試題,這五題,我自己在面試過程中親身經歷過幾題目,本篇就帶你了解這些題的答案為什麼是這樣。

本文共3萬多字,分別從Linux概述、磁碟、目錄、檔案、安全性、語法級、實戰、檔案管理指令、文件編輯指令、磁碟管理指令、網路通訊指令、系統管理指令、備份壓縮指令等方面拆解Linux 知識點數。
