java中的內(nèi)存分配

java虛擬機(jī)中內(nèi)存劃分如下圖所示,下面具體談一下每一個部分页滚。

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

程序計(jì)數(shù)器是一個比較小的內(nèi)存區(qū)域萤彩,用于指示當(dāng)前線程所執(zhí)行的字節(jié)碼執(zhí)行到了第幾行村视,類似于匯編語言的程序計(jì)數(shù)器伊磺。每個程序計(jì)數(shù)器只用來記錄一個線程的行號盛正,所以它是線程私有(一個線程就有一個程序計(jì)數(shù)器)的。

如果程序執(zhí)行的是一個Java方法屑埋,則計(jì)數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令地址豪筝;如果正在執(zhí)行的是一個本地(native,由C語言編寫完成)方法摘能,則計(jì)數(shù)器的值為Undefined续崖,由于程序計(jì)數(shù)器只是記錄當(dāng)前指令地址,所以不存在內(nèi)存溢出的情況团搞,因此严望,程序計(jì)數(shù)器也是所有JVM內(nèi)存區(qū)域中唯一一個沒有定義OutOfMemoryError的區(qū)域。

2.虛擬機(jī)棧

一個線程的每個方法在執(zhí)行的同時逻恐,都會創(chuàng)建一個棧幀(Statck Frame)像吻,棧幀中存儲的有局部變量表、操作站复隆、動態(tài)鏈接拨匆、方法出口等,當(dāng)方法被調(diào)用時挽拂,棧幀在JVM棧中入棧惭每,當(dāng)方法執(zhí)行完成時,棧幀出棧亏栈。

局部變量表中存儲著方法的相關(guān)局部變量台腥,包括各種基本數(shù)據(jù)類型,對象的引用绒北,返回地址等黎侈。在局部變量表中,只有l(wèi)ong和double類型會占用2個局部變量空間(Slot镇饮,對于32位機(jī)器蜓竹,一個Slot就是32個bit),其它都是1個Slot储藐。需要注意的是俱济,局部變量表是在編譯時就已經(jīng)確定好的,方法運(yùn)行所需要分配的空間在棧幀中是完全確定的钙勃,在方法的生命周期內(nèi)都不會改變蛛碌。

虛擬機(jī)棧中定義了兩種異常,如果線程調(diào)用的棧深度大于虛擬機(jī)允許的最大深度辖源,則拋出StatckOverFlowError(棧溢出)蔚携;不過多數(shù)Java虛擬機(jī)都允許動態(tài)擴(kuò)展虛擬機(jī)棧的大小(有少部分是固定長度的)希太,所以線程可以一直申請棧,直到內(nèi)存不足酝蜒,此時誊辉,會拋出OutOfMemoryError(內(nèi)存溢出)。

每個線程對應(yīng)著一個虛擬機(jī)棧亡脑,因此虛擬機(jī)棧也是線程私有的堕澄。

3.本地方法棧

本地方法棧在作用,運(yùn)行機(jī)制霉咨,異常類型等方面都與虛擬機(jī)棧相同蛙紫,唯一的區(qū)別是:虛擬機(jī)棧是執(zhí)行Java方法的,而本地方法棧是用來執(zhí)行native方法的途戒,在很多虛擬機(jī)中(如Sun的JDK默認(rèn)的HotSpot虛擬機(jī))坑傅,會將本地方法棧與虛擬機(jī)棧放在一起使用。

本地方法棧也是線程私有的喷斋。

4.堆區(qū)

在JVM所管理的內(nèi)存中唁毒,堆區(qū)是最大的一塊,堆區(qū)也是Java GC機(jī)制所管理的主要內(nèi)存區(qū)域继准,堆區(qū)由所有線程共享枉证,在虛擬機(jī)啟動時創(chuàng)建。堆區(qū)的存在是為了存儲對象實(shí)例和數(shù)組移必。而對象的引用變量存儲在棧中,當(dāng)沒有引用指向一個對象時毡鉴,java提供了一種垃圾回收機(jī)制自動進(jìn)行處理崔泵。

5.方法區(qū)

方法區(qū)(Method Area):在Java虛擬機(jī)規(guī)范中,將方法區(qū)作為堆的一個邏輯部分來對待猪瞬,但事實(shí)上憎瘸,方法區(qū)并不是堆(Non-Heap);方法區(qū)是各個線程共享的區(qū)域陈瘦,用于存儲已經(jīng)被虛擬機(jī)加載的類信息(即加載類時需要加載的信息幌甘,包括版本、field痊项、方法锅风、接口等信息)、final常量鞍泉、靜態(tài)變量皱埠、編譯器即時編譯的代碼等。

方法區(qū)在物理上也不需要是連續(xù)的咖驮,可以選擇固定大小或可擴(kuò)展大小边器,并且方法區(qū)比堆還多了一個限制:可以選擇是否執(zhí)行垃圾收集训枢。一般的,方法區(qū)上執(zhí)行的垃圾收集是很少的忘巧,這也是方法區(qū)被稱為永久代的原因之一(HotSpot)恒界,但這也不代表著在方法區(qū)上完全沒有垃圾收集,其上的垃圾收集主要是針對常量池的內(nèi)存回收和對已加載類的卸載砚嘴。

運(yùn)行時常量池(Runtime Constant Pool)是方法區(qū)的一部分仗处,用于存儲編譯期就生成的字面常量、符號引用枣宫、翻譯出來的直接引用(符號引用就是編碼是用字符串表示某個變量婆誓、接口的位置,直接引用就是根據(jù)符號引用翻譯出來的地址也颤,將在類鏈接階段完成翻譯)洋幻;運(yùn)行時常量池除了存儲編譯期常量外,也可以存儲在運(yùn)行時間產(chǎn)生的常量(比如String類的intern()方法翅娶,作用是String維護(hù)了一個常量池文留,如果調(diào)用的字符“abc”已經(jīng)在常量池中,則返回池中的字符串地址竭沫,否則燥翅,新建一個常量加入池中,并返回地址)蜕提。

一般來說森书,一個Java的引用訪問涉及到3個內(nèi)存區(qū)域:JVM棧,堆谎势,方法區(qū)凛膏。以最簡單的本地變量引用:Object obj = new Object()為例:
Object obj表示一個本地引用,存儲在JVM棧的本地變量表中脏榆,表示一個reference類型數(shù)據(jù)猖毫;
new Object()作為實(shí)例對象數(shù)據(jù)存儲在堆中;
堆中還記錄了Object類的類型信息(接口须喂、方法吁断、field、對象類型等)的地址坞生,這些地址所執(zhí)行的數(shù)據(jù)存儲在方法區(qū)中仔役;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市恨胚,隨后出現(xiàn)的幾起案子骂因,更是在濱河造成了極大的恐慌,老刑警劉巖赃泡,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寒波,死亡現(xiàn)場離奇詭異乘盼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)俄烁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門绸栅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人页屠,你說我怎么就攤上這事粹胯。” “怎么了辰企?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵风纠,是天一觀的道長。 經(jīng)常有香客問我牢贸,道長竹观,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任潜索,我火速辦了婚禮臭增,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘竹习。我一直安慰自己誊抛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布整陌。 她就那樣靜靜地躺著拗窃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蔓榄。 梳的紋絲不亂的頭發(fā)上并炮,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機(jī)與錄音甥郑,去河邊找鬼。 笑死荤西,一個胖子當(dāng)著我的面吹牛澜搅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播邪锌,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼勉躺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了觅丰?” 一聲冷哼從身側(cè)響起饵溅,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妇萄,沒想到半個月后蜕企,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咬荷,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年轻掩,在試婚紗的時候發(fā)現(xiàn)自己被綠了幸乒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡唇牧,死狀恐怖罕扎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丐重,我是刑警寧澤腔召,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站扮惦,受9級特大地震影響臀蛛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜径缅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一掺栅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纳猪,春花似錦氧卧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鼠锈,卻和暖如春闪檬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背购笆。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工粗悯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人同欠。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓样傍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親铺遂。 傳聞我的和親對象是個殘疾皇子衫哥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容