freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

java虛擬機(jī)詳解-文庫吧

2025-06-13 08:27 本頁面


【正文】 60。u2 fields_count。field_info fields[fields_count]。u2 methods_count。method_info methods[methods_count]。u2 attributes_count。attribute_info attributes[attributes_count]。}需要詳細(xì)了解的話,可以仔細(xì)閱讀《JVM Specification》的第四章“The class File Format”,這里不再詳細(xì)說明。友情提示:Class Loader只管加載,只要符合文件結(jié)構(gòu)就加載,至于說能不能運(yùn)行,則不是它負(fù)責(zé)的,那是由Execution Engine負(fù)責(zé)的。qExecution Engine執(zhí)行引擎執(zhí)行引擎也叫做解釋器(Interpreter),負(fù)責(zé)解釋命令,提交操作系統(tǒng)執(zhí)行。qNative Interface本地接口本地接口的作用是融合不同的編程語言為Java所用,它的初衷是融合C/C++程序,Java誕生的時(shí)候是C/C++橫行的時(shí)候,要想立足,必須有一個(gè)聰明的、睿智的調(diào)用C/C++程序,于是就在內(nèi)存中專門開辟了一塊區(qū)域處理標(biāo)記為native的代碼,它的具體做法是Native Method Stack中登記native方法,在Execution Engine執(zhí)行時(shí)加載native libraies。目前該方法使用的是越來越少了,除非是與硬件有關(guān)的應(yīng)用,比如通過Java程序驅(qū)動(dòng)打印機(jī),或者Java系統(tǒng)管理生產(chǎn)設(shè)備,在企業(yè)級(jí)應(yīng)用中已經(jīng)比較少見,因?yàn)楝F(xiàn)在的異構(gòu)領(lǐng)域間的通信很發(fā)達(dá),比如可以使用Socket通信,也可以使用Web Service等等,不多做介紹。qRuntime data area運(yùn)行數(shù)據(jù)區(qū)運(yùn)行數(shù)據(jù)區(qū)是整個(gè)JVM的重點(diǎn)。我們所有寫的程序都被加載到這里,之后才開始運(yùn)行,Java生態(tài)系統(tǒng)如此的繁榮,得益于該區(qū)域的優(yōu)良自治,下一章節(jié)詳細(xì)介紹之。整個(gè)JVM框架由加載器加載文件,然后執(zhí)行器在內(nèi)存中處理數(shù)據(jù),需要與異構(gòu)系統(tǒng)交互是可以通過本地接口進(jìn)行,瞧,一個(gè)完整的系統(tǒng)誕生了!2 JVM的內(nèi)存管理所有的數(shù)據(jù)和程序都是在運(yùn)行數(shù)據(jù)區(qū)存放,它包括以下幾部分:qStack棧棧也叫棧內(nèi)存,是Java程序的運(yùn)行區(qū),是在線程創(chuàng)建時(shí)創(chuàng)建,它的生命期是跟隨線程的生命期,線程結(jié)束棧內(nèi)存也就釋放,對(duì)于棧來說不存在垃圾回收問題,只要線程一結(jié)束,該棧就Over。問題出來了:棧中存的是那些數(shù)據(jù)呢?又什么是格式呢?棧中的數(shù)據(jù)都是以棧幀(Stack Frame)的格式存在,棧幀是一個(gè)內(nèi)存區(qū)塊,是一個(gè)數(shù)據(jù)集,是一個(gè)有關(guān)方法(Method)和運(yùn)行期數(shù)據(jù)的數(shù)據(jù)集,當(dāng)一個(gè)方法A被調(diào)用時(shí)就產(chǎn)生了一個(gè)棧幀F(xiàn)1,并被壓入到棧中,A方法又調(diào)用了B方法,于是產(chǎn)生棧幀F(xiàn)2也被壓入棧,執(zhí)行完畢后,先彈出F2棧幀,再彈出F1棧幀,遵循“先進(jìn)后出”原則。那棧幀中到底存在著什么數(shù)據(jù)呢?棧幀中主要保存3類數(shù)據(jù):本地變量(Local Variables),包括輸入?yún)?shù)和輸出參數(shù)以及方法內(nèi)的變量;棧操作(Operand Stack),記錄出棧、入棧的操作;棧幀數(shù)據(jù)(Frame Data),包括類文件、方法等等。光說比較枯燥,我們畫個(gè)圖來理解一下Java棧,如下圖所示:圖示在一個(gè)棧中有兩個(gè)棧幀,棧幀2是最先被調(diào)用的方法,先入棧,然后方法2又調(diào)用了方法1,棧幀1處于棧頂?shù)奈恢?,棧?處于棧底,執(zhí)行完畢后,依次彈出棧幀1和棧幀2,線程結(jié)束,棧釋放。qHeap堆內(nèi)存一個(gè)JVM實(shí)例只存在一個(gè)堆類存,堆內(nèi)存的大小是可以調(diào)節(jié)的。類加載器讀取了類文件后,需要把類、方法、常變量放到堆內(nèi)存中,以方便執(zhí)行器執(zhí)行,堆內(nèi)存分為三部分:Permanent Space永久存儲(chǔ)區(qū)永久存儲(chǔ)區(qū)是一個(gè)常駐內(nèi)存區(qū)域,用于存放JDK自身所攜帶的Class,Interface的元數(shù)據(jù),也就是說它存儲(chǔ)的是運(yùn)行環(huán)境必須的類信息,被裝載進(jìn)此區(qū)域的數(shù)據(jù)是不會(huì)被垃圾回收器回收掉的,關(guān)閉JVM才會(huì)釋放此區(qū)域所占用的內(nèi)存。Young Generation Space新生區(qū)新生區(qū)是類的誕生、成長、消亡的區(qū)域,一個(gè)類在這里產(chǎn)生,應(yīng)用,最后被垃圾回收器收集,結(jié)束生命。新生區(qū)又分為兩部分:伊甸區(qū)(Eden space)和幸存者區(qū)(Survivor pace),所有的類都是在伊甸區(qū)被new出來的。幸存區(qū)有兩個(gè):0區(qū)(Survivor 0 space)和1區(qū)(Survivor 1 space)。當(dāng)伊甸園的空間用完時(shí),程序又需要?jiǎng)?chuàng)建對(duì)象,JVM的垃圾回收器將對(duì)伊甸園區(qū)進(jìn)行垃圾回收,將伊甸園區(qū)中的不再被其他對(duì)象所引用的對(duì)象進(jìn)行銷毀。然后將伊甸園中的剩余對(duì)象移動(dòng)到幸存0區(qū)。若幸存0區(qū)也滿了,再對(duì)該區(qū)進(jìn)行垃圾回收,然后移動(dòng)到1區(qū)。那如果1區(qū)也滿了呢?再移動(dòng)到養(yǎng)老區(qū)。Tenure generation space養(yǎng)老區(qū)養(yǎng)老區(qū)用于保存從新生區(qū)篩選出來的JAVA對(duì)象,一般池對(duì)象都在這個(gè)區(qū)域活躍。三個(gè)區(qū)的示意圖如下:qMethod Area方法區(qū)方法區(qū)是被所有線程共享,該區(qū)域保存所有字段和方法字節(jié)碼,以及一些特殊方法如構(gòu)造函數(shù),接口代碼也在此定義。qPC Register程序計(jì)數(shù)器每個(gè)線程都有一個(gè)程序計(jì)數(shù)器,就是一個(gè)指針,指向方法區(qū)中的方法字節(jié)碼,由執(zhí)行引擎讀取下一條指令。qNative Method Stack本地方法棧3 JVM相關(guān)問題問:堆和棧有什么區(qū)別答:堆是存放對(duì)象的,但是對(duì)象內(nèi)的臨時(shí)變量是存在棧內(nèi)存中,如例子中的methodVar是在運(yùn)行期存放到棧中的。棧是跟隨線程的,有線程就有棧,堆是跟隨JVM的,有JVM就有堆內(nèi)存。問:堆內(nèi)存中到底存在著什么東西?答:對(duì)象,包括對(duì)象變量以及對(duì)象方法。問:類變量和實(shí)例變量有什么區(qū)別?答:靜態(tài)變量是類變量,非靜態(tài)變量是實(shí)例變量,直白的說,有static修飾的變量是靜態(tài)變量,沒有static修飾的變量是實(shí)例變量。靜態(tài)變量存在方法區(qū)中,實(shí)例變量存在堆內(nèi)存中。問:我聽說類變量是在JVM啟動(dòng)時(shí)就初始化好的,和你這說的不同呀!答:那你是道聽途說,信我的,沒錯(cuò)。問:Java的方法(函數(shù))到底是傳值還是傳址?答:都不是,是以傳值的方式傳遞地址,具體的說原生數(shù)據(jù)類型傳遞的值,引用類型傳遞的地址。對(duì)于原始數(shù)據(jù)類型,JVM的處理方法是從Method Area或Heap中拷貝到Stack,然后運(yùn)行frame中的方法,運(yùn)行完畢后再把變量指拷貝回去。問:為什么會(huì)產(chǎn)生OutOfMemory產(chǎn)生?答:一句話:Heap內(nèi)存中沒有足夠的可用內(nèi)存了。這句話要好好理解,不是說Heap沒有內(nèi)存了,是說新申請(qǐng)內(nèi)存的對(duì)象大于Heap空閑內(nèi)存,比如現(xiàn)在Heap還空閑1M,于是就會(huì)報(bào)OutOfMemory了,于是就只出現(xiàn)一次OutOfMemory,GC也正常了,看起來像偶發(fā)事件,就是這么回事。但如果此時(shí)GC沒有回收就會(huì)產(chǎn)生掛起情況,系統(tǒng)不響應(yīng)了。問:我產(chǎn)生的對(duì)象不多呀,為什么還會(huì)產(chǎn)生OutOfMemory?答:你繼承層次忒多了,Heap中產(chǎn)生的對(duì)象是先產(chǎn)生父類,然后才產(chǎn)生子類,明白不?問:OutOfMemory錯(cuò)誤分幾種?答:分兩種,分別是“OutOfMemoryError:java heap size”和”O(jiān)utOfMemoryError: PermGen space”,兩種都是內(nèi)存溢出,heap size是說申請(qǐng)不到新的內(nèi)存了,這個(gè)很常見,檢查應(yīng)用或調(diào)整堆內(nèi)存大小。“PermGen space”是因?yàn)橛谰么鎯?chǔ)區(qū)滿了,這個(gè)也很常見,一般在熱發(fā)布的環(huán)境中出現(xiàn),是因?yàn)槊看伟l(fā)布應(yīng)用系統(tǒng)都不重啟,久而久之永久存儲(chǔ)區(qū)中的死對(duì)象太多導(dǎo)致新對(duì)象無法申請(qǐng)內(nèi)存,一般重新啟動(dòng)一下即可。問:為什么會(huì)產(chǎn)生StackOverflowError?答:因?yàn)橐粋€(gè)線程把Stack內(nèi)存全部耗盡了,一般是遞歸函數(shù)造成的。問:一個(gè)機(jī)器上可以看多個(gè)JVM嗎?JVM之間可以互訪嗎?答:可以多個(gè)JVM,只要機(jī)器承受得了。JVM之間是不可以互訪,你不能在AJVM中訪問BJVM的Heap內(nèi)存,這是不可能的。在以前老版本的JVM中,會(huì)出現(xiàn)AJVM Crack后影響到BJVM,現(xiàn)在版本非常少見。問:為什么Java要采用垃圾回收機(jī)制,而不采用C/C++的顯式內(nèi)存管理?答:為了簡單,內(nèi)存管理不是每個(gè)程序員都能折騰好的。問:為什么你沒有詳細(xì)介紹垃圾回收機(jī)制?答:垃圾回收機(jī)制每個(gè)JVM都不同,JVM Specification只是定義了要自動(dòng)釋放內(nèi)存,也就是說它只定義了垃圾回收的抽象方法,具體怎么實(shí)現(xiàn)各個(gè)廠商都不同,算法各異,這東西實(shí)在沒必要深入。問:JVM中到底哪些區(qū)域是共享的?哪些是私有的?答:Heap和Method Area是共享的,其他都是私有的,問:什么是JIT,你怎么沒說?答:JIT是指Just In Time,有的文檔把JIT作為JVM的一個(gè)部件來介紹,有的是作為執(zhí)行引擎的一部分來介紹,這都能理解。Java剛誕生的時(shí)候是一個(gè)解釋性語言,別噓,即使編譯成了字節(jié)碼(byte code)也是針對(duì)JVM的,它需要再次翻譯成原生代碼(native code)才能被機(jī)器執(zhí)行,于是效率的擔(dān)憂就提出來了。Sun為了解決該問題提出了一套新的機(jī)制,好,你想編譯成原生代碼,沒問題,我在JVM上提供一個(gè)工具,把字節(jié)碼編譯成原生碼,下次你來訪問的時(shí)候直接訪問原生碼就成了,于是JIT就誕生了,就這么回事。問:JVM還有哪些部分是你沒有提到的?答:JVM是一個(gè)異常復(fù)雜的東西,寫一本磚頭書都不為過,還有幾個(gè)要說明的:常量池(constant pool):按照順序存放程序中的常量,并且進(jìn)行索引編號(hào)的區(qū)域。比如int i =100,這個(gè)100就放在常量池中。安全管理器(Security Manager):提供Java運(yùn)行期的安全控制,防止惡意攻擊,比如指定讀取文件,寫入文件權(quán)限,網(wǎng)絡(luò)訪問,創(chuàng)建進(jìn)程等等,Class Loader在Security Manager認(rèn)證通過后才能加載class文件的。方法索引表(Methods table),記錄的是每個(gè)method的地址信息,Stack和Heap中的地址指針其實(shí)是指向Methods table地址。問:()?答:因?yàn)轱@式聲明是做堆內(nèi)存全掃描,也就是Full GC,是需要停止所有的活動(dòng)的(StopThe World Collection),你的應(yīng)用能承受這個(gè)嗎?問:JVM有哪些調(diào)整參數(shù)?答:非常多,自己去找,堆內(nèi)存、棧內(nèi)存的大小都可以定義,甚至是堆內(nèi)存的三個(gè)部分、新生代的各個(gè)比例都能調(diào)整。JVM內(nèi)存管理:深入Java內(nèi)存區(qū)域與OOMJava與C++之間有一堵由內(nèi)存動(dòng)態(tài)分配和垃圾收集技術(shù)所圍成的高墻,墻外面的人想進(jìn)去,墻里面的人卻想出來。概述:對(duì)于從事C、C++程序開發(fā)的開發(fā)人員來說,在內(nèi)存管理領(lǐng)域,他們即是擁有最高權(quán)力的皇帝又是執(zhí)行最基礎(chǔ)工作的勞動(dòng)人民——擁有每一個(gè)對(duì)象的“所有權(quán)”,又擔(dān)負(fù)著每一個(gè)對(duì)象生命開始到終結(jié)的維護(hù)責(zé)任。對(duì)于Java程序員來說,不需要在為每一個(gè)new操作去寫配對(duì)的delete/free,不容易出現(xiàn)內(nèi)容泄漏和內(nèi)存溢出錯(cuò)誤,看起來由JVM管理內(nèi)存一切都很美好。不過,也正是因?yàn)镴ava程序員把內(nèi)存控制的權(quán)力交給了JVM,一旦出現(xiàn)泄漏和溢出,如果不了解JVM是怎樣使用內(nèi)存的,那排查錯(cuò)誤將會(huì)是一件非常困難的事情。VM運(yùn)行時(shí)數(shù)據(jù)區(qū)域JVM執(zhí)行Java程序的過程中,會(huì)使用到各種數(shù)據(jù)區(qū)域,這些區(qū)域有各自的用途、創(chuàng)建和銷毀時(shí)間。根據(jù)《Java虛擬機(jī)規(guī)范(第二版)》(下文稱VM Spec)的規(guī)定,JVM包括下列幾個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū)域:(Program Counter Register):每一個(gè)Java線程都有一個(gè)程序計(jì)數(shù)器來用于保存程序執(zhí)行到當(dāng)前方法的哪一個(gè)指令,對(duì)于非Native方法,這個(gè)區(qū)域記錄的是正在執(zhí)行的VM原語的地址,如果正在執(zhí)行的是Natvie方法,這個(gè)區(qū)域則為空(undefined)。此內(nèi)存區(qū)域是唯一一個(gè)在VM Spec中沒有規(guī)定任何OutOfMemoryError情況的區(qū)域。(Java Virtual Machine Stacks)與程序計(jì)數(shù)器一樣,VM棧的生命周期也是與線程相同。VM棧描述的是Java方法調(diào)用的內(nèi)存模型:每個(gè)方法被執(zhí)行的時(shí)候,都會(huì)同時(shí)創(chuàng)建一個(gè)幀(Frame)用于存儲(chǔ)本地變量表、操作棧、動(dòng)態(tài)鏈接、方法出入口等信息。每一個(gè)方法的調(diào)用至完成,就意味著一個(gè)幀在VM棧中的入棧至出棧的過程。在后文中,我們將著重討論VM棧中本地變量表部分。經(jīng)常有人把Java內(nèi)存簡單的區(qū)分為堆內(nèi)存(Heap)和棧內(nèi)存(Stack),實(shí)際中的區(qū)域遠(yuǎn)比這種觀點(diǎn)復(fù)雜,這樣劃分只是說明與變量定義密切相關(guān)的內(nèi)存區(qū)域是這兩塊。其中所指的“堆”后面會(huì)專門描述,而所指的“棧”就是VM棧中各個(gè)幀的本地變量表部分。本地變量表存放了編譯期可知的各種標(biāo)量類型(boolean、byte、char、short、int、float、long、double)、對(duì)象引用(不是對(duì)象本身,僅僅是一個(gè)引用指針)、方法返回地址等。其中l(wèi)ong和double會(huì)占用2個(gè)本地變量空間(32bit),其余占用1個(gè)。本地變量表在進(jìn)入方法時(shí)進(jìn)行分配,當(dāng)進(jìn)入一個(gè)方法時(shí),這個(gè)方法需要在幀中分配多大的本地變量是一件完全確定的事情,在方法運(yùn)行期間不改變本地變量表的大小。在VM Spec中對(duì)這個(gè)區(qū)域規(guī)定了2中異常狀況:如果線程請(qǐng)求的棧深度大于虛擬機(jī)所允許的深度,將拋出StackOverflowError異常;如果VM棧可以動(dòng)態(tài)擴(kuò)展(VM Spec中允許固定長度的VM棧),當(dāng)擴(kuò)展時(shí)無法申請(qǐng)到足夠內(nèi)存則拋出OutOfMemoryError異常。(Native Method Stacks)本地方法棧與VM棧所發(fā)揮作用是類似的,只不過VM棧為虛擬機(jī)運(yùn)行VM原語服務(wù),而本地方法棧是為虛擬機(jī)使用到的Native方法服務(wù)。它的實(shí)現(xiàn)的語言、方式與結(jié)構(gòu)并沒有強(qiáng)制規(guī)定,甚至有的虛擬機(jī)(譬如Sun Hotspot虛擬機(jī))直接就把本地方法棧和VM棧合二為一。和VM棧一樣,這個(gè)區(qū)域也會(huì)拋出StackOverflowError和OutOfMemoryError異常。(Java Heap)對(duì)于絕大多數(shù)應(yīng)用來說,Java堆是虛擬機(jī)管理最大的一塊內(nèi)存。Java堆是被所有線程共享的,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。Java堆的唯一目的就是存放對(duì)象實(shí)例,絕大部分的對(duì)象實(shí)例都在這里分配。這一點(diǎn)在VM Spec中的描述是:所有的實(shí)例以及數(shù)組都在堆上分配(原文:The heap is the runtime data area from which memory for all class instances and arrays is allocated),但是在逃逸分析和標(biāo)量替換優(yōu)化技術(shù)出現(xiàn)后,VM Spec的描述就顯得并不那么準(zhǔn)確了。Java堆內(nèi)還有更細(xì)致的劃分:新生代、老年代,再細(xì)致一點(diǎn)的:eden、from survivor、to survivor,甚至更細(xì)粒度的本地線程分配緩沖(TLAB)等,無論對(duì)Java堆如何劃分,目的都是為了更好的回收內(nèi)存,或者更快的分配內(nèi)存,在本章中我們僅僅針對(duì)內(nèi)存區(qū)域的作用進(jìn)行討論,Java堆中的上述各個(gè)區(qū)域的細(xì)節(jié),可參見本文第二章《JVM內(nèi)存管理:深入垃圾收集器與內(nèi)存分配策略》。根據(jù)VM Spec的要求,Java堆可以處于物理上不連續(xù)的內(nèi)存空間,它邏輯上是連續(xù)的即可,就像我們的磁盤空間一樣。實(shí)現(xiàn)時(shí)可以選擇實(shí)現(xiàn)成固定大小的,也可以是可擴(kuò)展的,不過當(dāng)前所有商業(yè)的虛擬機(jī)都是按照可擴(kuò)展來實(shí)現(xiàn)的(通過Xmx和Xms控制)。如果在堆中無法分配內(nèi)存,并且堆也無法再擴(kuò)展時(shí),將會(huì)拋出OutOfMemoryError異常。(Method Area)叫“方法區(qū)”可能認(rèn)識(shí)它的人還不太多,如果叫永久代(Permanent Generation)它的粉絲也許就多了。它還有個(gè)別名叫做NonHeap(非堆),但是VM Spec上則描述方法區(qū)為堆的一個(gè)邏輯部分(原文:the method area is logically part of the heap),這個(gè)名字的問題還真容易令人產(chǎn)生誤解,我們?cè)谶@里就不糾結(jié)了。方法區(qū)中存放了每個(gè)Class的結(jié)構(gòu)信息,包括常量池、字段描述、方法描述等等。VM Space描述中對(duì)這個(gè)區(qū)域的限制非常寬松,除了和Java堆一樣不需要連續(xù)的內(nèi)存,也可以選擇固定大小或者可擴(kuò)展外,甚至可以選擇不實(shí)現(xiàn)垃圾收集。相對(duì)來說,垃圾收集行為在這個(gè)區(qū)域是相對(duì)比較少發(fā)生的,但并不是某些描述那樣永久代不會(huì)發(fā)生GC(至少對(duì)當(dāng)前主流的商業(yè)JVM實(shí)現(xiàn)來說是如此),這里的GC主要是對(duì)常量池的回收和對(duì)類的卸載,雖然回收的“成績”一般也比較差強(qiáng)人意,
點(diǎn)擊復(fù)制文檔內(nèi)容
范文總結(jié)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1