成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JVM運行時數(shù)據(jù)區(qū)域

meislzhua / 1762人閱讀

摘要:虛擬機(jī)在執(zhí)行程序的過程中會把它所管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域,本篇文章將會對這些數(shù)據(jù)區(qū)域進(jìn)行簡略的介紹。運行時常量池運行時常量池是方法區(qū)的一部分。直接內(nèi)存直接內(nèi)存不是虛擬機(jī)運行時數(shù)據(jù)區(qū)的一部分,不是虛擬機(jī)規(guī)范中定義的內(nèi)存區(qū)域。

Java虛擬機(jī)在執(zhí)行Java程序的過程中會把它所管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域,本篇文章將會對這些數(shù)據(jù)區(qū)域進(jìn)行簡略的介紹。
JVM所管理的內(nèi)存包括的數(shù)據(jù)區(qū)域如下圖所示:

根據(jù)這張圖我們來一個個介紹這些數(shù)據(jù)區(qū)域。

程序計數(shù)器

程序計數(shù)器(ProgramCounterRegister)是一塊較小的內(nèi)存空間,它可以看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器。在虛擬機(jī)的概念模型里(僅是概念模型,各種虛擬機(jī)可能會通過一些更高效的方式去實現(xiàn)),字節(jié)碼解釋器工作時就是通過改變這個計數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令,分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等基礎(chǔ)功能都需要依賴這個計數(shù)器來完成。

每條線程都需要一個獨立的程序計數(shù)器,各條線程之間計數(shù)器互不影響,獨立存儲,我們稱這類內(nèi)存區(qū)域為“線程私有”的內(nèi)存。

如果線程正在執(zhí)行的是一個Java方法,這個計數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址;如果正在執(zhí)行的是Native方法,這個計數(shù)器值則為空(Undefined)。

此內(nèi)存區(qū)域是唯一一個在Java虛擬機(jī)規(guī)范中沒有規(guī)定任何OOM情況的區(qū)域。

虛擬機(jī)棧

Java虛擬機(jī)棧也是線程私有的,生命周期與線程相同。
虛擬機(jī)棧描述的是Java方法執(zhí)行的內(nèi)存模型:每個方法在執(zhí)行時都會創(chuàng)建一個棧幀用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息。每個方法從調(diào)用直至執(zhí)行完成的過程,就對應(yīng)著一個棧幀在虛擬機(jī)中入棧到出棧的過程。

常說的堆和棧中的棧其實指的是Java虛擬機(jī)?;蛘f是虛擬機(jī)棧中的局部變量表部分。局部變量表存放了編譯期可知的基本數(shù)據(jù)類型、對象引用和returnAddress類型(指向了一條字節(jié)碼指令的地址)。

Java虛擬機(jī)規(guī)范中,對這個區(qū)域規(guī)定了兩種異常情況:

如果線程請求的棧深度大于虛擬機(jī)所允許的深度,將拋出StackOverflowError異常;

如果虛擬機(jī)??梢詣討B(tài)擴(kuò)展,如果擴(kuò)展時無法申請到足夠的內(nèi)存,就會拋出OutOfMemoryError異常;

本地方法棧

本地方法棧與虛擬機(jī)棧作用類似,區(qū)別是虛擬機(jī)棧為虛擬機(jī)執(zhí)行Java方法服務(wù),本地方法棧為虛擬機(jī)使用到的Native方法服務(wù)。

與虛擬機(jī)棧一樣,本地方法中也會拋出StackOverflowError和OOM異常

Java堆

Java堆是被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動時創(chuàng)建。用來存放對象實例。

從內(nèi)存回收角度看,由于現(xiàn)在收集齊基本都采用分代收集算法,所以Java堆還可以細(xì)分為:新生代和老年代。從內(nèi)存分配角度看,線程共享的Java堆中額能劃分出多個線程私有的分配緩沖區(qū)(TLAB)。

Java堆可以處于物理上不連續(xù)的內(nèi)存空間中,只要邏輯上連續(xù)即可。實現(xiàn)時可固定大小也可擴(kuò)展大?。?Xmx,-Xms)。如果隊中沒有內(nèi)存完成實例分配,且堆也無法再擴(kuò)展,會拋出OOM異常。

方法區(qū)

方法區(qū)與Java堆一樣,是各個線程共享的內(nèi)存區(qū)域。

用于存儲已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即使編譯器編譯后的代碼數(shù)據(jù),別名Non-Heap。

當(dāng)方法區(qū)無法滿足內(nèi)存分配需求時,拋出OOM異常。

運行時常量池

運行時常量池是方法區(qū)的一部分。用于存放編譯期生成的各種字面量和符號引用。
當(dāng)常量池?zé)o法再請到內(nèi)存時會拋出OOM異常。

直接內(nèi)存

直接內(nèi)存不是虛擬機(jī)運行時數(shù)據(jù)區(qū)的一部分,不是Java虛擬機(jī)規(guī)范中定義的內(nèi)存區(qū)域。但這部分內(nèi)存也被頻繁使用,也可能導(dǎo)致OOM。本機(jī)直接內(nèi)存的分配不會受到Java堆大小的限制,但還是會受到本機(jī)總內(nèi)存大小以及處理器尋址空間的限制。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76754.html

相關(guān)文章

  • JVM內(nèi)存模型與運行數(shù)據(jù)區(qū)域

    摘要:內(nèi)存模型和運行時數(shù)據(jù)區(qū)域的關(guān)系主內(nèi)存對應(yīng)著堆,工作內(nèi)存對應(yīng)著棧。在的單例模式中有運用到二運行時數(shù)據(jù)區(qū)域內(nèi)存區(qū)域因為的運行時數(shù)據(jù)區(qū)域一直在改善,所以不同版本之間會有不同。 一、java內(nèi)存模型 showImg(https://segmentfault.com/img/remote/1460000016694250?w=1810&h=941); java定義內(nèi)存模型的目的是:為了屏蔽各種...

    canopus4u 評論0 收藏0
  • 對于JVM,你就只知道堆和棧嗎?

    摘要:下面的截圖內(nèi)容來自從規(guī)范我們可以看到,規(guī)范要求的運行時數(shù)據(jù)區(qū)域有程序計數(shù)器虛擬機(jī)棧堆方法區(qū)本地方法棧運行時常量池這及部分。查了一下,還是沒有查到官方對于運行時數(shù)據(jù)區(qū)域的說明,但是許多博客都指出將字符串常量池移動到了堆中。 不少java程序員一提JVM運行時數(shù)據(jù)區(qū)域,就會說堆和棧,當(dāng)然也有java程序員給出方法區(qū)、虛擬機(jī)棧、本地方法棧、堆、程序計數(shù)器這個答案,但是還有人給出永久代、虛擬機(jī)...

    王笑朝 評論0 收藏0
  • 萬萬沒想到,JVM內(nèi)存結(jié)構(gòu)的面試題可以問的這么難?

    摘要:方法區(qū)在實際內(nèi)存空間站可以是不連續(xù)的。這一規(guī)定,可以說是給了虛擬機(jī)廠商很大的自由。但是值得注意的是,堆其實還未每一個線程單獨分配了一塊空間,這部分空間在分配時是線程獨享的,在使用時是線程共享的。 在我的博客中,之前有很多文章介紹過JVM內(nèi)存結(jié)構(gòu),相信很多看多我文章的朋友對這部分知識都有一定的了解了。 那么,請大家嘗試著回答一下以下問題: 1、JVM管理的內(nèi)存結(jié)構(gòu)是怎樣的? 2、不同的...

    CloudwiseAPM 評論0 收藏0
  • JVM虛擬機(jī)詳解

    摘要:虛擬機(jī)包括一套字節(jié)碼指令集一組寄存器一個棧一個垃圾回收堆和一個存儲方法域。而使用虛擬機(jī)是實現(xiàn)這一特點的關(guān)鍵。虛擬機(jī)在執(zhí)行字節(jié)碼時,把字節(jié)碼解釋成具體平臺上的機(jī)器指令執(zhí)行。此內(nèi)存區(qū)域是唯一一個在虛擬機(jī)規(guī)范中沒有規(guī)定任何情況的區(qū)域。 1、 什么是JVM?   JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫,JVM是一種用于計算設(shè)備的規(guī)范,它是一個虛構(gòu)出來的計算機(jī),...

    rottengeek 評論0 收藏0
  • jvm基礎(chǔ)篇一之內(nèi)存區(qū)域

    摘要:堆區(qū)堆是虛擬機(jī)所管理的內(nèi)存中最大的一塊,它是被所有線程共享的一塊內(nèi)存區(qū)域,該區(qū)域在虛擬機(jī)啟動的時候創(chuàng)建。 運行時數(shù)據(jù)區(qū)域 ? ?想要了解jvm,那對其內(nèi)存分配管理的學(xué)習(xí)是必不可少的;java虛擬機(jī)在執(zhí)行java程序的時候會把它所管理的內(nèi)存劃分成若干數(shù)據(jù)區(qū)域。這些區(qū)域有著不同的功能、用途、創(chuàng)建/銷毀時間。java虛擬機(jī)所分配管理的內(nèi)存區(qū)域如圖1所示 程序計數(shù)器 ? ?程序計數(shù)器是一塊比較...

    Zachary 評論0 收藏0
  • Java GC

    摘要:對字節(jié)碼文件進(jìn)行解釋執(zhí)行,把字節(jié)碼翻譯成相關(guān)平臺上的機(jī)器指令。使用命令可對字節(jié)碼文件以及配置文件進(jìn)行打包可對一個由多個字節(jié)碼文件和配置文件等資源文件構(gòu)成的項目進(jìn)行打包。和不存在永久代這種說法。 Java技術(shù)體系 從廣義上講,Clojure、JRuby、Groovy等運行于Java虛擬機(jī)上的語言及其相關(guān)的程序都屬于Java技術(shù)體系中的一員。如果僅從傳統(tǒng)意義上來看,Sun官方所定義的Jav...

    justCoding 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<