一、jvm組成
JVM由4大部分組成:ClassLoader,Runtime Data Area,Execution Engine,Native Interface

二、介紹
2.1 Classloader(類加載器)
ClassLoader(類加載器)是負(fù)責(zé)加載class文件,class文件在文件開頭有特定的文件標(biāo)示,并且ClassLoader只負(fù)責(zé)class文件的加載,至于它是否可以運(yùn)行,則由Execution Engine決定。
Java語言系統(tǒng)自帶有三個(gè)類加載器:
Bootstrap ClassLoader 最頂層的加載類,主要加載核心類庫,%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class等。另外需要注意的是可以通過啟動(dòng)jvm時(shí)指定-Xbootclasspath和路徑來
改變Bootstrap ClassLoader的加載目錄。比如java -Xbootclasspath/a:path被指定的文件追加到默認(rèn)的bootstrap路徑中。我們可以打開我的電腦,在上面的目錄下查看,看看這些jar包是不是存在于這個(gè)目錄。
Extention ClassLoader 擴(kuò)展的類加載器,加載目錄%JRE_HOME%\lib\ext目錄下的jar包和class文件。還可以加載-D java.ext.dirs選項(xiàng)指定的目錄。
Appclass Loader也稱為SystemAppClass 加載當(dāng)前應(yīng)用的classpath的所有類。
加載器執(zhí)行順序 :1.Bootstrap CLassloder? 2.Extention ClassLoader 3.AppClassLoader
雙親委派模型:
類是在運(yùn)行期間第一次使用時(shí)動(dòng)態(tài)加載的,而不是一次性加載。因?yàn)槿绻淮涡约虞d,那么會(huì)占用很多的內(nèi)存。
類的生命周期:
?包括以下 7 個(gè)階段:
加載(Loading)
驗(yàn)證(Verification)
準(zhǔn)備(Preparation)
解析(Resolution)
初始化(Initialization)
使用(Using)
卸載(Unloading)
2.2 Native Interface
Native Interface是負(fù)責(zé)調(diào)用本地接口的。他的作用是調(diào)用不同語言的接口給JAVA用,他會(huì)在Native Method Stack中記錄對(duì)應(yīng)的本地方法,然后調(diào)用該方法時(shí)就通過Execution Engine加載對(duì)應(yīng)的本地lib。原本多于用一些專業(yè)領(lǐng)域,如JAVA驅(qū)動(dòng),地圖制作引擎等,現(xiàn)在關(guān)于這種本地方法接口的調(diào)用已經(jīng)被類似于Socket通信,WebService等方式取代。
2.3?Execution Engine
?Execution Engine是執(zhí)行引擎,也叫Interpreter。Class文件被加載后,會(huì)把指令和數(shù)據(jù)信息放入內(nèi)存中,Execution Engine則負(fù)責(zé)把這些命令解釋給操作系統(tǒng)。
2.4?Runtime Data Area
Runtime Data Area則是存放數(shù)據(jù)的,分為五部分:Stack,Heap,Method Area,PC Register,Native Method Stack。幾乎所有的關(guān)于java內(nèi)存方面的問題,都是集中在這塊
java虛擬機(jī)棧: 每個(gè) Java 方法在執(zhí)行的同時(shí)會(huì)創(chuàng)建一個(gè)棧幀用于存儲(chǔ)局部變量表、操作數(shù)棧、常量池引用等信息。從方法調(diào)用直至執(zhí)行完成的過程,就對(duì)應(yīng)著一個(gè)棧幀在 Java 虛擬機(jī)棧中入棧和出棧的過程。通過-Xss來設(shè)置其大小
堆: 所有對(duì)象都在這里分配內(nèi)存,是垃圾收集的主要區(qū)域("GC 堆")。分為Young Generation和Old Generation(也叫Tenured?Generation)兩大部分。Young Generation分為Eden和Survivor,Survivor又分為From Space和 ToSpace。通過-Xms和-Xmx來指定最小值和最大值
三、垃圾回收?
?判斷一個(gè)對(duì)象是否可被回收?
?(1)引用計(jì)數(shù)算法
?(2)可達(dá)性算法 :以 GC Roots 為起始點(diǎn)進(jìn)行搜索,可達(dá)的對(duì)象都是存活的,不可達(dá)的對(duì)象可被回收。(java虛擬機(jī)使用)
? ? ? GC Roots 一般包含以下內(nèi)容:
虛擬機(jī)棧中局部變量表中引用的對(duì)象
本地方法棧中 JNI 中引用的對(duì)象
方法區(qū)中類靜態(tài)屬性引用的對(duì)象
方法區(qū)中的常量引用的對(duì)象