1:Jvm是什么
Jvm 虛擬機(jī)(Java Virtual Machine)字面意思,Java虛擬的機(jī)器 ,一種Java,用于計(jì)算機(jī)設(shè)備的規(guī)范.
介紹:
Java虛擬機(jī)(JVM)是可運(yùn)行Java代碼的假想計(jì)算機(jī)察郁。只要根據(jù)JVM規(guī)格描述將解釋器移植到特定的計(jì)算機(jī)上擂涛,就能保證經(jīng)過編譯的任何Java代碼能夠在該系統(tǒng)上運(yùn)行。
重點(diǎn):
Jvm 是Java實(shí)現(xiàn)跨平臺(tái)的基礎(chǔ),只要平臺(tái)支持Jvm Java語言寫的項(xiàng)目就能在此平臺(tái)上運(yùn)行.
2:Jvm結(jié)構(gòu)
Jvm由 以下幾個(gè)部分組成
- 類加載器(.class類加載)
- 運(yùn)行時(shí)數(shù)據(jù)區(qū)(運(yùn)行時(shí)數(shù)據(jù)存儲(chǔ),分為方法區(qū),堆,java棧,本地方法棧,程序計(jì)數(shù)器)
- 執(zhí)行引擎本(執(zhí)行字節(jié)碼或者執(zhí)行本地方法)
- JNI(Java Native Interface)本地地方法接口
- Native Library 本地方法庫(kù) C/C++實(shí)現(xiàn)的一些庫(kù)
3:類加載器
類加載器:
類加載器是Jvm提供的一種類加載的機(jī)制. 類加載器負(fù)責(zé)將class文件加載到內(nèi)存中,轉(zhuǎn)化為可執(zhí)行對(duì)象.所有類都是由類加載器加載的
類加載器還負(fù)責(zé)解析類的依賴關(guān)系,即加載所需的其他類泥技。
類加載器分類
- Bootstrap Class Loader 啟動(dòng)類加載器又稱跟加載器
- Extension Class Loader 擴(kuò)展類加載器
- Application Class Loader 程序類加載器
- 自定義加載器(處理業(yè)務(wù)需要加密等特殊的加載器)
3.1 Bootstrap Class Loader啟動(dòng)類加載器
Bootstrap Class Loader 啟動(dòng)類加載器,又稱跟加載器,是最頂層的加載器.是由C++實(shí)現(xiàn),負(fù)責(zé)加載Java的核心類,%JAVA_HOME%/lib目錄下的核心jar包和類或者或被 -Xbootclasspath參數(shù)指定的路徑中的所有類,例如:java.lang.Object
3.2 ExtensionClassLoader 擴(kuò)展類加載器:
主要負(fù)責(zé)加載目錄 %JRE_HOME%/lib/ext 目錄下的jar包和類,或被 java.ext.dirs 系統(tǒng)變量所指定的路徑下的jar包唠倦。
3.2 AppClassLoader 應(yīng)用程序類加載器:
面向我們用戶的加載器铃芦,負(fù)責(zé)加載當(dāng)前應(yīng)用classpath下的所有jar包和類。
除了這三個(gè)主要的類加載器左刽,Java還支持自定義類加載器捺信,開發(fā)人員可以根據(jù)需要實(shí)現(xiàn)自己的類加載器。
注意:
除了 BootstrapClassLoader 其他類加載器均由 Java 實(shí)現(xiàn)且全部繼承自java.lang.ClassLoader
3.3 類生命周期
一個(gè)類的生命周期,就是類加載器加載到卸載一個(gè)類的過程.
類的生命周期可以分為以下幾個(gè)階段:
- 加載(Loading)
根據(jù)類的全限定名(包括包路徑和類名)定位并讀取類文件的字節(jié)碼欠痴。 - 驗(yàn)證(Verification)
校驗(yàn)類是否符合jvm規(guī)范 - 準(zhǔn)備(Preparation)
為靜態(tài)變量賦予默認(rèn)值,這些內(nèi)存都將在方法區(qū)中分配
注意:
靜態(tài)變量復(fù)制,0,null,""等
final修飾的直接賦值而不是賦予默認(rèn)值 - 解析(Resolution)
將常量池中的符號(hào)引用替換為直接引用(內(nèi)存地址)的過程.
符號(hào)引用就是一組符號(hào)來描述目標(biāo)迄靠,可以是任何字面量。屬于編譯原理方面的概念如:包括類和接口的全限定名喇辽、字段的名稱和描述符掌挚、方法的名稱和描述符。
直接引用就是直接指向目標(biāo)的指針茵臭、相對(duì)偏移量或一個(gè)間接定位到目標(biāo)的句柄疫诽。如指向方法區(qū)某個(gè)類的一個(gè)指針
個(gè)人理解就是將常量池中的對(duì)象,通過一個(gè)指針空間地址值對(duì)象化. - 初始化(Initialization)執(zhí)行類的初始化代碼舅世,包括靜態(tài)變量的賦值和靜態(tài)塊的執(zhí)行
為靜態(tài)變量賦值
賦初值兩種方式:
定義靜態(tài)變量時(shí)指定初始值旦委。如 private static String x="123";
在靜態(tài)代碼塊里為靜態(tài)變量賦值。如 static{ x="123"; }
注意:只有對(duì)類的主動(dòng)使用才會(huì)導(dǎo)致類的初始化
- 使用(Using) 被引用的時(shí)候就是在使用
- 卸載(Unloading)
執(zhí)行了System.exit()方法, 程序正常執(zhí)行結(jié)束
程序在執(zhí)行過程中遇到了異吵牵或錯(cuò)誤而異常終止
由于操作系統(tǒng)出現(xiàn)錯(cuò)誤而導(dǎo)致Java虛擬機(jī)進(jìn)程終止
3.4 類加載機(jī)制-雙重委派機(jī)制(爹來模式)(重要)
類加載器采用了雙親委派模型(Parent Delegation Model)來加載類缨硝。
即當(dāng)一個(gè)類加載器需要加載類時(shí),自身不會(huì)加載會(huì)首先發(fā)送給父類加載,父類要是還有父類就會(huì)依次向上傳遞,父類不能加載會(huì)返回給子類,子類加載,子類也加載不了會(huì)拋出ClassNotFoundException異常
好處:
確保類只加載一次