成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

小米二面:JVM 觸發(fā)類加載的條件有哪些?我說 new 的時候加載,然后他對我笑了笑......

開發(fā) 前端
在本節(jié)中,我們將詳細探討類加載的時機、主動和被動引用的區(qū)別,以及常見的類加載觸發(fā)條件。

Java 虛擬機(JVM)中,類的加載并不是隨意發(fā)生的,而是由特定的觸發(fā)條件決定的。什么時候加載?什么時候初始化?

這是我們必須要搞清楚的問題,尤其在復雜的應用中,弄懂類加載的時機能幫助我們避免一些潛在的性能問題和運行時錯誤。

在本節(jié)中,我們將詳細探討類加載的時機、主動和被動引用的區(qū)別,以及常見的類加載觸發(fā)條件。

類加載生命周期

類加載的生命周期包括:加載(Loading)、鏈接(Linking) 和 初始化(Initialization)。而其中,初始化階段是決定類是否被真正加載的關鍵。

JVM 在什么時候啟動類加載過程呢?

主要分為主動引用被動引用兩種情況。我們分別看看這兩種情況在什么條件下會觸發(fā)類加載。

主動引用

主動引用是指程序顯式地使用某個類,從而觸發(fā)類的加載和初始化。根據《Java 虛擬機規(guī)范》,以下六種情況會觸發(fā)類的主動引用,也就是觸發(fā)類加載的條件!

1. 創(chuàng)建類的實例

當你使用 new 關鍵字創(chuàng)建一個類的實例時,JVM 會立即加載并初始化該類。

// 觸發(fā) MyClass 的加載和初始化
MyClass obj = new MyClass();

初始化流程:

  • 分配內存給 MyClass 的實例對象。
  • 加載 MyClass 類的字節(jié)碼,并執(zhí)行靜態(tài)代碼塊和靜態(tài)變量賦值操作。

2. 訪問類的靜態(tài)字段或靜態(tài)方法

訪問類的靜態(tài)字段或靜態(tài)方法時,也會觸發(fā)類的加載和初始化。

// 觸發(fā) MyClass 的加載
System.out.println(MyClass.staticVar);  
// 觸發(fā) MyClass 的加載
MyClass.staticMethod();

常量不會觸發(fā)類加載:如果靜態(tài)字段是 final 修飾的常量,它在編譯期已存入常量池,因此不會觸發(fā)類加載。

System.out.println(MyClass.FINAL_CONSTANT);  // 不觸發(fā)類加載

3. 反射

通過反射調用類時,也會觸發(fā)類加載。

Class<?> clazz = Class.forName("com.example.MyClass");  // 觸發(fā) MyClass 的加載

4. 初始化類的子類時,先初始化父類

當初始化一個類時,如果它的父類尚未初始化,JVM 會先初始化父類。

public class Parent {
    static {
        System.out.println("父類初始化");
    }
}

public class Child extends Parent {
    static {
        System.out.println("子類初始化");
    }
}

// 先輸出"父類初始化",再輸出"子類初始化"
Child obj = new Child();

5. 擬機啟動時,初始化 main 方法所在的類

虛擬機啟動時,main 方法所在的類是程序的入口類,會被優(yōu)先加載和初始化。

public static void main(String[] args) {
    System.out.println("主類加載");
}

6. 動態(tài)語言支持

在 Java 7 引入的 java.lang.invoke 包中,當 MethodHandle 最終指向的類需要初始化時,也會觸發(fā)類的加載。

MethodHandle handle = MethodHandles.lookup().findStatic(MyClass.class, "staticMethod", MethodType.methodType(void.class));
handle.invoke();  // 可能觸發(fā) MyClass 的加載

被動引用:不觸發(fā)類加載

與主動引用相對,被動引用是指訪問類的某些特性時不會觸發(fā)類的加載和初始化。以下是幾種典型的被動引用場景。

1. 通過子類引用父類的靜態(tài)字段

如果子類只引用父類的靜態(tài)字段,JVM 只會初始化父類,而不會初始化子類。

示例

// 只觸發(fā) Parent 的加載,不觸發(fā) Child 的加載
System.out.println(Child.staticVar);

2. 訪問編譯期常量

訪問 final 修飾的編譯期常量,不會觸發(fā)類的加載。

// 不觸發(fā) MyClass 的加載
System.out.println(MyClass.FINAL_CONSTANT);

3. 通過數組定義類引用

通過數組引用一個類,不會觸發(fā)該類的加載。

// 不觸發(fā) MyClass 的加載
MyClass[] array = new MyClass[10];

碼哥,為什么需要關注類加載的時機?

  • 避免類的過早加載:過早加載可能導致不必要的內存消耗,尤其在大型應用中。
  • 延遲加載(Lazy Loading):通過延遲加載,可以在真正需要時才加載類,減少啟動時間。
  • 減少類加載沖突:在模塊化或插件化的應用中,合理安排類加載順序有助于避免類沖突和類加載死鎖問題。
責任編輯:姜華 來源: 碼哥跳動
相關推薦

2024-03-26 07:58:12

Redis編程模型

2025-01-14 08:32:55

2021-05-19 08:31:15

壓測數據結構與算法工具

2020-07-23 07:26:49

JVM類加載器

2024-07-08 10:11:37

2024-03-08 08:26:25

類的加載Class文件Java

2021-05-08 09:02:19

Java加載器

2012-03-13 14:41:41

JavaJVM

2024-12-04 09:01:55

引導類加載器C++

2023-10-31 16:00:51

類加載機制Java

2017-03-08 10:30:43

JVMJava加載機制

2021-04-29 11:18:14

JVM加載機制

2024-03-12 07:44:53

JVM雙親委托機制類加載器

2017-09-20 08:07:32

java加載機制

2024-12-02 09:01:23

Java虛擬機內存

2024-04-22 00:00:00

CASCPU硬件

2015-07-03 10:12:41

小米迅雷

2017-09-22 15:25:40

Go語言其他語言錯誤處理

2020-02-11 13:22:20

this函數JavaScript

2011-11-24 10:00:10

Xtend
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区四区在线 | 欧美在线视频一区 | 国产一区二区电影网 | 国产精品日韩高清伦字幕搜索 | 成人免费视频在线观看 | 国产一区2区 | 麻豆精品一区二区三区在线观看 | 玖玖色在线视频 | 亚洲高清免费观看 | 中文字幕11页 | 九色 在线 | 国产免费视频 | 日韩中文在线观看 | 亚洲成av人片在线观看无码 | 拍戏被cao翻了h承欢 | 在线欧美亚洲 | 久久综合九色综合欧美狠狠 | 国产一区二区视频免费在线观看 | a级片www| 免费av在线 | 亚洲黄色av | 国产精品99久久久久久宅男 | 亚洲成人网在线播放 | 日韩视频精品在线 | 久久国产精品视频 | 91国内精精品久久久久久婷婷 | 一区二区亚洲 | 国产男人的天堂 | 日韩国产精品一区二区三区 | 在线看一区二区 | 国产精品永久在线观看 | 一级免费视频 | 国产激情99 | 一区二区三区欧美在线 | 欧美精品欧美精品系列 | 国产精品高潮呻吟久久 | 日韩国产欧美在线观看 | 成人精品福利 | 午夜视频网 | 国产日本精品视频 | 风间由美一区二区三区在线观看 |