免费视频国产一区,高清av一区二区,国内精品国产成人http://www.aygfsteel.com/xujun7/category/39840.htmlzh-cnTue, 09 Jun 2009 08:29:16 GMTTue, 09 Jun 2009 08:29:16 GMT60java虛擬機(jī)學(xué)習(xí)筆記(三)Java虛擬機(jī)http://www.aygfsteel.com/xujun7/archive/2009/05/17/271124.htmleric_xueric_xuSun, 17 May 2009 08:03:00 GMThttp://www.aygfsteel.com/xujun7/archive/2009/05/17/271124.htmlhttp://www.aygfsteel.com/xujun7/comments/271124.htmlhttp://www.aygfsteel.com/xujun7/archive/2009/05/17/271124.html#Feedback0http://www.aygfsteel.com/xujun7/comments/commentRss/271124.htmlhttp://www.aygfsteel.com/xujun7/services/trackbacks/271124.html

Java虛擬機(jī)是由一個(gè)規(guī)范來定義的抽象計(jì)算機(jī)。

?   抽象的規(guī)范

?   具體的實(shí)現(xiàn)

?   運(yùn)行中的虛擬機(jī)實(shí)例

每個(gè)java程序都運(yùn)行于它自己的虛擬機(jī)實(shí)例中。

Java虛擬機(jī)的結(jié)構(gòu)分為:類裝載子系統(tǒng)http://www.zoomino.cn/static-ox/images/blank.gif,運(yùn)行時(shí)數(shù)據(jù)區(qū),執(zhí)行引擎,本地方法接口。其中運(yùn)行時(shí)數(shù)據(jù)區(qū)又分為:方法區(qū),堆,Java棧,PC寄存器,本地方法棧。

每個(gè)java虛擬機(jī)實(shí)例都有一個(gè)方法區(qū)和一個(gè)堆,由該虛擬機(jī)實(shí)例中所有線程所共享,對(duì)方法區(qū)的訪問必須設(shè)計(jì)成線程安全。

Java程序在運(yùn)行時(shí)創(chuàng)建的所有類實(shí)例或數(shù)組放與此。每創(chuàng)建一個(gè)JVM實(shí)例就有一個(gè)堆,該實(shí)例的所有線程都共享這個(gè)堆。

Java對(duì)象中包含的基本數(shù)據(jù)由它所屬的類及其所有超類聲明的實(shí)例變量組成。只要有對(duì)對(duì)象引用,虛擬機(jī)就必須快速定位對(duì)象實(shí)例的數(shù)據(jù)。另外,他也必須能通過該對(duì)象引用訪問相應(yīng)的類數(shù)據(jù)(存儲(chǔ)于方法區(qū)的類型信息)。因此在對(duì)象中通常會(huì)有一個(gè)指向方法區(qū)的指針。

一種可能的堆空間設(shè)計(jì)就是,把堆分為兩部分:一個(gè)句柄池,一個(gè)對(duì)象池。一個(gè)對(duì)象引用就是一個(gè)指向句柄池的本地指針。句柄池的每個(gè)條目有兩部分:一個(gè)指向?qū)嵗兞康闹羔槪粋€(gè)指向方法區(qū)類型數(shù)據(jù)的指針。這種方法有利碎片整理。但每次訪問對(duì)象實(shí)例變量都得進(jìn)行兩次指針轉(zhuǎn)換。

另一個(gè)設(shè)計(jì)方式是使對(duì)象指針直接指向一組數(shù)據(jù),而該數(shù)據(jù)包括對(duì)象實(shí)例數(shù)據(jù)以及指向方法區(qū)中的類數(shù)據(jù)指針。因此只需一個(gè)指針就可以訪問對(duì)象的實(shí)例數(shù)據(jù)。當(dāng)虛擬機(jī)為了減少內(nèi)存碎片而移動(dòng)對(duì)象時(shí),必須在整個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū)中更新指向被移動(dòng)對(duì)象的引用。

每個(gè)對(duì)象都可以有一個(gè)方法表,可以加快調(diào)用實(shí)例方法時(shí)的效率。Java虛擬機(jī)規(guī)范并不要求必須有。

方法區(qū)中存放被裝載的類型信息,該類型中的類(靜態(tài)http://www.zoomino.cn/static-ox/images/blank.gif)變量同樣也是存儲(chǔ)在方法區(qū)中。方法區(qū)大小可以在堆中自由分配,方法區(qū)可以被垃圾回收。

類型信息包括:

?   這個(gè)類型的全限定名。

?   這個(gè)類型的直接超類http://www.zoomino.cn/static-ox/images/blank.gif的全限定名(除非是java.lang.Object,無超類)

?   這個(gè)類型是類類型還是接口類型。

?   這個(gè)類型的訪問修飾符(public,abstract ...)

?   任何直接超接口的全限定名的有序列表

除了上面列出的基本類型信息外,虛擬機(jī)還為每個(gè)被裝載的類型存儲(chǔ)以下信息:

?   該類型的常量http://www.zoomino.cn/static-ox/images/blank.gif

?   字段信息

?   方法信息

?   除了常量以外所有類(靜態(tài))變量

?   一個(gè)到類ClassLoader的引用

?   一個(gè)到Class類的引用

每創(chuàng)建一個(gè)線程,都將有該線程自己的PC寄存器及一個(gè)java棧,每個(gè)線程只能訪問自己的PC寄存器和java棧,該線程如果正在執(zhí)行一個(gè)java方法,則PC寄存器的值是下一條被執(zhí)行的指令;java棧使用幀為單位保存線程的運(yùn)行狀態(tài)。

Java棧存儲(chǔ)每個(gè)線程中Java方法調(diào)用的狀態(tài)包括局部變量,被調(diào)用時(shí)傳進(jìn)來的參數(shù),返回值,運(yùn)算中間結(jié)果。
每當(dāng)線程調(diào)用一個(gè)Java方法時(shí),虛擬機(jī)都會(huì)在該線程的Java棧中壓入一個(gè)新幀。而這個(gè)新幀成為當(dāng)前幀。在執(zhí)行這個(gè)方法時(shí),它使用這個(gè)幀來存儲(chǔ)參數(shù)、局部變量、中間運(yùn)算結(jié)果等等數(shù)據(jù)。Java棧不連續(xù),可指定初始大小和最大最小值。

Java方法可以以兩種方式完成:正常返回return;通過拋出異常而中止。

Java虛擬機(jī)的兩種類裝載器:?jiǎn)?dòng)類裝載器和用戶自定義類裝載器。主要任務(wù)有:

?   裝載---查找并裝載類型的二進(jìn)制數(shù)據(jù)

?   連接---執(zhí)行驗(yàn)證,準(zhǔn)備,以及解析(可選)

驗(yàn)證:確保被導(dǎo)入類型的正確性

準(zhǔn)備:為類變量http://www.zoomino.cn/static-ox/images/blank.gif分配內(nèi)存,并將其初始化為默認(rèn)值

解析:把類型中的符號(hào)引用換為直接引用

?   初始化---把類變量初始化為正確的初始值

每個(gè)Java虛擬機(jī)都必須實(shí)現(xiàn)一個(gè)啟動(dòng)類裝載器。

用戶自定義類裝載器,盡管用戶自定義類裝載器是Java程序的一部分,但類ClassLoader中的四個(gè)方法是通往Java虛擬機(jī)的通道:

protected final Class<?> defineClass(String name, byte[] b, int off, int len);

protected final Class<?> defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain);

protected final Class<?> findSystemClass(String name);

protected final void resolveClass(Class<?> c);

任何java虛擬機(jī)實(shí)現(xiàn)都必須把這些方法連到內(nèi)部的類裝載器子系統(tǒng)中。

兩個(gè)重載的defineClass() 方法,接受一個(gè)byte[] b的字節(jié)數(shù)組作為輸入?yún)?shù),在b[off]b[off + len]之間的二進(jìn)制數(shù)據(jù)必須符合java class文件格式,class文件即線性二進(jìn)制數(shù)據(jù)流。name參數(shù)指定類型的全限定名,前一個(gè)defineClass將給類型賦以默認(rèn)的保護(hù)域,后一個(gè)類型保護(hù)域由protectionDomain指定。

findSystemClass()使用系統(tǒng)類裝載器裝載指定類型。

resolveClass()對(duì)class實(shí)例表示的類型進(jìn)行連接,defineClass()只是對(duì)類型進(jìn)行裝載

]]>
java虛擬機(jī)學(xué)習(xí)筆記(二)垃圾回收http://www.aygfsteel.com/xujun7/archive/2009/05/14/270696.htmleric_xueric_xuThu, 14 May 2009 12:37:00 GMThttp://www.aygfsteel.com/xujun7/archive/2009/05/14/270696.htmlhttp://www.aygfsteel.com/xujun7/comments/270696.htmlhttp://www.aygfsteel.com/xujun7/archive/2009/05/14/270696.html#Feedback0http://www.aygfsteel.com/xujun7/comments/commentRss/270696.htmlhttp://www.aygfsteel.com/xujun7/services/trackbacks/270696.html

釋放不再被程序使用的對(duì)象。檢測(cè)和回收。

垃圾檢測(cè):建立一個(gè)根對(duì)象的集合,并檢測(cè)從這些根對(duì)象開始的可觸及性來實(shí)現(xiàn)。任何被根對(duì)象引用的對(duì)象都是可觸及的,任何被活動(dòng)的對(duì)象引用的對(duì)象都是可觸及的。

引用計(jì)數(shù)收集器,引用計(jì)數(shù)無法檢測(cè)出循環(huán);跟蹤收集器,標(biāo)記并清除。清理對(duì)碎塊,壓縮收集器,設(shè)置間接對(duì)象引用層(對(duì)象句柄表),只需句柄更新新位置。

拷貝收集器,把所有活動(dòng)對(duì)象移動(dòng)到新區(qū)域。停止并拷貝,需要兩倍內(nèi)存,任何時(shí)候只能使用一半。

按代收集的收集器,把對(duì)象按照壽命分組,對(duì)最年幼的進(jìn)行最頻繁的垃圾收集。

漸進(jìn)式垃圾收集器,不試圖一次性發(fā)現(xiàn)并回收所有不可觸及的對(duì)象,而是每次發(fā)現(xiàn)并回收一部分。

火車算法

火車算法執(zhí)行的時(shí)候,或者收集最小數(shù)字火車中的最小數(shù)字車廂,或者收集整個(gè)最小數(shù)字火車。

如果整個(gè)火車都是垃圾對(duì)象,那么整個(gè)火車都被收集。否則,收集最小數(shù)字車廂。

收集最小數(shù)字車廂時(shí),把最小數(shù)字車廂內(nèi)部有被其他車廂引用的對(duì)象轉(zhuǎn)移到引用的車廂,如此循環(huán),最后收集整個(gè)車廂。

收集最小數(shù)字火車時(shí),把最小數(shù)字車廂內(nèi)部有被其他火車引用對(duì)象則會(huì)轉(zhuǎn)移到引用的火車,如此循環(huán),最后收集整個(gè)火車。

火車算法保證大型的循環(huán)數(shù)據(jù)會(huì)被完全收集。

記憶集合,指向車廂或火車內(nèi)對(duì)象的所有引用的集合。

終結(jié)方法,垃圾收集器在釋放對(duì)象前必須運(yùn)行。第二遍掃描,終結(jié)方法可能復(fù)活了某些不再被引用的對(duì)象。根結(jié)點(diǎn)不可觸及和終結(jié)對(duì)象不可觸及的對(duì)象可以立即被釋放。

對(duì)象可觸及性的生命周期

可觸及,可復(fù)活,不可觸及。

SoftReferenceWeakReferencePhantomReference 都是 java.lang.ref.Reference 類的子類。強(qiáng)引用與這三種弱引用之間最基本的差別是,強(qiáng)引用禁止引用目標(biāo)被垃圾收集,而那三種引用不禁止。

?   強(qiáng)可觸及 對(duì)象可以從根節(jié)點(diǎn)不通過任何引用對(duì)象搜索到。

?   軟可觸及 垃圾收集器可能回收軟可觸及的對(duì)象所占據(jù)的內(nèi)存。如果這發(fā)生了,它會(huì)清除所有到此軟可觸及對(duì)象的軟引用。當(dāng)垃圾收集器清除一個(gè)和引用隊(duì)列有關(guān)聯(lián)的軟引用對(duì)象時(shí),它把該軟引用對(duì)象加入隊(duì)列。

?   弱可觸及 垃圾收集器必須歸還弱可觸及對(duì)象所占據(jù)的內(nèi)存。這發(fā)生的時(shí)候,它會(huì)清除所有到此弱可觸及對(duì)象的弱引用。當(dāng)垃圾收集器清除一個(gè)和引用隊(duì)列有關(guān)聯(lián)的的弱引用對(duì)象時(shí),它把該弱引用對(duì)象加入隊(duì)列。

?   可復(fù)活的 對(duì)象既不是強(qiáng)可觸及、軟可觸及,也不是弱可觸及,但是仍然可能通過執(zhí)行某些終結(jié)方法復(fù)活到這幾種狀態(tài)之一。

?   影子可觸及 一旦某個(gè)被影子引用的對(duì)象變成影子可觸及狀態(tài),垃圾收集器立即把該引用對(duì)象加人隊(duì)列。垃圾收集器從不會(huì)清除一個(gè)影子引用,所有的影子引用都必須由程序明確地清除。

弱引用與軟引用的區(qū)別在于:只具有弱引用的對(duì)象擁有更短暫的生命周期。

軟引用可以創(chuàng)建內(nèi)存中的緩存,弱引用可以創(chuàng)建規(guī)范映射。

]]>
java虛擬機(jī)學(xué)習(xí)筆記(一)http://www.aygfsteel.com/xujun7/archive/2009/05/05/269003.htmleric_xueric_xuTue, 05 May 2009 07:44:00 GMThttp://www.aygfsteel.com/xujun7/archive/2009/05/05/269003.htmlhttp://www.aygfsteel.com/xujun7/comments/269003.htmlhttp://www.aygfsteel.com/xujun7/archive/2009/05/05/269003.html#Feedback0http://www.aygfsteel.com/xujun7/comments/commentRss/269003.htmlhttp://www.aygfsteel.com/xujun7/services/trackbacks/269003.html

Java體系結(jié)構(gòu)介紹

Java體系結(jié)構(gòu)包括:

?   Java語言

?   Java虛擬機(jī)

?   Java API

?   Java class文件

Java虛擬機(jī)的主要任務(wù)是裝載class文件并執(zhí)行其中的字節(jié)碼。Java虛擬機(jī)和java API一起組成java平臺(tái)。

Java方法和本地方法,java方法是平臺(tái)無關(guān)的,而本地方法不是。本地方法保存在動(dòng)態(tài)鏈接庫中,格式為各平臺(tái)專有的。通過本地方法,java程序可以直接訪問底層操作系統(tǒng)資源。Java本地接口JNI,使得本地方法在特定主機(jī)系統(tǒng)的java平臺(tái)上實(shí)現(xiàn)。

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

當(dāng)被裝載的類引用另一個(gè)類,虛擬機(jī)就會(huì)使用裝載第一個(gè)類的類裝載器裝載被引用的類,所以被裝載的類默認(rèn)情況下只能看到被同一類裝載器裝載的類。Java程序的每個(gè)類裝載器都有自己的命名空間。從不同源文件裝載的類可以被分隔在不同的命名空間中,這樣就可以控制任何從不同源文件中裝載的代碼之間的相互影響,特別是能夠阻止惡意代碼獲取訪問和破壞代碼的權(quán)限。

Java class文件

Java class文件為java程序提供獨(dú)立于底層平臺(tái)的二進(jìn)制文件,可以運(yùn)行在任何支持java虛擬機(jī)的平臺(tái)上。Java編譯器把java源文件指令翻譯成字節(jié)碼,即java虛擬機(jī)的“機(jī)器語言”。

Java API

每個(gè)主機(jī)平臺(tái)都明確實(shí)現(xiàn)了java虛擬機(jī)和java API,所以java程序就具有了平臺(tái)無關(guān)性的特點(diǎn)。Java API class文件為底層主機(jī)提供了具有平臺(tái)無關(guān)性的,標(biāo)準(zhǔn)接口的java程序。

Java語言

自動(dòng)垃圾回收,不再使用的對(duì)象未被釋放導(dǎo)致內(nèi)存泄漏,多次釋放同一個(gè)對(duì)象導(dǎo)致內(nèi)存沖突。Java運(yùn)行時(shí)強(qiáng)制執(zhí)行嚴(yán)格的類型規(guī)則,不可能直接管理內(nèi)存而導(dǎo)致內(nèi)存錯(cuò)誤。

Java對(duì)對(duì)象引用的檢查,C++空指針會(huì)導(dǎo)致程序崩潰,而java空引用只會(huì)拋出異常。

]]>
主站蜘蛛池模板: 平度市| 麻城市| 铜川市| 涿州市| 兴业县| 嘉定区| 张掖市| 卢氏县| 收藏| 铁岭市| 若尔盖县| 噶尔县| 承德市| 沛县| 石狮市| 南乐县| 会昌县| 浮山县| 大同市| 扎鲁特旗| 当涂县| 新沂市| 天水市| 白沙| 观塘区| 临西县| 马龙县| 淮南市| 弥勒县| 卢湾区| 红原县| 临西县| 靖江市| 高尔夫| 牡丹江市| 福泉市| 江孜县| 刚察县| 资溪县| 望江县| 聊城市|