Java內存模型整理

歡迎訪問我的博客:http://wangnan.tech

參考:
http://gityuan.com/2016/01/09/java-memory/

  • 一般地大家講到的Java內存其實就是Jvm內存
  • Java代碼是運行在Java虛擬機之上的,由Java虛擬機通過解釋執行(解釋器)或編譯執行(即時編譯器)來完成,故Java內存模型,也就是指Java虛擬機的運行時內存模型。

內存模型圖

詳細介紹

程序計數器PC

  • 程序計數器PC,當前線程所執行的字節碼行號指示器。每個線程都有自己計數器,是私有內存空間,該區域是整個內存中較小的一塊。

  • 當線程正在執行一個Java方法時,PC計數器記錄的是正在執行的虛擬機字節碼的地址;當線程正在執行的一個Native方法時,PC計數器則為空(Undefined)。

虛擬機棧

虛擬機棧,生命周期與線程相同,是Java方法執行的內存模型。每個方法(不包含native方法)執行的同時都會創建一個棧幀結構,方法執行過程,對應著虛擬機棧的入棧到出棧的過程。

棧幀(Stack Frame)結構
棧幀是用于支持虛擬機進行方法執行的數據結構,是屬性運行時數據區的虛擬機站的棧元素。見上圖, 棧幀包括:

  • 局部變量表 (locals大小,編譯期確定),一組變量存儲空間, 容量以slot為最小單位。
  • 操作棧(stack大小,編譯期確定),操作棧元素的數據類型必須與字節碼指令序列嚴格匹配
  • 動態連接, 指向運行時常量池中該棧幀所屬方法的引用,為了 動態連接使用。
    前面的解析過程其實是靜態解析;
    對于運行期轉化為直接引用,稱為動態解析。
  • 方法返回地址
    正常退出,執行引擎遇到方法返回的字節碼,將返回值傳遞給調用者
    異常退出,遇到Exception,并且方法未捕捉異常,那么不會有任何返回值。
  • 額外附加信息,虛擬機規范沒有明確規定,由具體虛擬機實現。

異常(Exception)
Java虛擬機規范規定該區域有兩種異常:

  • StackOverFlowError:當線程請求棧深度超出虛擬機棧所允許的深度時拋出
  • OutOfMemoryError:當Java虛擬機動態擴展到無法申請足夠內存時拋出

本地方法棧

本地方法棧則為虛擬機使用到的Native方法提供內存空間,而前面講的虛擬機棧式為Java方法提供內存空間。有些虛擬機的實現直接把本地方法棧和虛擬機棧合二為一,比如非常典型的Sun HotSpot虛擬機。

異常(Exception)
Java虛擬機規范規定該區域可拋出StackOverFlowError和OutOfMemoryError。

方法區

方法區主要存放的是已被虛擬機加載的類信息、常量、靜態變量、編譯器編譯后的代碼等數據。GC在該區域出現的比較少。

異常(Exception)
Java虛擬機規范規定該區域可拋出OutOfMemoryError。

運行時常量池
運行時常量池也是方法區的一部分,用于存放編譯器生成的各種字面量和符號引用。運行時常量池除了編譯期產生的Class文件的常量池,還可以在運行期間,將新的常量加入常量池,比較常見的是String類的intern()方法。

  • 字面量:與Java語言層面的常量概念相近,包含文本字符串、聲明為final的常量值等。

  • 符號引用:編譯語言層面的概念,包括以下3類:

  1. 類和接口的全限定名
  2. 字段的名稱和描述符
  3. 方法的名稱和描述符

該區域會拋出OutOfMemoryError異常。

Java堆

Java堆,是Java虛擬機管理的最大的一塊內存,也是GC的主戰場,里面存放的是幾乎所有的對象實例和數組數據。JIT編譯器有棧上分配、標量替換等優化技術的實現導致部分對象實例數據不存在Java堆,而是棧內存。

  • 從內存回收角度,Java堆被分為新生代和老年代;這樣劃分的好處是為了更快的回收內存;
  • 從內存分配角度,Java堆可以劃分出線程私有的分配緩沖區(Thread Local Allocation Buffer,TLAB);這樣劃分的好處是為了更快的分配內存;

對象創建的過程是在堆上分配著實例對象,那么對象實例的具體結構如下:

對于填充數據不是一定存在的,僅僅是為了字節對齊。HotSpot VM的自動內存管理要求對象起始地址必須是8字節的整數倍。對象頭本身是8的倍數,當對象的實例數據不是8的倍數,便需要填充數據來保證8字節的對齊。該功能類似于高速緩存行的對齊。

另外,關于在堆上內存分配是并發進行的,虛擬機采用CAS加失敗重試保證原子操作,或者是采用每個線程預先分配TLAB內存.

異常(Exception)
Java虛擬機規范規定該區域可拋出OutOfMemoryError。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,748評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,165評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,595評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,633評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,435評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,943評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,035評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,175評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,713評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,599評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,788評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,303評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,034評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,412評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,664評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,408評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,747評論 2 370

推薦閱讀更多精彩內容