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