最近花了點時間看了Bill Venners的《深入JAVA虛擬機》,這本書深入剖析了JAVA虛擬機規範,我自己則挑了一些原理性的章節來看,等過後有時間還要再好好通讀一遍。
第一章 JAVA體系結構
1.JAVA體系結構:JAVA語言+CLASS文件格式+JAVA API+JAVA虛擬機。
2.JNI:JAVA本地接口。
3.類裝載器分爲啓動類裝載器和用戶定義類裝載器,同一個類裝載器裝載的類可以相互調用,不同類裝載器裝載的類無法直接訪問,有效控制惡意代碼。
4.JAVAàJAVA API---(左邊平臺無關,右邊平臺相關)-à本地方法—>主機操作系統。
5.JAVA在內存管理和線程管理的不確定性。
第三章 安全
1.沙箱:放置JAVA程序,並限制其活動。
2.沙箱發展:基本沙箱(1.0版)---代碼簽名和認證(1.1版)---細粒度訪問控制(1.2及1.2以上版)。
3.沙箱基本組件:類裝載器結構,CLASS文件檢驗器,內置於JAVA虛擬機的安全特性,安全管理器及JAVA API。
4.第一道防線---類裝載器:
作用:防止惡意代碼干涉善意代碼,守護被信任類庫的邊界,將代碼歸入某域確定域內代碼可執行的操作。
裝載順序:採用雙親委派模型,即每個類裝載器裝載一個類時,總是先交給其雙親裝載器裝載,如果雙親無法裝載,則拋給其子裝載器裝載。這個模式同樣適用於多級親子結構的類裝載器。這樣的裝載模式防止了用戶自定義類裝載器裝載惡意的與JAVA核心類同名的類,因爲所有類裝載器的最終雙親都是啓動類裝載器,啓動類裝載器通過名字裝載的是JAVA核心類,不會裝載到同名的惡意代碼。並且不同類裝載器裝載的類之間是相互隔離的。
5.CLASS文件檢驗器:檢驗程序的健壯性,在執行前而不是執行時檢驗,包括4趟檢驗。
6.JAVA內置安全特性:
類型安全的引用轉換
結構化的內存訪問
自動垃圾回收
數組邊界檢查(防止數組越界)
空引用檢查(防止NULL指針)
異常的結構化處理
第五章 JAVA虛擬機
1.虛擬機運行的線程包括守護線程和非守護線程,其中守護線程包括垃圾回收線程等,非守護線程爲運行main()函數的線程及由main()創建的爲特別聲明的線程。當所有的非守護線程運行結束時,虛擬機自動終止守護線程並退出。
2.運行時數據區:方法區(線程共享),堆(線程共享),本地方法棧(線程共享),JAVA棧(線程獨立擁有),PC寄存器(線程獨立擁有)。
3.類裝載器執行過程:裝載à連接à初始化。
4.方法區:保存被裝在類型的信息,類型信息包括類全名,繼承的直接超類,繼承的直接接口,類/接口的標識,訪問修飾符,常量池,字段信息,方法信息,到CLASSLOADER的引用,到CLASS類的引用。
5.堆:保存類實例和數組,所有線程共享堆但都有自己的堆空間。
6.JAVA棧:以棧幀爲單位,執行方法時壓入棧,退出方法時彈出棧,棧幀保存了方法參數,局部變量和中間結果。
7.本地方法棧:獨立於JAVA棧,與本地方法有關,依賴於實現。
8執行引擎:指令集定義的,是一個線程。
9.指令集:
以棧爲中心而非以寄存器爲中心,保證了JAVA的平臺無關性
使得執行可優化
增強CLASS文件的緊湊性
CLASS文件需要字節碼驗證,如使用數據流分析器。
10.本地方法接口:增加JAVA可移植性,分離具體的支持JNI的虛擬機實現和具體的本地方法實現。