jvm內(nèi)存管理:深入java內(nèi)存區(qū)域與oom

jvm內(nèi)存管理:深入java內(nèi)存區(qū)域與oom

ID:32585456

大?。?3.68 KB

頁數(shù):8頁

時(shí)間:2019-02-13

jvm內(nèi)存管理:深入java內(nèi)存區(qū)域與oom_第1頁
jvm內(nèi)存管理:深入java內(nèi)存區(qū)域與oom_第2頁
jvm內(nèi)存管理:深入java內(nèi)存區(qū)域與oom_第3頁
jvm內(nèi)存管理:深入java內(nèi)存區(qū)域與oom_第4頁
jvm內(nèi)存管理:深入java內(nèi)存區(qū)域與oom_第5頁
資源描述:

《jvm內(nèi)存管理:深入java內(nèi)存區(qū)域與oom》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。

1、Java與C++Z間有一堵由內(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ì)象的14所有權(quán)J乂擔(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)泄

2、漏和溢出,如果不了解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ī)范(第二版)》(下文稱VMSpec)的規(guī)定,JVM包括下列兒個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū)域:1.程序計(jì)數(shù)器(ProgramCounterRegister):每一個(gè)Java線程都有一個(gè)程序計(jì)數(shù)器來用于保存程序執(zhí)行到當(dāng)詢方法的哪一個(gè)指令,對(duì)于非Native方法,這個(gè)區(qū)域記錄的是正在執(zhí)行的VM原語的地址,如果止在執(zhí)行的是N

3、atvie方法,這個(gè)區(qū)域則為空(undefined)。此內(nèi)存區(qū)域是唯個(gè)在VMSpec中沒有規(guī)定任何OutOfMemoryError情況的區(qū)域。2.Java虎擬機(jī)棧(JavaVirtualMachineStacks)與程序計(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棧中

4、本地變量表部分。經(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ì)專門描述,而所指的“?!本褪荲M棧中各個(gè)幀的木地變臺(tái)表部分。木地變臺(tái)表存放了編譯期可知的各種標(biāo)臺(tái)類型(boolean,byte、char、short,int、float、long>double)>對(duì)象引用(不是對(duì)象木身,僅僅是一個(gè)引用指針)、方法返冋地址等。其中l(wèi)ong和double會(huì)占用2個(gè)本地變量空間(32bit

5、),其余占川1個(gè)。本地變量表在進(jìn)入方法時(shí)進(jìn)行分配,當(dāng)進(jìn)入一個(gè)方法時(shí),這個(gè)方法需要在幀中分配多大的本地變量是一件完全確定的事情,在方法運(yùn)行期間不改變本地變量表的大小。在VMSpec中對(duì)這個(gè)區(qū)域規(guī)定了2中異常狀況:如果線程請(qǐng)求的棧深度大于虛擬機(jī)所允許的深度,將拋出StackOverflowError異常;如果VM棧町以動(dòng)態(tài)擴(kuò)展(VMSpec中允許固定長度的VM棧),當(dāng)擴(kuò)展時(shí)無法屮請(qǐng)到足夠內(nèi)存則拋出OutOfMemoryError并常。3.本地方法棧(NativeMethodStacks)本地方法棧與VM棧所發(fā)揮作用

6、是類似的,只不過VM棧為虛擬機(jī)運(yùn)行VM原語服務(wù),而本地方法棧是為虛擬機(jī)使用到的Native方法服務(wù)。它的實(shí)現(xiàn)的語言、方式與結(jié)構(gòu)并沒冇強(qiáng)制規(guī)泄,甚至有的虛擬機(jī)(譬如SunHotspot虛擬機(jī))直接就把木地方法棧和VM棧合二為一。和VM棧一樣,這個(gè)區(qū)域也會(huì)拋出StackOverflowError和OutOfMemoryError異常。1.Java堆(JavaHeap)對(duì)于絕大多數(shù)應(yīng)用來說,Java堆是虛擬機(jī)管理最大的一塊內(nèi)存。Java堆是被所有線程共享的,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。Java堆的唯一目的就是存放對(duì)象實(shí)例,絕

7、大部分的對(duì)象實(shí)例都在這里分配。這一點(diǎn)在VMSpec中的描述是:所有的實(shí)例以及數(shù)組都在堆上分配(原文:Theheapistheruntimedataareafromwhichmemoryforallclassinstancesandarraysisallocated),但是任逃逸分析和標(biāo)量替換優(yōu)化技術(shù)Hl現(xiàn)后,VMSpec的描述就顯得并不那么準(zhǔn)確了。Java堆內(nèi)還有更細(xì)致的劃分:新生代、老年代,再細(xì)致一點(diǎn)的:eden、fromsurvivor,tosurvivor,甚至更細(xì)粒度的木地線程分配緩沖(TLAB)等,無

8、論對(duì)Java堆如何劃分,目的都是為了更好的回收內(nèi)存,或者更快的分配內(nèi)存,在本章中我們僅僅針對(duì)內(nèi)存區(qū)域的作川進(jìn)行討論,Java堆中的上述各個(gè)區(qū)域的細(xì)節(jié),可參見本文第二章《JVM內(nèi)存管理:深入垃圾收集器與內(nèi)存分配策略》。根據(jù)VMSpec的要求,Java堆可以處于物理上不連續(xù)的內(nèi)存空間,它邏輯上是連續(xù)的叩可,就像我們的磁盤空間一樣。實(shí)現(xiàn)時(shí)可以選擇實(shí)現(xiàn)成固定人小的,也可以是可擴(kuò)展的,不過當(dāng)前所

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。