java虛擬機

Java虛擬機在執(zhí)行Java程序的過程中會把它所管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域髓考。這些區(qū)域都有各自的用途跃须,以及創(chuàng)建和銷毀的時間眷篇,有的區(qū)域隨著虛擬機進程的啟動而存在舆瘪,有些區(qū)域則依賴用戶線程的啟動和結(jié)束而建立和銷毀池摧。

Java虛擬機運行時數(shù)據(jù)區(qū):

image.png

程序計數(shù)器:

可以看作是當前線程所執(zhí)行的字節(jié)碼的行號指示器焦除。
在虛擬機的概念模型里(僅是概念模型,各種虛擬機可能會通過一些更高效的方式去實現(xiàn))险绘,字節(jié)碼解釋器工作時就是通過改變這個計數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令踢京,分支誉碴、循環(huán)、跳轉(zhuǎn)瓣距、異常處理黔帕、線程恢復等基礎(chǔ)功能都需要依賴這個計數(shù)器來完成。

由于Java虛擬機的多線程是通過線程輪流切換并分配處理器執(zhí)行時間的方式來實現(xiàn)的蹈丸,在任何一個確定的時刻成黄,一個處理器(對于多核處理器來說是一個內(nèi)核)都只會執(zhí)行一條線程中的指令。因此逻杖,為了線程切換后能恢復到正確的執(zhí)行位置奋岁,每條線程都需要有一個獨立的程序計數(shù)器,各條線程之間計數(shù)器互不影響荸百,獨立存儲闻伶,我們稱這類內(nèi)存區(qū)域為“線程私有”的內(nèi)存。

如果線程正在執(zhí)行的是一個Java方法够话,這個計數(shù)器記錄的是正在執(zhí)行的虛擬機字節(jié)碼指令的地址蓝翰;如果正在執(zhí)行的是Native方法(一個Native Method就是一個java調(diào)用非java代碼的接口),這個計數(shù)器值則為空(Undefined)女嘲。此內(nèi)存區(qū)域是唯一一個在Java虛擬機規(guī)范中沒有規(guī)定任何OutOfMemoryError情況的區(qū)域畜份。

java虛擬機棧:

與程序計數(shù)器一樣,Java虛擬機棧(Java Virtual Machine Stacks)也是線程私有的欣尼,它的生命周期與線程相同爆雹。虛擬機棧描述的是Java方法執(zhí)行的內(nèi)存模型:每個方法在執(zhí)行的同時都會創(chuàng)建一個棧幀(Stack Frame[1])用于存儲局部變量表、操作數(shù)棧愕鼓、動態(tài)鏈接钙态、方法出口等信息。每一個方法從調(diào)用直至執(zhí)行完成的過程拒啰,就對應(yīng)著一個棧幀在虛擬機棧中入棧到出棧的過程驯绎。

局部變量表存放了編譯期可知的各種基本數(shù)據(jù)類型(boolean、byte谋旦、char剩失、short、int册着、float拴孤、long、double)甲捏、對象引用(reference類型演熟,它不等同于對象本身,可能是一個指向?qū)ο笃鹗嫉刂返囊弥羔槪部赡苁侵赶蛞粋€代表對象的句柄或其他與此對象相關(guān)的位置)和returnAddress類型(指向了一條字節(jié)碼指令的地址)芒粹。

局部變量表所需的內(nèi)存空間在編譯期間完成分配兄纺,當進入一個方法時,這個方法需要在幀中分配多大的局部變量空間是完全確定的化漆,在方法運行期間不會改變局部變量表的大小估脆。

在Java虛擬機規(guī)范中,對這個區(qū)域規(guī)定了兩種異常狀況:如果線程請求的棧深度大于虛擬機所允許的深度座云,將拋出StackOverflowError異常疙赠;如果虛擬機棧可以動態(tài)擴展(當前大部分的Java虛擬機都可動態(tài)擴展朦拖,只不過Java虛擬機規(guī)范中也允許固定長度的虛擬機棧)圃阳,如果擴展時無法申請到足夠的內(nèi)存,就會拋出OutOfMemoryError異常璧帝。

本地方法棧:

本地方法棧(Native Method Stack)與虛擬機棧所發(fā)揮的作用是非常相似的捍岳,它們之間的區(qū)別不過是虛擬機棧為虛擬機執(zhí)行Java方法(也就是字節(jié)碼)服務(wù),而本地方法棧則為虛擬機使用到的Native方法服務(wù)裸弦。

與虛擬機棧一樣祟同,本地方法棧區(qū)域也會拋出StackOverflowError和OutOfMemoryError異常。

JAVA堆:

Java堆(Java Heap)是Java虛擬機所管理的內(nèi)存中最大的一塊理疙。Java堆是被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機啟動時創(chuàng)建泞坦。此內(nèi)存區(qū)域的唯一目的就是存放對象實例窖贤,幾乎所有的對象實例都在這里分配內(nèi)存。這一點在Java虛擬機規(guī)范中的描述是:所有的對象實例以及數(shù)組都要在堆上分配》∷現(xiàn)在也不這么絕對了赃梧。

Java堆可以處于物理上不連續(xù)的內(nèi)存空間中,只要邏輯上是連續(xù)的即可豌熄。
如果在堆中沒有內(nèi)存完成實例分配授嘀,并且堆也無法再擴展時,將會拋出OutOfMemoryError異常锣险。

堆和棧的區(qū)別:
(1)各司其職
最主要的區(qū)別就是棧內(nèi)存用來存儲局部變量和方法調(diào)用信息蹄皱。而堆內(nèi)存用來存儲Java中的對象。無論是成員變量芯肤、局部變量還是類變量巷折,它們指向的對象都存儲在堆內(nèi)存中。

(2)空間大小
棧的內(nèi)存要遠遠小于堆內(nèi)存崖咨,如果你使用遞歸的話锻拘,那么你的棧很快就會充滿并產(chǎn)生StackOverFlowError。

(3)獨有還是共享
棧內(nèi)存歸屬于線程的私有內(nèi)存击蹲,每個線程都會有一個棧內(nèi)存署拟,其存儲的變量只能在其所屬線程中可見婉宰。而堆內(nèi)存中的對象對所有線程可見,可以被所有線程訪問推穷。

(4)異常錯誤
如果線程請求的棧深度大于虛擬機所允許的深度芍阎,將拋出StackOverflowError異常。
如果JVM椨Ш悖可以動態(tài)擴展(大部分JVM是可以的)谴咸,當擴展時無法申請到足夠內(nèi)存則拋出OutOfMemoryError異常。
而堆內(nèi)存沒有可用的空間存儲生成的對象骗露,JVM會拋出java.lang.OutOfMemoryError岭佳。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市萧锉,隨后出現(xiàn)的幾起案子珊随,更是在濱河造成了極大的恐慌,老刑警劉巖柿隙,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叶洞,死亡現(xiàn)場離奇詭異,居然都是意外死亡禀崖,警方通過查閱死者的電腦和手機衩辟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來波附,“玉大人艺晴,你說我怎么就攤上這事〉牛” “怎么了封寞?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長仅财。 經(jīng)常有香客問我狈究,道長,這世上最難降的妖魔是什么盏求? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任抖锥,我火速辦了婚禮,結(jié)果婚禮上风喇,老公的妹妹穿的比我還像新娘宁改。我一直安慰自己,他們只是感情好魂莫,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布还蹲。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谜喊。 梳的紋絲不亂的頭發(fā)上潭兽,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音斗遏,去河邊找鬼山卦。 笑死,一個胖子當著我的面吹牛诵次,可吹牛的內(nèi)容都是我干的账蓉。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼逾一,長吁一口氣:“原來是場噩夢啊……” “哼铸本!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起遵堵,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤箱玷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后陌宿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锡足,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年壳坪,在試婚紗的時候發(fā)現(xiàn)自己被綠了舶得。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡弥虐,死狀恐怖扩灯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情霜瘪,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布惧磺,位于F島的核電站颖对,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏磨隘。R本人自食惡果不足惜缤底,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望番捂。 院中可真熱鬧个唧,春花似錦、人聲如沸设预。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至魄梯,卻和暖如春桨螺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酿秸。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工灭翔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辣苏。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓肝箱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親稀蟋。 傳聞我的和親對象是個殘疾皇子煌张,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

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