深入java虛擬機1-4章, all in sandbox(1)關(guān)鍵字: 09年讀書如果你尚未閱讀深入java虛擬機,,推薦你先閱讀深入理解計算機系統(tǒng)。 如果你已經(jīng)閱讀過深入理解計算機系統(tǒng),,推薦你閱讀深入java虛擬機,。 如果這兩本書你都閱讀過或者都在閱讀,我就不知道說什么好了,。
java虛擬機(jvm)是建立于一個本地系統(tǒng)之上沙箱之中,。 這個基礎(chǔ)天生便決定了java的平臺平臺無關(guān)性。 我們所編寫的java程序調(diào)用java api,,由java api調(diào)用 本地方法(動態(tài)庫)操作本地系統(tǒng),。 由此帶來了內(nèi)存管理,安全管理等一系列問題,。
java的內(nèi)存管理
java api沒有通過提供強制裝換指針或者通過指針運算直接訪問內(nèi)存的方法,。 java使用自動垃圾回收機制,通過停止對一個java對象的引用來促使垃圾收集器自動回收這個對象所占據(jù)的內(nèi)存,。 java使用數(shù)組邊界檢查而防止出現(xiàn)因此而引發(fā)的內(nèi)存沖突,。
java的平臺無關(guān)性 java虛擬機規(guī)范規(guī)定了java虛擬機中基礎(chǔ)類型的規(guī)格,,因此通過使用不同平臺的java虛擬機,,而跨越不同的系統(tǒng)平臺實現(xiàn)。 因此編寫java程序一個很重要的原則就是不要直接或者間接調(diào)用不屬于java api的本地方法,。
對java虛擬機的依賴 編寫平臺獨立的java程序時候,,要遵循兩條原則: 1 不要依賴及時終結(jié)來達到程序的正確性 。 不同的java虛擬機有不同的垃圾回收機制的實現(xiàn),。 2 不要依賴線程的優(yōu)先級來達到程序的正確性,。 不同的java虛擬機有不同的線程優(yōu)先級的實現(xiàn),。為了保障多線程java程序的平臺無關(guān)性,必須依賴同步機制而不是優(yōu)先級機制來協(xié)調(diào)線程,。
java的安全管理機制
java沙箱機制是java程序運行在一個受限的內(nèi)存空間,。 例如某個java程序產(chǎn)生了outofmemory的異常,只會導致這個java程序終止,。并不會導致其他java程序或者其他應用程序終止,。
java沙箱由以下幾部分組成: 類裝載器體系結(jié)構(gòu)class文件檢驗器內(nèi)置于java虛擬機(及語言)的安全特性安全管理器及java api
類裝載器體系結(jié)構(gòu)
類裝載器體系結(jié)構(gòu)在三個方面對java沙箱起作用: 1.防止惡意代碼去干涉善意代碼。 2.守護了被信任的類庫的邊界 3.將代碼歸入了保護域,,該保護域確定了代碼可以進行哪些操作,。 類裝載器通過為不同的類提供不同的類裝載命名空間來防止惡意代碼干涉善意代碼。相同命名空間內(nèi)的類可以相互訪問而不同命名空間內(nèi)的類彼此并不可視因而也無法相互訪問,。 類裝載器守護被信任的類庫邊界通過使用不同的類裝載器裝載不同的包而實現(xiàn)的,。
class文件校驗器
class文件校驗器用來檢驗class文件的字節(jié)碼。防止阻止方法內(nèi)的跳轉(zhuǎn)指令跳到方法之外,。 class文件會對一個class文件的字節(jié)碼序列進行四次掃描
1 class文件的結(jié)構(gòu)檢查 java的class文件是以0xCAFEBABE開頭作為文件類型標識的,。主要檢查class文件的完整性,保障這個字節(jié)序列遵從class文件的文件格式,,這樣才能編譯成在方法區(qū)的內(nèi)部數(shù)據(jù)結(jié)構(gòu),。第2,3,,4次掃描是在方法區(qū)內(nèi)進行的,。
2 類型數(shù)據(jù)的語言檢查 檢驗器檢查每個組成部分,確認其是否是所屬類型的實例,,它們的結(jié)構(gòu)是否正確,。其目的是為了確認每個方法描述符都是符合特定格式,格式正確的字符串,。還會檢查這個類本身是否符合特定的條件,。總之,,檢驗器會檢驗有編譯器產(chǎn)生的class文件是否遵守一些java語言在編譯時必須遵守的強制規(guī)則,。
3字節(jié)碼驗證 字節(jié)碼流代表了java的方法,它是由被稱為操作碼的單字節(jié)指令組成的序列,。每個操作碼后面都跟著一個或者多個操作數(shù)(這一點很類似匯編語言的指令),。操作數(shù)用于在java虛擬機執(zhí)行操作碼指令時提供所需的額外的數(shù)據(jù)。執(zhí)行字節(jié)碼時,,依序執(zhí)行每個操作碼,,這樣就在java虛擬機內(nèi)部形成了執(zhí)行的線程。每個線程被授予自己的java棧,。這個棧就是由不同的棧幀組成的,。每一個方法的調(diào)用將獲得一個自己的棧幀(其實就是一個內(nèi)存片段),,其中存儲著局部變量和計算的中間結(jié)果。在棧幀中用于存儲方法的中間結(jié)果的部分被稱為該方法的操作數(shù)棧,。操作碼和它的(可選)操作數(shù)可能指存儲在操作數(shù)棧中的數(shù)據(jù)或者存儲在方法棧幀中的局部變量中的數(shù)據(jù),。這樣,在執(zhí)行一個操作碼時,,除了可以使用緊隨其后的操作數(shù),,虛擬機還可以使用操作數(shù)棧中的數(shù)據(jù),或存儲在方法棧幀中的局部變量中的數(shù)據(jù),,或兩者都使用,。 字節(jié)碼驗證要校驗直接碼流符合java的操作碼和操作數(shù)能夠被java虛擬機安全地執(zhí)行。
4符號引用的驗證 java虛擬機將追蹤直接碼流中的符號引用,,并且確保符號應用的資源可用,。如果該資源不可用并不立即拋出noclassdeffounderror錯誤,而是在運行時,,這個類被首次引用時才拋出,。 動態(tài)連接是將一個符號引用解析為直接引用的過程。當java虛擬機執(zhí)行字節(jié)碼時,,如果遇到一個操作碼,,這個操作碼第一次使用一個指向另一個類的引用,那么java虛擬機就要解析這個引用,。 1)查找被引用的類,,如果必要的話就裝載它。 2)將符號引用替換為直接引用,,例如一個指向一個類,,方法或者字段的指針或者偏移量,。
|
|