從畢業(yè)的時候斷斷續(xù)續(xù)讀這本書,發(fā)現(xiàn)已經(jīng)很久了,一直只是到概念層次,沒有深入細(xì)節(jié)。今天重讀這本書,希望能從中獲取更多。
今天先開個頭。筆記是無結(jié)構(gòu)的流式記錄,類似tips的list吧~
- 每個java程序運(yùn)行于自己的JVM實(shí)例中,java程序的啟動入口必須是public static void main(String[] args);
- 每個java程序,開始于main,結(jié)束于所有非守護(hù)線程的終止;
- jvm的體系結(jié)構(gòu)包含:類裝載器子系統(tǒng)(裝載class)、運(yùn)行時數(shù)據(jù)區(qū)(存放數(shù)據(jù))、執(zhí)行引擎(執(zhí)行被裝載類的指令);
- 運(yùn)行時數(shù)據(jù)區(qū)包含:堆、方法區(qū)、java棧、本地方法棧、PC寄存器。其中堆和方法區(qū)是所有線程共享的,而其他三者是線程獨(dú)享的;
- jvm數(shù)據(jù)類型分兩種:基本類型{數(shù)值類型{浮點(diǎn)數(shù){float,double},整數(shù){byte,short,int,long,char}},boolean,returnAddress}和引用類型{引用{類,接口,數(shù)組}},基本類型存數(shù)據(jù)本身,引用類型存數(shù)據(jù)引用;
- boolean是個特別的類型,jvm處理按int來操作,0為false,非0為true,boolean數(shù)組是按byte數(shù)組來訪問的;
- 引用類型中,類和接口都是對類或者實(shí)現(xiàn)了接口的類的實(shí)例的引用,數(shù)組是對數(shù)組對象的引用,一個特殊引用是null,表示沒有引用任何對象;
- 數(shù)據(jù)類型取值范圍:{byte:1字節(jié)有符號,short:2字節(jié)有符號,int:4字節(jié)有符號,long:8字節(jié)有符號,char:2字節(jié)無符號,float:4字節(jié)IEEE754單精度,double:8字節(jié)IEEE754雙精度,returnAddress:統(tǒng)一方法中某操作碼的地址,reference:堆中對象的引用或null}
- JVM數(shù)據(jù)單元是字,字長的設(shè)計(jì)最短要32bit即4個字節(jié),保證能容納byte,short,int,char,float,returnAddress和reference類型的值;
- JVM有兩種類加載器:啟動類裝載器和用戶自定義類裝載器,前者是jvm實(shí)現(xiàn)的一部分,后者是java程序的一部分,不同類裝載器裝載的類被放在虛擬機(jī)內(nèi)部不同的命名空間;
- 方法區(qū)存儲:{類加載時,讀入class文件后,解析得到的類型信息:全限定名,直接父類的全限定名,是類類型還是接口類型,訪問修飾符,直接實(shí)現(xiàn)接口的全限定名有序列表},{常量池:直接常量(string,int等)和對其他類型、字段和方法的符號引用},{字段信息:字段名,字段類型,字段修飾符},{方法信息:方法名,方法返回類型,方法參數(shù)的數(shù)量和類型,方法的修飾符},{類變量:static},{編譯時常量:final},{指向ClassLoader的引用:如果是自定義裝載的},{指向Class類的引用:Class.forName()或者object.getClass()},{方法表:虛擬機(jī)為每個非抽象類生成一個方法表};
- 堆存儲:所有運(yùn)行時創(chuàng)建的類實(shí)例或數(shù)組都放到同一個堆中;
- 程序計(jì)數(shù)器:大小1個字長,內(nèi)容總是下一條將被執(zhí)行指令的地址;
- java棧:只有push和pop操作,單位是一個棧幀,保存線程的運(yùn)行狀態(tài),每個幀中存儲當(dāng)前的參數(shù)、局部變量、中間運(yùn)算結(jié)果等。當(dāng)方法以return或者異常拋出結(jié)束時,當(dāng)前幀pop,當(dāng)調(diào)用一個java方法時,push一個幀成為當(dāng)前幀。因?yàn)閖ava棧數(shù)據(jù)是每線程私有的,可以不考慮同步問題。java棧的每個棧幀又包含三部分:局部變量區(qū)、操作數(shù)棧和幀數(shù)據(jù)區(qū)。局部變量和方法參數(shù)存入局部變量區(qū),操作數(shù)棧是jvm的工作區(qū),指令都要經(jīng)過棧彈出數(shù)據(jù)進(jìn)行運(yùn)算,一般的iload,istore等指令就是push和pop;幀數(shù)據(jù)區(qū)主要是支持常量池解析、正常方法返回以及異常派發(fā)機(jī)制;
- 本地方法棧:線程調(diào)用一個本地方法時,本地方法接口使用本地方法棧;
- 執(zhí)行引擎:執(zhí)行指令,通用技術(shù)有解釋、即時編譯、自適應(yīng)優(yōu)化和芯片級執(zhí)行,Sun的hotspot使用自適應(yīng)優(yōu)化:剛開始對所有代碼解釋運(yùn)行,監(jiān)視代碼運(yùn)行情況,把經(jīng)常執(zhí)行的代碼編譯為本地代碼,優(yōu)化,然后繼續(xù)執(zhí)行。