自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java虛擬機(jī)如何加載類的?

云計(jì)算 虛擬化
Java分基本類型和引用類型。其中按照面向?qū)ο蟮奶匦?,一切皆對象,那么對于基本類型也?yīng)該是對象。

 [[258793]]

首先JVM加載類的一般流程分三步:

  • 加載
  • 鏈接
  • 初始化

那么是否全部Java類都是這樣三步走的方式加載呢?我們可以從Java的數(shù)據(jù)類型去出發(fā)。Java分基本類型和引用類型。其中按照面向?qū)ο蟮奶匦裕磺薪詫ο?,那么對于基本類型也?yīng)該是對象。但是為了在執(zhí)行效率和內(nèi)存占用上進(jìn)行調(diào)優(yōu),Java將基本類型特殊處理。所以Java基本類型加載都是Java虛擬機(jī)預(yù)先定義好了,所以沒有加載這個(gè)步驟了。引用類型就是類,接口,數(shù)組。其中數(shù)組是直接由虛擬機(jī)直接生成的。類和接口是字節(jié)流,都是需要加載。

正文

Java基本類型

首先先看下基本類型的默認(rèn)值和值域。

 

總結(jié)

1.無符號類型:boolean和char

2.boolean在Java虛擬機(jī)中,根據(jù)虛擬機(jī)規(guī)范轉(zhuǎn)換為int類型,false為0,true為1

引用類型

引用類型中的數(shù)組是直接由Java虛擬機(jī)直接生成,接下來直接講類和接口。為了敘述方便直接統(tǒng)稱為類。類的加載分三步。

加載

加載是通過加載器進(jìn)行加載的。Java虛擬機(jī)有個(gè)一加載機(jī)制,叫做雙親委派模型。具體就是當(dāng)一個(gè)類加載器拿到這個(gè)類的時(shí)候先給自己的父類加載器進(jìn)行加載,如果父類加載器沒有找到所請求的類,才會給該類加載器。還是挺尊老愛幼的。那么加載器有很多中,在Java9之前分三類。Java9之后分兩類。

分類:

Java9之前

  • 啟動類加載器:負(fù)責(zé)加載最為基礎(chǔ)和最為重要的類。比如存放在jre的lib目錄的jar包中的類以及虛擬機(jī)參數(shù)-Xbootclasspath指定的類。
  • 擴(kuò)展類加載器:擴(kuò)展類加載器的父類的加載器是啟動類加載器。擴(kuò)展類加載器加載相對次要但是又通用的類。比如jre中l(wèi)ib/ext目錄下的jar包中的類以及由系統(tǒng)變量java.ext.dir指定的類。

·應(yīng)用類加載器:應(yīng)用類加載器的父類加載器是擴(kuò)展類加載器。負(fù)責(zé)加載應(yīng)用加載應(yīng)用程序路徑的類(這里的應(yīng)用程序的路徑就是虛擬機(jī)參數(shù)-cp/-classpath,系統(tǒng)變量java.class.path或環(huán)境變量CLASSPATH指定的路徑)。

Java9之后

啟動類加載器:同上

平臺類加載器:Java9引入模塊系統(tǒng),所以除了少數(shù)的幾個(gè)關(guān)鍵模塊是用啟動類加載器加載,其余的都有平臺類加載器加載。

類加載器除了提供加載功能,還提供命名空間的功能,這個(gè)就很像Java的包名一樣。即時(shí)是同一個(gè)類,經(jīng)過不同的類加載器,命名不同那這兩個(gè)類也是不是同一個(gè)類。

鏈接

何為鏈接,就是講加載的類合并至Java虛擬機(jī),使之能夠執(zhí)行的過程。具體流程可以分類驗(yàn)證,準(zhǔn)備以及解析三個(gè)過程。

驗(yàn)證:驗(yàn)證的目的就是需要符合Java虛擬機(jī)的規(guī)范。

準(zhǔn)備:為加載類的靜態(tài)字段分配內(nèi)存,部分Java虛擬機(jī)還會在這階段構(gòu)造其他跟類層次相關(guān)的數(shù)據(jù)結(jié)構(gòu),比如說用來實(shí)現(xiàn)虛方法的動態(tài)綁定的方法表。

解析:當(dāng)class文件加載到虛擬機(jī)之前這個(gè)類不知道自己的成員變量和成員方法的地址,所以編譯器會生成一個(gè)符號引用,這個(gè)符號應(yīng)用包括所在類的名字,目標(biāo)方法的名字,接收參數(shù)類型以及返回類型。解析就是將這個(gè)符號引用轉(zhuǎn)化為實(shí)際引用。如果符號引用指向的類沒有加載,那么會觸發(fā)這個(gè)類進(jìn)行加載,但是不會鏈接和初始化。

Java虛擬機(jī)規(guī)范并沒有要求鏈接過程完成解析,如果某些字節(jié)碼使用了符號引用,那么在執(zhí)行這些字節(jié)碼之前,需要完成解析。

初始化

初始化就是初始化靜態(tài)字段,如果靜態(tài)字段被final修改,那么該字段就會被標(biāo)記為常量值,其初始化直接由Java虛擬機(jī)完成。其他的初始化靜態(tài)字段的代碼Java編譯器會放在一個(gè)方法中并且命名為.

初始化就是為常量值直接賦值和執(zhí)行方法的過程。Java虛擬機(jī)會通過加鎖的方式確保方法只執(zhí)行一次。

那么什么時(shí)候會觸發(fā)初始化:

1.當(dāng)虛擬機(jī)啟動,初始化用戶指定的類。

2.當(dāng)遇到用以新建目標(biāo)類實(shí)例的new指令時(shí),初始化new指令的目標(biāo)類。

3.當(dāng)遇到調(diào)用靜態(tài)方法的指令時(shí),初始化該靜態(tài)方法所在的類。

4.但遇到訪問靜態(tài)字段的指令時(shí),初始化該靜態(tài)字段所在的類。

5.子類的初始化會觸發(fā)父類的初始化。

6.如果接口定義了default方法,那么直接實(shí)現(xiàn)或者間接實(shí)現(xiàn)該接口的類的初始化,會觸發(fā)該接口的初始化。

7.使用反射API對某個(gè)類進(jìn)行反射調(diào)用時(shí),會初始化該類。

8.當(dāng)初次調(diào)用MethodHandle實(shí)例時(shí),初始化該MethodHandle指向的方法所在的類。

責(zé)任編輯:武曉燕 來源: Segmentfault
相關(guān)推薦

2012-01-18 11:24:18

Java

2009-06-12 16:02:58

裝載Java虛擬機(jī)

2011-03-17 09:58:43

Java虛擬機(jī)JVM

2009-06-12 16:15:42

死鎖Java虛擬機(jī)

2012-04-10 10:29:29

2010-12-23 14:05:12

虛擬機(jī)

2012-05-18 10:22:23

2022-08-14 09:11:13

Kubernetes容器云原生

2017-11-14 16:43:13

Java虛擬機(jī)線程

2018-06-19 15:39:21

HeapJava虛擬機(jī)

2011-06-22 13:35:55

JVM

2010-12-27 14:11:55

虛擬機(jī)配置CPU

2009-10-13 15:00:36

物理機(jī)虛擬機(jī)網(wǎng)絡(luò)安全

2013-07-17 09:32:58

2020-06-03 19:07:49

Java虛擬機(jī)JVM

2024-11-11 11:21:30

虛擬機(jī)Python跳轉(zhuǎn)表

2010-01-18 10:15:50

虛擬機(jī)ubuntu

2020-01-17 10:52:37

無服務(wù)器容器技術(shù)

2010-09-25 15:13:40

JVMJava虛擬機(jī)

2009-06-22 14:04:00

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號