小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

深入java虛擬機(jī)1-4章, all in sandbox(1) - 日拱一卒,不求速成 ...

 goldbomb 2009-01-08

深入java虛擬機(jī)1-4章, all in sandbox(1)

關(guān)鍵字: 09年讀書

如果你尚未閱讀深入java虛擬機(jī),推薦你先閱讀深入理解計算機(jī)系統(tǒng)。

如果你已經(jīng)閱讀過深入理解計算機(jī)系統(tǒng),推薦你閱讀深入java虛擬機(jī)。

如果這兩本書你都閱讀過或者都在閱讀,我就不知道說什么好了。

 

java虛擬機(jī)(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沒有通過提供強(qiáng)制裝換指針或者通過指針運(yùn)算直接訪問內(nèi)存的方法。

java使用自動垃圾回收機(jī)制,通過停止對一個java對象的引用來促使垃圾收集器自動回收這個對象所占據(jù)的內(nèi)存。

java使用數(shù)組邊界檢查而防止出現(xiàn)因此而引發(fā)的內(nèi)存沖突。

 

java的平臺無關(guān)性

java虛擬機(jī)規(guī)范規(guī)定了java虛擬機(jī)中基礎(chǔ)類型的規(guī)格,因此通過使用不同平臺的java虛擬機(jī),而跨越不同的系統(tǒng)平臺實現(xiàn)。

因此編寫java程序一個很重要的原則就是不要直接或者間接調(diào)用不屬于java api的本地方法。

 

對java虛擬機(jī)的依賴

編寫平臺獨(dú)立的java程序時候,要遵循兩條原則:

1 不要依賴及時終結(jié)來達(dá)到程序的正確性 。

   不同的java虛擬機(jī)有不同的垃圾回收機(jī)制的實現(xiàn)。

2 不要依賴線程的優(yōu)先級來達(dá)到程序的正確性。

  不同的java虛擬機(jī)有不同的線程優(yōu)先級的實現(xiàn)。為了保障多線程java程序的平臺無關(guān)性,必須依賴同步機(jī)制而不是優(yōu)先級機(jī)制來協(xié)調(diào)線程。

 

java的安全管理機(jī)制

java沙箱機(jī)制是java程序運(yùn)行在一個受限的內(nèi)存空間。

例如某個java程序產(chǎn)生了outofmemory的異常,只會導(dǎo)致這個java程序終止。并不會導(dǎo)致其他java程序或者其他應(yīng)用程序終止。

 

java沙箱由以下幾部分組成:

類裝載器體系結(jié)構(gòu)

class文件檢驗器

內(nèi)置于java虛擬機(jī)(及語言)的安全特性

安全管理器及java api


類裝載器體系結(jié)構(gòu)

類裝載器體系結(jié)構(gòu)在三個方面對java沙箱起作用:

1.防止惡意代碼去干涉善意代碼。

2.守護(hù)了被信任的類庫的邊界

3.將代碼歸入了保護(hù)域,該保護(hù)域確定了代碼可以進(jìn)行哪些操作。

類裝載器通過為不同的類提供不同的類裝載命名空間來防止惡意代碼干涉善意代碼。相同命名空間內(nèi)的類可以相互訪問而不同命名空間內(nèi)的類彼此并不可視因而也無法相互訪問。

類裝載器守護(hù)被信任的類庫邊界通過使用不同的類裝載器裝載不同的包而實現(xiàn)的。

 

class文件校驗器

class文件校驗器用來檢驗class文件的字節(jié)碼。防止阻止方法內(nèi)的跳轉(zhuǎn)指令跳到方法之外。

class文件會對一個class文件的字節(jié)碼序列進(jìn)行四次掃描

 

1 class文件的結(jié)構(gòu)檢查

 java的class文件是以0xCAFEBABE開頭作為文件類型標(biāo)識的。主要檢查class文件的完整性,保障這個字節(jié)序列遵從class文件的文件格式,這樣才能編譯成在方法區(qū)的內(nèi)部數(shù)據(jù)結(jié)構(gòu)。第2,3,4次掃描是在方法區(qū)內(nèi)進(jìn)行的。

 

2 類型數(shù)據(jù)的語言檢查

檢驗器檢查每個組成部分,確認(rèn)其是否是所屬類型的實例,它們的結(jié)構(gòu)是否正確。其目的是為了確認(rèn)每個方法描述符都是符合特定格式,格式正確的字符串。還會檢查這個類本身是否符合特定的條件。總之,檢驗器會檢驗有編譯器產(chǎn)生的class文件是否遵守一些java語言在編譯時必須遵守的強(qiáng)制規(guī)則。

 

3字節(jié)碼驗證

字節(jié)碼流代表了java的方法,它是由被稱為操作碼的單字節(jié)指令組成的序列。每個操作碼后面都跟著一個或者多個操作數(shù)(這一點(diǎn)很類似匯編語言的指令)。操作數(shù)用于在java虛擬機(jī)執(zhí)行操作碼指令時提供所需的額外的數(shù)據(jù)。執(zhí)行字節(jié)碼時,依序執(zhí)行每個操作碼,這樣就在java虛擬機(jī)內(nèi)部形成了執(zhí)行的線程。每個線程被授予自己的java棧。這個棧就是由不同的棧幀組成的。每一個方法的調(diào)用將獲得一個自己的棧幀(其實就是一個內(nèi)存片段),其中存儲著局部變量和計算的中間結(jié)果。在棧幀中用于存儲方法的中間結(jié)果的部分被稱為該方法的操作數(shù)棧。操作碼和它的(可選)操作數(shù)可能指存儲在操作數(shù)棧中的數(shù)據(jù)或者存儲在方法棧幀中的局部變量中的數(shù)據(jù)。這樣,在執(zhí)行一個操作碼時,除了可以使用緊隨其后的操作數(shù),虛擬機(jī)還可以使用操作數(shù)棧中的數(shù)據(jù),或存儲在方法棧幀中的局部變量中的數(shù)據(jù),或兩者都使用。

字節(jié)碼驗證要校驗直接碼流符合java的操作碼和操作數(shù)能夠被java虛擬機(jī)安全地執(zhí)行。

 

4符號引用的驗證

java虛擬機(jī)將追蹤直接碼流中的符號引用,并且確保符號應(yīng)用的資源可用。如果該資源不可用并不立即拋出noclassdeffounderror錯誤,而是在運(yùn)行時,這個類被首次引用時才拋出。

動態(tài)連接是將一個符號引用解析為直接引用的過程。當(dāng)java虛擬機(jī)執(zhí)行字節(jié)碼時,如果遇到一個操作碼,這個操作碼第一次使用一個指向另一個類的引用,那么java虛擬機(jī)就要解析這個引用。

1)查找被引用的類,如果必要的話就裝載它。

2)將符號引用替換為直接引用,例如一個指向一個類,方法或者字段的指針或者偏移量。

 

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多