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

資訊專欄INFORMATION COLUMN

JVM 探究(一):JVM內(nèi)存模型概念模型

cnTomato / 2416人閱讀

摘要:作為一個(gè)程序員,不了解內(nèi)存模型就不能寫出能夠充分利用內(nèi)存的代碼。程序計(jì)數(shù)器是在電腦處理器中的一個(gè)寄存器,用來(lái)指示電腦下一步要運(yùn)行的指令序列。在虛擬機(jī)中,本地方法棧和虛擬機(jī)棧是共用同一塊內(nèi)存的,不做具體區(qū)分。

作為一個(gè) Java 程序員,不了解 Java 內(nèi)存模型就不能寫出能夠充分利用內(nèi)存的代碼。本文通過(guò)對(duì) Java 內(nèi)存模型的介紹,讓讀者能夠了解 Java 的內(nèi)存的分配情況,適合 Java 初學(xué)者或者對(duì) JMM 不熟悉的同學(xué)。后面的博客會(huì)針對(duì)每個(gè)部分做更加深入的解釋。

Java 內(nèi)存模型

首先通過(guò)下圖對(duì)于 Java 內(nèi)存模型有一個(gè)整體的認(rèn)識(shí),然后針對(duì)不同的區(qū)域的作用和存儲(chǔ)的內(nèi)容做進(jìn)一步的解釋。

PC(程序計(jì)數(shù)器)

這里的 PC 不是 Personal Computer,而是 Program Counter Register,從名字就可以看出來(lái),這是一個(gè)寄存器,用來(lái)存儲(chǔ)需要執(zhí)行的指令地址。

程序計(jì)數(shù)器(Program Counter (PC))是在電腦處理器中的一個(gè)寄存器,用來(lái)指示電腦下一步要運(yùn)行的指令序列。--WikiPedia

PC 和其他 JVM 內(nèi)存區(qū)域最大的區(qū)別是:

“此內(nèi)存區(qū)域是唯一一個(gè)在Java虛擬機(jī)規(guī)范中沒有規(guī)定任何OutOfMemoryError情況的區(qū)域。
摘錄來(lái)自: 周志明. “深入理解Java虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐(第2版)”。 iBooks.

像上面的圖片一樣,PC 是每個(gè)線程私有的,對(duì)于 Java 方法而言,PC 中存儲(chǔ)的是正在執(zhí)行的虛擬機(jī)字節(jié)碼的內(nèi)存地址;對(duì)于 Native 方法來(lái)說(shuō),PC 中的值為空(Undefined)。

Java 虛擬機(jī)棧和本地方法棧 虛擬機(jī)棧

無(wú)論是在大學(xué)的 Java 編程課堂上,還是我們?cè)趯W(xué)習(xí)過(guò)程編碼過(guò)程,經(jīng)常會(huì)出現(xiàn) StackOverFlow,甚至目前最大的技術(shù)問答社區(qū)的名字也是 StackOverFlow。Java 語(yǔ)言中會(huì)產(chǎn)生棧溢出的就是這塊內(nèi)存區(qū)域,當(dāng)你的程序中設(shè)置了超過(guò) JVM 規(guī)定的遞歸深度的時(shí)候就會(huì)觸發(fā)這個(gè)異常。類似 JMM 的其他內(nèi)存區(qū)域,如果虛擬機(jī)棧在動(dòng)態(tài)擴(kuò)展的時(shí)候無(wú)法申請(qǐng)到足夠的內(nèi)存也會(huì)報(bào)OOM異常。

Java 語(yǔ)言中每一個(gè)方法的執(zhí)行都對(duì)應(yīng)著一個(gè)棧幀(Stack Frame)的創(chuàng)建,棧幀中存儲(chǔ)的是局部變量、方法出口等信息,因此對(duì)于一個(gè)方法的執(zhí)行而言,所能夠使用到的內(nèi)存是在編譯期間就能夠完全確定的,在運(yùn)行期間不會(huì)發(fā)生變化。在棧幀中,局部變量空間成為 Slot,除了 double 和 long 占有 2 個(gè) slot 外,其他基本數(shù)據(jù)類型和對(duì)象引用都占用 1 個(gè) slot 空間

本地方法棧

本地方法棧和虛擬機(jī)棧最大的區(qū)別就是虛擬機(jī)棧是為執(zhí)行 Java 字節(jié)碼服務(wù)的,而本地方法棧是為了虛擬機(jī)使用到的 Native 方法服務(wù)的。除此之外,Java 虛擬機(jī)規(guī)范并沒有針對(duì)本地方法棧的實(shí)現(xiàn)做具體規(guī)定。在 HotSpot 虛擬機(jī)中,本地方法棧和虛擬機(jī)棧是共用同一塊內(nèi)存的,不做具體區(qū)分。同樣,本地方法棧也會(huì)產(chǎn)生 OOM 異常和 StackOverFlow 異常。

Java 堆
“The heap is the runtime data area from which memory for all class instances and arrays is allocated?!?--Java虛擬機(jī)規(guī)范

Java 虛擬機(jī)規(guī)范規(guī)定所有的實(shí)例對(duì)象和數(shù)組都應(yīng)該分配到 Java 堆中。
說(shuō)的通俗一點(diǎn)就是所有 new 出來(lái)的對(duì)象和數(shù)組都會(huì)放到該區(qū)域,由于現(xiàn)在的收集器都采用分代收集算法,所以在 Java 堆中又分了新生代和老年代,新生代有做了詳細(xì)的區(qū)分。該區(qū)域的大小可以通過(guò) JVM 參數(shù) -Xmx-Xms 來(lái)設(shè)置。

直接內(nèi)存

在 JDK1.4 中引入了 NIO,可以通過(guò) Native 方法直接在堆外分配內(nèi)存,然后通過(guò)在堆中存儲(chǔ)的引用來(lái)對(duì)這塊內(nèi)存區(qū)域做操作。注意 這塊區(qū)域并不會(huì)在 -Xmx-Xms 設(shè)置的大小之內(nèi),因此在設(shè)置 JVM 參數(shù)的時(shí)候要注意考慮這塊內(nèi)存區(qū)域,避免設(shè)置的內(nèi)存區(qū)域總額大于物理內(nèi)存

方法區(qū)

Method Area 又叫 NonHeap,也是線程共有的內(nèi)存區(qū)域,用來(lái)存:

類信息

常量

靜態(tài)變量

字符串常量池

在 JDK1.7 中已經(jīng)將字符串常量池移出永久代,在 Java8 中更是之內(nèi)取消了永久代,而是使用了元空間(MetaSpace)來(lái)存儲(chǔ)這些信息,從而永久代的大小不需要再制定,只要不超出物理內(nèi)存的限制就不會(huì)產(chǎn)生 OOM 異常

運(yùn)行時(shí)常量池

運(yùn)行時(shí)常量池主要用來(lái)存儲(chǔ)累的版本、字段、方法、接口等描述信息。常量池(Constant Pool Table)用來(lái)存儲(chǔ)各種字面量和符號(hào)引用。String 的 intern() 方法就是在運(yùn)行期間將對(duì)象放到常量池中的。此部分也會(huì)出現(xiàn) OOM 異常。

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

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

相關(guān)文章

  • Java性能優(yōu)化之JVM內(nèi)存模型

    摘要:內(nèi)存模型首先介紹下程序具體執(zhí)行的過(guò)程源代碼文件后綴會(huì)被編譯器編譯為字節(jié)碼文件后綴由中的類加載器加載各個(gè)類的字節(jié)碼文件,加載完畢之后,交由執(zhí)行引擎執(zhí)行在整個(gè)程序執(zhí)行過(guò)程中,會(huì)用一段空間來(lái)存儲(chǔ)程序執(zhí)行期間需要用到的數(shù)據(jù)和相關(guān)信息,這段空間一般被 [TOC] JVM內(nèi)存模型 首先介紹下Java程序具體執(zhí)行的過(guò)程: Java源代碼文件(.java后綴)會(huì)被Java編譯器編譯為字節(jié)碼文件(....

    SQC 評(píng)論0 收藏0
  • jvm原理

    摘要:在之前,它是一個(gè)備受爭(zhēng)議的關(guān)鍵字,因?yàn)樵诔绦蛑惺褂盟占骼斫夂驮矸治龊?jiǎn)稱,是后提供的面向大內(nèi)存區(qū)數(shù)到數(shù)多核系統(tǒng)的收集器,能夠?qū)崿F(xiàn)軟停頓目標(biāo)收集并且具有高吞吐量具有更可預(yù)測(cè)的停頓時(shí)間。 35 個(gè) Java 代碼性能優(yōu)化總結(jié) 優(yōu)化代碼可以減小代碼的體積,提高代碼運(yùn)行的效率。 從 JVM 內(nèi)存模型談線程安全 小白哥帶你打通任督二脈 Java使用讀寫鎖替代同步鎖 應(yīng)用情景 前一陣有個(gè)做...

    lufficc 評(píng)論0 收藏0
  • 后臺(tái)開發(fā)常問面試題集錦(問題搬運(yùn)工,附鏈接)

    摘要:基礎(chǔ)問題的的性能及原理之區(qū)別詳解備忘筆記深入理解流水線抽象關(guān)鍵字修飾符知識(shí)點(diǎn)總結(jié)必看篇中的關(guān)鍵字解析回調(diào)機(jī)制解讀抽象類與三大特征時(shí)間和時(shí)間戳的相互轉(zhuǎn)換為什么要使用內(nèi)部類對(duì)象鎖和類鎖的區(qū)別,,優(yōu)缺點(diǎn)及比較提高篇八詳解內(nèi)部類單例模式和 Java基礎(chǔ)問題 String的+的性能及原理 java之yield(),sleep(),wait()區(qū)別詳解-備忘筆記 深入理解Java Stream流水...

    spacewander 評(píng)論0 收藏0
  • 后臺(tái)開發(fā)常問面試題集錦(問題搬運(yùn)工,附鏈接)

    摘要:基礎(chǔ)問題的的性能及原理之區(qū)別詳解備忘筆記深入理解流水線抽象關(guān)鍵字修飾符知識(shí)點(diǎn)總結(jié)必看篇中的關(guān)鍵字解析回調(diào)機(jī)制解讀抽象類與三大特征時(shí)間和時(shí)間戳的相互轉(zhuǎn)換為什么要使用內(nèi)部類對(duì)象鎖和類鎖的區(qū)別,,優(yōu)缺點(diǎn)及比較提高篇八詳解內(nèi)部類單例模式和 Java基礎(chǔ)問題 String的+的性能及原理 java之yield(),sleep(),wait()區(qū)別詳解-備忘筆記 深入理解Java Stream流水...

    xfee 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<