細(xì)讀JVM(01) ---------- Java內(nèi)存區(qū)域

??Java虛擬機(jī)在運行Java程序的過程中會把所管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域,這些區(qū)域都有各自的用途以及創(chuàng)建和銷毀的時間,有的區(qū)域隨著Java虛擬機(jī)進(jìn)程的啟動而存在,有些區(qū)域則依賴用戶線程的啟動和結(jié)束而創(chuàng)建和銷毀。
????????????????????????--摘自《深入理解Java虛擬機(jī)》

內(nèi)存區(qū)域圖示

程序計數(shù)器(program counter)

??學(xué)過線程的同學(xué)應(yīng)該了解,Java的多線程是通過CPU不斷在線程之間切換來實現(xiàn)的,那么我們不禁要問:當(dāng)線程的指令并沒有執(zhí)行完畢,卻因為時間片耗盡而失去了CPU使用權(quán),又該如何從掛起的地方繼續(xù)執(zhí)行呢?關(guān)于這個問題,不得不提到一個概念,就是程序計數(shù)器(program counter)。
??JVM中通過程序計數(shù)器來記錄當(dāng)前字節(jié)碼的執(zhí)行位置,使已經(jīng)掛起的線程重新獲得CPU使用權(quán)后,依舊能夠繼續(xù)往下執(zhí)行。講解完了用途之后,我們總結(jié)一下程序計數(shù)器的幾個特點:

  • 線程隔離性:每個線程都有一個自己的程序計數(shù)器,彼此隔離,互不影響。

  • 執(zhí)行Native方法時,程序計數(shù)器值為空,原因是native方法是通過jni調(diào)用的C/C++庫,與字節(jié)碼無關(guān)。

  • 生命周期隨著線程,線程啟動而產(chǎn)生,線程結(jié)束而消亡。

  • 由于存儲的是字節(jié)碼地址,在創(chuàng)建時JVM就會為其分配一個足夠大的內(nèi)存,所以沒有規(guī)定任何OutOfMemoryError。


    源碼與字節(jié)碼
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容