国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

JVM學(xué)習(xí)筆記-運(yùn)行時(shí)數(shù)據(jù)區(qū)

2019-11-14 23:38:50
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
JVM學(xué)習(xí)筆記-運(yùn)行時(shí)數(shù)據(jù)區(qū)

  不同于C,C++程序,java程序的內(nèi)存管理工作由Java虛擬機(jī)(JVM)接管,這減低了java程序員的負(fù)擔(dān),但如果出現(xiàn)內(nèi)存泄露與溢出問(wèn)題如報(bào)OutOfMemory,StackOverFlow異常錯(cuò)誤時(shí),如果不了解JVM虛擬機(jī)的內(nèi)存管理細(xì)節(jié),往往很難快速定位錯(cuò)誤。

  JVM在運(yùn)行時(shí)會(huì)把其所管理的內(nèi)存分為幾個(gè)不同的數(shù)據(jù)區(qū)域,分別為:程序計(jì)數(shù)器,虛擬機(jī)棧,本地方法棧,堆,方法區(qū)等。這些區(qū)域存放的數(shù)據(jù)不同,功能也不同。

  JVM管理的內(nèi)存包含以下幾個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū):

1.程序計(jì)數(shù)器

  程序計(jì)數(shù)器是一塊較小的內(nèi)存空間,可將其視為當(dāng)前線程所執(zhí)行字節(jié)碼的行號(hào)指示器。為了線程切換后能恢復(fù)到正確執(zhí)行的位置,每條線程都需要有單獨(dú)的程序計(jì)數(shù)器,使各線程之間互不干擾,獨(dú)立存儲(chǔ)。因此該區(qū)域是線程私有區(qū)。

  值得一提的是,該區(qū)域是唯一一個(gè)在Java虛擬機(jī)規(guī)范中沒(méi)有規(guī)定任何OutOfMemoryError異常的區(qū)域。

2.Java虛擬機(jī)棧

  Java虛擬機(jī)棧也是線程私有的。虛擬機(jī)棧描述的是Java方法執(zhí)行的內(nèi)存模型,每個(gè)方法在執(zhí)行的同時(shí)會(huì)創(chuàng)建一個(gè)棧幀用于存儲(chǔ)局部變量表,操作數(shù)棧,動(dòng)態(tài)鏈接,方法出口等信息。每個(gè)方法從調(diào)用直至執(zhí)行完成的過(guò)程,就是一個(gè)棧幀在虛擬機(jī)棧中入棧出棧的過(guò)程。

  局部變量表存放了編譯期可知的各種基本數(shù)據(jù)類(lèi)型(boolean,byte,char,int,short,float,double,long),對(duì)象引用)和returnAddress(指向一條字節(jié)碼指令的地址)類(lèi)型。局部變量表所需內(nèi)存空間在編譯期間完成分配。

  在Java虛擬機(jī)規(guī)范中,該區(qū)域規(guī)定了兩種異常狀況:若果線程請(qǐng)求的棧深度大于虛擬機(jī)允許的深度,將拋出StackOverFlow異常;如果虛擬機(jī)棧可以動(dòng)態(tài)擴(kuò)展,如果擴(kuò)展時(shí)無(wú)法申請(qǐng)到足夠的內(nèi)存,就會(huì)拋出OutOfemory異常。

3.本地方法棧

  本地方法棧與虛擬機(jī)棧發(fā)揮相似你的作用,本地方法棧為虛擬機(jī)用到的native方法服務(wù)。有的虛擬機(jī)直接將本地方法棧與虛擬機(jī)棧合并。本地方法棧也會(huì)拋出StackOverFlow與OutOfMemoryError異常。

4.Java堆

  Java堆是我們最熟悉的一塊區(qū)域,它是Java虛擬機(jī)所管理的最大的一塊內(nèi)存。Java堆是由所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。該內(nèi)存區(qū)的唯一目的就是存放對(duì)象實(shí)例,幾乎所有的對(duì)象實(shí)例都在Java堆分配內(nèi)存。Java堆可以處于物理上不連續(xù)的內(nèi)存空間中,只要邏輯上是連續(xù)的即可。在實(shí)際中,Java堆是可擴(kuò)展的,一般有參數(shù):-Xmx(堆最大值) -Xms(堆最小值)控制。如果在堆中沒(méi)有內(nèi)存完成實(shí)例分配,且堆也無(wú)法再擴(kuò)展時(shí),會(huì)拋出OutOfMemoryError異常。

5.方法區(qū)

  方法區(qū)也是各個(gè)線程共享的內(nèi)存區(qū),它用于存儲(chǔ)被虛擬機(jī)加載的類(lèi)信息,常量,靜態(tài)變量,即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。當(dāng)方法區(qū)無(wú)法滿(mǎn)足內(nèi)存分配的需求時(shí),將拋出OutOfMemoryError異常。

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

  運(yùn)行時(shí)常量池是方法區(qū)的一部分。Class文件中除了有類(lèi)的版本,字段,方法,接口等信息外,還有一項(xiàng)信息是常量池(constant pool),用于存放編譯期產(chǎn)生的各種字面量和符號(hào)引用,該部分內(nèi)容在類(lèi)加載后進(jìn)入方法區(qū)的運(yùn)行時(shí)常量池中存放。運(yùn)行時(shí)常量池相對(duì)于Class文件的常量池的一個(gè)重要特征就是具備動(dòng)態(tài)性,即并不要求常量一定只在編譯期產(chǎn)生,運(yùn)行期間也可將常量放入池中。String類(lèi)中的itern()方法就是這樣一個(gè)例子,當(dāng)調(diào)用 intern 方法時(shí),如果池已經(jīng)包含一個(gè)等于此 String 對(duì)象的字符串(用 equals(Object) 方法確定),則返回池中的字符串。否則,將此 String 對(duì)象添加到池中,并返回此 String 對(duì)象的引用。它遵循以下規(guī)則:對(duì)于任意兩個(gè)字符串 st,當(dāng)且僅當(dāng) s.equals(t)true 時(shí),s.intern() == t.intern() 才為 true。 當(dāng)常量池?zé)o法再分配到足夠的內(nèi)存時(shí)將拋出OutOfMemoryError異常。

7.直接內(nèi)存

  直接內(nèi)存并不是虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)的一部分,也非虛擬機(jī)規(guī)范定義的內(nèi)存區(qū),但該部分內(nèi)存會(huì)被頻繁使用。直接內(nèi)存不會(huì)受到虛擬機(jī)內(nèi)存大小的限制,但會(huì)受本機(jī)內(nèi)存大小的限制。因此也可能會(huì)拋出OutOfMemoryError異常。


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 潜江市| 广丰县| 军事| 多伦县| 陇南市| 长沙市| 南和县| 海淀区| 德钦县| 友谊县| 公安县| 镇雄县| 永仁县| 鄂托克前旗| 新蔡县| 团风县| 鄂托克前旗| 安庆市| 西藏| 渑池县| 乡宁县| 栾城县| 剑阁县| 二连浩特市| 新丰县| 凤冈县| 广安市| 常德市| 昂仁县| 清苑县| 绥阳县| 宁阳县| 衡阳市| 常熟市| 宁晋县| 五指山市| 建湖县| 梁平县| 和静县| 星座| 辽阳市|