激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務(wù)器之家 - 編程語言 - Java教程 - JVM核心教程之JVM運行與類加載全過程詳解

JVM核心教程之JVM運行與類加載全過程詳解

2021-04-24 10:58AskHarries Java教程

我們都知道一個java程序運行要經(jīng)過編譯和執(zhí)行,但是這太概括了,中間還有很多步驟,下面這篇文章主要給大家介紹了關(guān)于JVM核心教程之JVM運行與類加載全過程的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考

為什么要使用類加載器?

java語言里,類加載都是在程序運行期間完成的,這種策略雖然會令類加載時稍微增加一些性能開銷,但是會給java應(yīng)用程序提供高度的靈活性。例如:

1.編寫一個面向接口的應(yīng)用程序,可能等到運行時再指定其實現(xiàn)的子類;

2.用戶可以自定義一個類加載器,讓程序在運行時從網(wǎng)絡(luò)或其他地方加載一個二進(jìn)制流作為程序代碼的一部分;(這個是android插件化,動態(tài)安裝更新apk的基礎(chǔ))

為什么研究類加載全過程?

  • 有助于連接jvm運行過程
  • 更深入了解java動態(tài)性(解熱部署,動態(tài)加載),提高程序的靈活性

類加載機制

jvm把class文件加載到內(nèi)存,并對數(shù)據(jù)進(jìn)行校驗、解析和初始化,最終形成jvm可以直接使用的java類型的全過程。

JVM核心教程之JVM運行與類加載全過程詳解

加載

將class文件字節(jié)碼內(nèi)容加載到內(nèi)存中,并將這些靜態(tài)數(shù)據(jù)轉(zhuǎn)換成方法區(qū)中的運行時數(shù)據(jù)結(jié)構(gòu),在堆中生成一個代表這個類的java.lang.class對象,作為方法區(qū)類數(shù)據(jù)的訪問入口,這個過程需要類加載器參與。

JVM核心教程之JVM運行與類加載全過程詳解

鏈接

將java類的二進(jìn)制代碼合并到j(luò)vm的運行狀態(tài)之中的過程

  • 驗證: 確保加載的類信息符合jvm規(guī)范,沒有安全方面的問題
  • 準(zhǔn)備: 正式為類變量(static變量)分配內(nèi)存并設(shè)置類變量初始值的階段,這些內(nèi)存都將在方法去中進(jìn)行分配
  • 解析: 虛擬機常量池的符號引用替換為字節(jié)引用過程

初始化

  • 初始化階段是執(zhí)行類構(gòu)造器<clinit>()方法的過程。類構(gòu)造器<clinit>()方法是由編譯器自動收藏類中的所有類變量的賦值動作和靜態(tài)語句塊(static塊)中的語句合并產(chǎn)生
  • 當(dāng)初始化一個類的時候,如果發(fā)現(xiàn)其父類還沒有進(jìn)行過初始化,則需要先觸發(fā)其父類的初始化
  • 虛擬機會保證一個類的<clinit>()方法在多線程環(huán)境中被正確加鎖和同步
  • 當(dāng)范圍一個java類的靜態(tài)域時,只有真正聲名這個域的類才會被初始化

例1:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class demo01 {
 public static void main(string[] args) {
  a a = new a();
  system.out.println(a.width);
 }
}
 
class a{
 public static int width=100; //靜態(tài)變量,靜態(tài)域 field
 static{
  system.out.println("靜態(tài)初始化類a");
  width = 300 ;
 }
 public a() {
  system.out.println("創(chuàng)建a類的對象");
 }
}

分析:

JVM核心教程之JVM運行與類加載全過程詳解

說明:

內(nèi)存中存在棧、堆(放創(chuàng)建好的對象)、方法區(qū)(實際也是一種特殊堆)

1、jvm加載demo01時候,首先在方法區(qū)中形成demo01類對應(yīng)靜態(tài)數(shù)據(jù)(類變量、類方法、代碼…),同時在堆里面也會形成java.lang.class對象(反射對象),代表demo01類,通過對象可以訪問到類二進(jìn)制結(jié)構(gòu)。然后加載變量a類信息,同時也會在堆里面形成a對象,代表a類。

2、main方法執(zhí)行時會在棧里面形成main方法棧幀,一個方法對應(yīng)一個棧幀。如果main方法調(diào)用了別的方法,會在棧里面挨個往里壓,main方法里面有個局部變量a類型的a,一開始a值為null,通過new調(diào)用類a的構(gòu)造器,棧里面生成a()方法同時堆里面生成a對象,然后把a對象地址付給棧中的a,此時a擁有a對象地址。

3、當(dāng)調(diào)用a.width時,調(diào)用方法區(qū)數(shù)據(jù)。

當(dāng)類被引用的加載,類只會加載一次

類的主動引用(一定會發(fā)生類的初始化)

  • new一個類的對象
  • 調(diào)用類的靜態(tài)成員(除了final常量)和靜態(tài)方法
  • 使用java.lang.reflect包的方法對類進(jìn)行反射調(diào)用
  • 當(dāng)虛擬機啟動,java demo01,則一定會初始化demo01類,說白了就是先啟動main方法所在的類
  • 當(dāng)初始化一個類,如果其父類沒有被初始化,則先初始化它父類

類的被動引用(不會發(fā)生類的初始化)

  • 當(dāng)訪問一個靜態(tài)域時,只有真正聲名這個域的類才會被初始化
  • 通過子類引用父類的靜態(tài)變量,不會導(dǎo)致子類初始化
  • 通過數(shù)組定義類的引用,不會觸發(fā)此類初始化
  • 引用常量不會觸發(fā)此類的初始化(常量在編譯階段就存入調(diào)用類的常量池中了)

例2:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class demo01 {
 static{
  system.out.println("靜態(tài)初始化demo01");
 }
 
 
 public static void main(string[] args) throws exception {
  system.out.println("demo01的main方法!");
  system.out.println(system.getproperty("java.class.path"));
  
  //主動引用
//  new a();
//  system.out.println(a.width);
//  class.forname("com.sinosoft.test.a");
  
  
  //被動引用
//  system.out.println(a.max);
//  a[] as = new a[10];
  system.out.println(b.width);//b類不會被加載
  
 }
}
 
class b extends a {
 static {
  system.out.println("靜態(tài)初始化b");
 }
}
 
class a extends a_father {
 public static int width=100; //靜態(tài)變量,靜態(tài)域 field
 public static final int max=100;
 
 static {
  system.out.println("靜態(tài)初始化類a");
  width=300;
 }
 public a(){
  system.out.println("創(chuàng)建a類的對象");
 }
}
 
class a_father extends object {
 static {
  system.out.println("靜態(tài)初始化a_father");
 }
}

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對服務(wù)器之家的支持。

原文鏈接:https://juejin.im/post/5addb276f265da0b9c103e42

延伸 · 閱讀

精彩推薦
1172
主站蜘蛛池模板: 免费国产成人高清在线看软件 | 免费激情网站 | 中文字幕亚洲一区二区三区 | 日本搞逼视频 | 啪啪激情 | 欧美乱码精品一区 | 久久成人激情视频 | 在线观看中文字幕av | 一日本道久久久精品国产 | 九九综合九九 | av在线免费看网站 | 精品国产一二区 | 久久精品久久久久 | 88xx成人永久免费观看 | 中文字幕免费在线观看视频 | 一道本不卡一区 | 91看片在线观看视频 | 成人免费午夜视频 | 1区2区3区国产 | 在线视频观看一区二区 | 日韩视频在线一区二区三区 | 在线观看网址av | 久久久久亚洲国产精品 | 伊人久操视频 | 爽爽淫人网 | 精品69人人人人 | 99热高清| 国产精品成人免费一区久久羞羞 | 蜜桃免费在线 | 得得啪在线 | 99精品国产在热久久婷婷 | 午夜爱爱福利 | 久久精品一级 | 色啪综合| av电影院在线观看 | 未成年人在线观看 | 色婷婷久久久 | 欧洲精品久久久 | 91精品福利视频 | 国产欧美日韩一区二区三区四区 | 中文字幕精品一二三四五六七八 |