天天看點

jvm 記憶體管理-運作時資料區域

 jvm在執行java程式時,會把所管理的記憶體分為幾個不同的資料區域,每個區域有不同的用途,以及建立銷毀的時間。

    <java虛拟機規範>規定,JVM所管理的記憶體包括幾個運作時資料區域

    方法區

            被所有線程共享,用于存儲被虛拟機加載的類資訊,常量,靜态變量,即時編譯器編譯後的代碼,

            方法區無法滿足記憶體配置設定需求,outofmemoryerror錯誤

            運作時常量池,方法區的一部分,存放編譯器生成的字面量和符号引用,運作期間可以将新的常量放入池中,比如String的intern().

    虛拟機棧

            線程私有,生命周期與線程相同,此區域描述java方法執行的記憶體模型,每個方法執行時都會建立一個棧幀,用于存儲局部變量表(基本資料類型,對象引用),操作數棧,方法出口等

  1. 線程私有區域
  2. 線程棧深度大于虛拟機允許的深度,StackOverflowError錯誤
  3. 虛拟機棧可動态擴充,如果擴充時,無法申請到足夠記憶體,outofmemoryerror錯誤

     本地方法棧

            與虛拟機棧類似,虛拟機棧執行java方法(位元組碼服務),本地方法棧為Native方法服務,Sun HotSpot将本地方法棧和虛拟機棧合二為一。本地方法棧也會有StackOverflowError和outofmemoryerror

     堆

            此區域是JVM管理記憶體最大的一塊,被所有線程共享,該區域唯一目的就是存放對象執行個體,所有對象執行個體和數組都要在堆上配置設定,随着JIT編譯器發展,逃逸分析技術成熟,棧上配置設定,标量替換會導緻所有對象配置設定在堆上變得不絕對。()

     java堆是垃圾收集管理的主要區域,由于現在收集器基本采用分代收集算法,java堆可分為新生代,老年代。

    java堆可以處于不連續的記憶體空間,如果堆中沒有記憶體完成執行個體配置設定,并且堆無法擴充,outofmemoryerror錯誤,可以通過(-Xms  -Xmx控制)

    程式計數器

            一塊較小的記憶體空間,可以當作目前線程所執行的位元組碼的行号訓示器。位元組碼解釋器就是通過改變這個計數器的值選取需要下一個需要執行位元組碼指令,分支,循環,跳轉,異常處理,線程恢複都依賴程式計數器。

  1. 如果線程正在執行的是Java 方法,則這個計數器記錄的是正在執行的虛拟機位元組碼指令位址
  2. 如果正在執行的是Native 方法,則這個技術器值為空(Undefined)
  3. 此記憶體區域是唯一一個在Java虛拟機規範中沒有規定任何OutOfMemoryError情況的區域
  4. 線程私有區域

hotSpot 中,不區分虛拟機棧和本地方法棧。

本文内容主要是學習周志明老師的《深入了解Java虛拟機》一書的學習筆記,僅作學習鞏固整理知識點使用,在此感謝周老師。

jvm