Java for Android的基礎(chǔ)知識(shí)
一.JVM的結(jié)構(gòu)
每個(gè)JVM都包括:
1.類加載子系統(tǒng):裝載具有適合名稱的類或者接口姻成。
2.內(nèi)存空間:方法區(qū)也祠,Java堆昙楚,Java棧,本地方法區(qū)诈嘿。
3.垃圾收集器(GC)堪旧。
4.計(jì)數(shù)器以及寄存器。
5.執(zhí)行引擎:負(fù)責(zé)執(zhí)行包含在已裝載的類或接口的指令奖亚。
6.本地方法接口和本地方法庫(kù)淳梦。
二.JVM編譯和執(zhí)行過(guò)程
粗略流程在前篇已經(jīng)介紹過(guò)來(lái),這里主要注意這個(gè)過(guò)程中的三個(gè)重要機(jī)制:源代碼編譯機(jī)制遂蛀,類加載機(jī)制谭跨,類執(zhí)行機(jī)制。
1.源代碼的編譯機(jī)制:
(1)分析和輸入符號(hào)表
(2)注解處理
(3)語(yǔ)義分析和生成class文件
最后生存的class文件由以下部分組成:
(1)結(jié)構(gòu)信息:包含class文件格式李滴,版本號(hào)以及各個(gè)部分的數(shù)量大小的信息螃宙。
(2)元數(shù)據(jù):對(duì)應(yīng)Java源碼中聲明和常量的信息。包含類/繼承的超類/實(shí)現(xiàn)的接口的聲明信息所坯,域與方法聲明信息和常量池谆扎。
(3)方法信息:對(duì)應(yīng)源碼中語(yǔ)句和表達(dá)式。包含字節(jié)碼芹助,異常處理表堂湖,求值棧與局部變量區(qū)大小,求值棧類型記錄状土,調(diào)試符號(hào)信息无蜂。
2.類加載機(jī)制
JVM的類加載是通過(guò)ClassLoader以及其子類來(lái)完成的。
(1)Bootstrap ClassLoader:負(fù)責(zé)加載環(huán)境變量中JAVA_HOME中jre/lib/rt.jar里所有的Class蒙谓,由C++實(shí)現(xiàn)斥季,不是ClassLoader子類。
(2)Extension ClassLoader:負(fù)責(zé)加載Java平臺(tái)擴(kuò)展功能的一些jar包累驮,包括JAVA_HOME中jre/lib/*.jar或者-Djava.ext.dirs指定目錄下的jar包酣倾。
(3)App ClassLoader:負(fù)責(zé)加載Classpath中指定的jar包以及目錄中的class文件。
(4)Custom Classloader:屬于應(yīng)用程序根據(jù)自身需要自定義的ClassLoader谤专,例如tomcat躁锡、jboss都會(huì)根據(jù)j2ee規(guī)范自行實(shí)現(xiàn)ClassLoader。
加載過(guò)程會(huì)檢查類是否已經(jīng)被加載置侍,檢查順序從CustomClassLoader到BootStrapClassLoader逐層檢查映之,只要某個(gè)ClassLoader已加載則視為加載拦焚。而加載順序與檢查順序相反。
3.類執(zhí)行機(jī)制
JVM是基于堆棧的虛擬機(jī)惕医。JVM為每個(gè)新創(chuàng)建的線程都分配一個(gè)堆棧耕漱。
一個(gè)Java程序的運(yùn)行就是通過(guò)堆棧的操作來(lái)完成的算色。堆棧以幀為單位保存線程的狀態(tài)抬伺。JVM只對(duì)堆棧進(jìn)行兩種操作:以幀為單位的壓棧和出棧。
JVM執(zhí)行class字節(jié)碼灾梦,創(chuàng)建線程后峡钓,都會(huì)產(chǎn)生程序計(jì)數(shù)器(PC)和棧(stack),計(jì)數(shù)器存放下一條要執(zhí)行的指令在方法內(nèi)的偏移量若河,棧中存放一個(gè)個(gè)幀棧能岩,每個(gè)幀棧對(duì)應(yīng)每個(gè)方法的每次調(diào)用,而幀棧又由局部變量區(qū)和操作數(shù)棧兩部分組成萧福,局部變量區(qū)用于存放方法中的局部變量和參數(shù)拉鹃,操作數(shù)棧中存放執(zhí)行過(guò)程中產(chǎn)生的中間結(jié)果。