久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Java虛擬機(jī)內(nèi)部體系結(jié)構(gòu)(摘記,,待完善):)

 看風(fēng)景D人 2014-09-19

Java虛擬機(jī)體內(nèi)部系結(jié)構(gòu)包括class文件、類裝載子系統(tǒng),、運(yùn)行時數(shù)據(jù)區(qū),、之行引擎、本地方法調(diào)用結(jié)構(gòu),,其中運(yùn)行時數(shù)據(jù)區(qū)包括方法區(qū),、堆、Java棧,、程序計數(shù)器,、本地方法棧等。具體結(jié)構(gòu)如下圖所示(摘自Inside Java Virtual Machine):


 

1.       class文件

Java中,,所有源文件都編譯成二進(jìn)制的字節(jié)碼,,然后由虛擬機(jī)裝載運(yùn)行。一般這樣的字節(jié)碼是以class文件的形式存在,。在運(yùn)行時,,由ClassLoader類(System ClassLoader or User-defined ClassLoader)找到對應(yīng)的class文件,讀取其中的字節(jié)碼,,然后交由虛擬機(jī)解析運(yùn)行,。

class文件中,包含了定義一個類或接口的所有信息,,包括類名,、訪問權(quán)限、父類名,、繼承的所有接口,、所有字段、所有方法,、方法中的代碼,、屬性等信息,并且每個class文件的開頭還包含了魔術(shù)值和版本信息,,魔術(shù)值用以標(biāo)識當(dāng)前的字節(jié)碼是合法的字節(jié)碼,,版本表示生成當(dāng)前字節(jié)碼的編譯器版本,從而虛擬機(jī)獲知其版本而做特定處理,,如果對于虛擬機(jī)不支持的字節(jié)碼版本號拒絕加載,。

class文件中,很多信息都是以字符串的形式存放,,比如對外部類成員或方法的引用,,這些字符串信息在鏈接的時候由虛擬機(jī)解析。每個Java類,,不管是包成員類還是內(nèi)部類都會生成一個單獨(dú)的class文件,,因而class文件是相對獨(dú)立的,。詳細(xì)信息參考class文件格式,。

 

2.       類裝載子系統(tǒng)

類裝載子系統(tǒng)負(fù)責(zé)查找class文件,,讀取字節(jié)碼,做部分簡單的檢驗(yàn),,如魔數(shù)是否正確,,版本是否受支持,各種數(shù)據(jù)格式是否正確等,。部分解析后的字節(jié)碼數(shù)據(jù)存放到方法區(qū)中,,最后創(chuàng)建字節(jié)碼代表的類或接口的Class實(shí)例。

Java中,,類裝載系統(tǒng)是通過ClassLoader來完成的,。虛擬機(jī)規(guī)范中,定義了啟動類裝載器和用于定義類裝載器,。在sun提供的虛擬機(jī)中,,包括了啟動類裝載器、擴(kuò)展類裝載器,、系統(tǒng)類裝載器,、用戶定義類裝載器。他們以父子鏈的方式組織在一起,。除了啟動類裝載器,,其他的裝載器都是ClassLoader的子類。ClassLoader定義了一些方法可以幫助用戶定義自己的類裝載器,,如defineClass等,。詳情參考Java中的ClassLoader

 

如何卸載類數(shù)據(jù),?(第七章)

 

3.       運(yùn)行時數(shù)據(jù)區(qū)

運(yùn)行時數(shù)據(jù)區(qū)保存了所有在運(yùn)行時的信息,。包括方法區(qū)、Java棧,、堆,、程序寄存器、本地方法棧等,。其中方法區(qū)和堆只在虛擬機(jī)中保存一份實(shí)例,,因而需要處理多線程的同步問題;Java棧,、程序寄存器是每個線程中有單獨(dú)的實(shí)例,,因而對不同的線程,他們的數(shù)據(jù)是私有的,。

 

3.1   方法區(qū)

方法區(qū)中保存了讀取的字節(jié)碼信息(包括常量池,,靜態(tài)方法和靜態(tài)成員信息),、字節(jié)碼代表的Class類實(shí)例、一個指向加載它的ClassLoader實(shí)例,。

Java程序可以有兩種方式來獲取某個類的Class實(shí)例:

1.       Class.forName()方法

2.       Object.getClass()方法

通過Class實(shí)例獲取和該類或接口相關(guān)的任何信息,。參考Class類的定義。

(注:對有啟動ClassLoader加載的類,,Class方法中的getClassLoader方法返回null

 

為加快執(zhí)行速度,,可以在方法區(qū)中引入方法表機(jī)制,記錄能被外界調(diào)用的該類的實(shí)例方法,,包括父類中繼承下來的方法,。(第八章詳細(xì)介紹?)

 

方法區(qū)中根據(jù)類名搜索類信息,,算法:散列,、搜索樹等。

 

3.2   Java

虛擬機(jī)為每個線程生成一個Java棧,,因而對不同的線程,,棧內(nèi)的數(shù)據(jù)都是私有的。Java棧由棧幀組成,,Java棧的操作只有兩種,,壓入棧幀和彈出棧幀。線程中每個方法的調(diào)用都會在Java棧壓入一個棧幀,;每次方法返回(正常方法或拋異常返回),,該方法對應(yīng)的棧幀都會從棧中彈出。

 

3.2.1          棧幀

棧幀由操作數(shù)棧,、局部變量區(qū)和棧幀數(shù)據(jù)組成,。由于Java中的指令是基于棧而設(shè)計的,因而很多指令的默認(rèn)操作數(shù)就是操作數(shù)棧中的數(shù)據(jù),。操作數(shù)棧用于保存指令的操作數(shù)和指令操作后的結(jié)果,。

局部變量區(qū)用于保存當(dāng)前方法的局部變量。

棧幀數(shù)據(jù)區(qū)則保存當(dāng)前棧幀的信息,,如指向當(dāng)前類常量池的指針,,用于操作數(shù)為常量池索引的指令;還有一些和特定虛擬機(jī)實(shí)現(xiàn)相關(guān)的信息和調(diào)試信息,。

 

3.3   程序寄存器

每個線程在執(zhí)行時都會保存當(dāng)前指令的下一條指令的地址,,以控制程序的之行流程。

 

3.4  

堆保存了程序在運(yùn)行時的所有對象,。在Java中,,所有的對象都是保存在堆中的,而外部通過對象的引用來訪問對象,。由于Java存在垃圾回收器,,因而Java對象可能被移動,,以減少內(nèi)存碎片。其中一種實(shí)現(xiàn)可以很好的解決移動對象而需要改變所有該對象的引用變量的技術(shù),,即將堆分為句柄池和對象池,。對象池中的對象保存了對象的真正內(nèi)容,而句柄池中的項包含兩個指針,,一個指向?qū)ο?,一個指向類數(shù)據(jù),。一個對象引用就是指向句柄的之戰(zhàn),。這樣當(dāng)需要移動對象時,只要改變句柄池中指向?qū)ο蟮闹羔樦导纯?。然而這種設(shè)計是以犧牲速度為代價的,,因?yàn)檫@樣每次訪問對象就要多經(jīng)歷一次指針定位。

 

在某些垃圾回收器實(shí)現(xiàn)中,,對象需要額外的信息,,如果引用計數(shù)的垃圾收集器,需要為每個對象記錄引用計數(shù)信息,;而對另外有些機(jī)制,,則可能需要暫時保存某些數(shù)據(jù)。這些額外的數(shù)據(jù)可以保存在類中,,也可以在記錄在其他地方,。類似的還有同步機(jī)制中的數(shù)據(jù)和記錄是否已經(jīng)調(diào)用過finalize方法的信息。

 

Java中有指令用于在內(nèi)存中分配對象,,卻沒有顯式的指令來釋放內(nèi)存中的對象,。

 

3.5   本地方法棧

當(dāng)Java方法調(diào)用本地方法的時候,當(dāng)前線程的程序寄存器是不確定的值,。程序的執(zhí)行也轉(zhuǎn)向本地方法,。本地方法可以正常返回,也可以拋出異常,。拋出的異常會在調(diào)用該本地方法的指令中重新拋出,。

 

4.       執(zhí)行引擎

每個用戶線程(即不包括垃圾回收線程等)都有一個執(zhí)行引擎實(shí)例,用以執(zhí)行字節(jié)碼指令,。

 

5.       本地方法接口

Java程序可以通過本地方法接口來調(diào)用本地方法,。

                                                                                                                于2010-10-06

    本站是提供個人知識管理的網(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ā)表

    請遵守用戶 評論公約

    類似文章 更多