Java內存模型簡述


  • 程序計數器(記錄代碼指令地址)
  • Java虛擬機棧(記錄Java方法執行時信息)
  • 本地方法棧(記錄Native方法執行時信息)
  • 方法區(記錄類信息,常量,靜態變量)
  • Java堆(用于對象實例化內存分配)

1.程序計數器

  • 記錄當前線程執行的字節碼指令地址
  • 線程隔離(及線程私有,每個線程都有一個程序計數器)
  • 如當前執行native方法,則計數器值為空
  • 不會拋出OutOfMemory(虛擬機規范中無規定)
  • 字節碼解釋器通過改變程序計數器的值來選去下一條指令

2.Java虛擬機棧

  • Java方法執行的內存模型(一個方法開始執行時,會創建一個棧幀,用來存儲該方法的各種信息,并把棧幀push入棧,在方法執行完成之后,把棧幀pop出棧)
  • 線程隔離且生命周期與線程相同
  • 會拋出StackOverflow(因為每執行一個方法都會產生一個棧幀入棧,所以調用遞歸方法時會比較容易拋出該異常)
  • 會拋出OutOfMemory

3.本地方法棧

  • 用于Native方法(作用同Java虛擬機棧)
  • 對語言,使用方式,數據結構無限制(所以不一定只能用C和C++,理論上說還可以用Python,甚至Js?)
  • 線程隔離且生命周期與線程相同
  • 會拋出StackOverflow和OutOfMemory

4.方法區

  • 記錄類加載信息,常量,靜態變量等數據
  • 推薦實現垃圾回收(類型的卸載,常量的回收,可以不實現)
  • 線程共享
  • 會拋出OutOfMemory

5.Java堆

  • 對象實例的內存分配(幾乎所有對象,但并不絕對)
  • 需要實現垃圾回收(該區域為垃圾回收主要區域)
  • 線程共享
  • 劃分為多個區域(以適應垃圾回收機制的優化)
  • 會拋出OutOfMemory

補充

  • Java虛擬機棧中的棧幀:存儲存儲局部變量表,操作數棧,動態鏈接,方法出口等信息
  • 局部變量表:存儲基本數據類型,對象引用和一條字節碼指令地址returnAddress
  • 操作數棧:Java虛擬機的解釋執行引擎基于操作數棧,如某個指令將從棧中pop操作數,執行運算,再將結果push入棧。
  • 對象引用:可能是一個指向對象起始地址的指針或是代表對象的句柄或是其他與此對象相關的位置
  • 運行時常量池:方法區中的一個區域,保存class文件中的符號引用和翻譯出來的直接引用

對于讀《深入理解Java虛擬機》中內存區域的一個簡單的了解總結。如有錯誤請指出。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • JVM內存模型Java虛擬機(Java Virtual Machine=JVM)的內存空間分為五個部分,分別是: ...
    光劍書架上的書閱讀 2,556評論 2 26
  • 從三月份找實習到現在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發崗...
    時芥藍閱讀 42,340評論 11 349
  • 寫在前面本文介紹的Java虛擬機(JVM)的自動內存管理機制主要是參照《深入理解Java虛擬機》(第2版)一書中的...
    EakonZhao閱讀 4,275評論 5 48
  • 看一本好書的感覺就像夏天里喝上一杯冰水,好爽! 我可以一口氣讀完,好像這本書時為我寫的,或者是說為我這一類人寫的,...
    舒瀾小筑閱讀 171評論 0 0
  • 天和元年,軒轅王朝的淑妃病入膏肓。 深夜一陣微風拂來,攜來淡淡的曇花香,室內一片寂靜。 突然病榻前出現一女子,深深...
    流鳶yl閱讀 429評論 0 1