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

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

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

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

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

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

類加載生命周期

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

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

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

主動引用

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

1. 創建類的實例

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

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

初始化流程:

  • 分配內存給 MyClass 的實例對象。
  • 加載 MyClass 類的字節碼,并執行靜態代碼塊和靜態變量賦值操作。

2. 訪問類的靜態字段或靜態方法

訪問類的靜態字段或靜態方法時,也會觸發類的加載和初始化。

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

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

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

3. 反射

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

Class<?> clazz = Class.forName("com.example.MyClass");  // 觸發 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 方法所在的類是程序的入口類,會被優先加載和初始化。

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

6. 動態語言支持

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

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

被動引用:不觸發類加載

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

1. 通過子類引用父類的靜態字段

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

示例

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

2. 訪問編譯期常量

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

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

3. 通過數組定義類引用

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

// 不觸發 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

2024-03-12 07:44:53

JVM雙親委托機制類加載器

2017-09-20 08:07:32

java加載機制

2017-03-08 10:30:43

JVMJava加載機制

2021-04-29 11:18:14

JVM加載機制

2024-04-22 00:00:00

CASCPU硬件

2017-09-22 15:25:40

Go語言其他語言錯誤處理

2024-12-02 09:01:23

Java虛擬機內存

2015-07-03 10:12:41

小米迅雷

2020-02-11 13:22:20

this函數JavaScript

2011-11-24 10:00:10

Xtend
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产电影一区二区在线观看 | 国产精品99久久免费观看 | 亚洲精品一区二区 | 午夜三区| 激情国产| 91久久国产综合久久 | 久久在线 | 欧美日韩视频在线播放 | 天天操天天干天天曰 | 国产精品视频久久久久久 | 在线播放一区 | 欧美日韩在线观看视频 | 伦理午夜电影免费观看 | 亚洲一区二区在线免费观看 | 欧美日日日日bbbbb视频 | 亚洲第一av | 国产福利免费视频 | 久久6视频 | 免费能直接在线观看黄的视频 | 国产电影一区二区在线观看 | 激情婷婷成人 | 九九在线视频 | 久草中文在线观看 | 中文字幕在线免费视频 | 亚洲精品国产成人 | 日韩精品一区二区三区在线播放 | 亚洲国产精品一区二区www | 青青久在线视频 | 久久99精品国产自在现线小黄鸭 | 国产一级在线观看 | 亚洲成av人影片在线观看 | 亚洲男人网 | 欧美在线a | 国产福利91精品 | va在线 | 国产精品一区二区三区四区 | 羞羞视频在线观免费观看 | 免费xxxx大片国产在线 | 精品国产伦一区二区三区观看方式 | 北条麻妃一区二区三区在线观看 | 国产精品乱码一区二区三区 |