JVM---堆(概述)

概述

  • 一個JVM實例只存在一個堆內存,堆也是Java內存管理的核心區域。

  • Java堆區在JVM啓動的時候即被創建,其空間大小也就確定了。是JVM管理的最大一塊內存空間。

    • 堆內存的大小是可以調節的。
  • 《Java虛擬機規範》規定,堆可以處於物理.上不連續的內存空間中,但在邏輯上它應該被視爲連續的。

  • 所有的線程共享Java堆,在這裏還可以劃分線程私有的緩衝區( ThreadLocal Allocation Buffer, TLAB) 。

  • 《Java虛擬機規範》中對Java堆的描述是:所有的對象實例以及數組都應當在運行時分配在堆上。(The heap is the run-time data area fromwhich memory for all class instances and arrays is allocated )

    • 我要說的是:幾乎”所有的對象實例都在這裏分配內存。–從實際.使用角度看的。
  • 數組和對象可能永遠不會存儲在棧,上,因爲棧幀中保存引用,這個引用指向對象或者數組在堆中的位置。

  • 在方法結束後,堆中的對象不會馬.上被移除,僅僅在垃圾收集的時候纔會被移除。

  • 堆,是GC ( Garbage Collection,垃圾收集器)執行垃圾回收的重點區域。

堆的核心概述:內存細分

現代垃圾收集器大部分都基於分代收集理論設計,堆空間細分爲:

  • Java 7及之前堆內存邏輯。上分爲三部分:新生區+養老區+永久區

    • Young Generation Space 新生區 Young/New
      • 又被劃分爲Eden區和Survivor區
    • Tenure generation space 養老區 Old/ Tenure
    • Permanent Space 永久區 Perm
  • Java 8及之後堆內存邏輯上分爲三部分:新生區+養老區+元空間

    • Young Generation Space 新生區 Young/New

      • 又被劃分爲Eden區和Survivor區
    • Tenure generation space 養老區 Old/Tenure

    • Meta Space 元空間 Meta

約定:新生區<=>新生代<=>年輕代 養老區<=>老年區<=>老年代 永久區<=>永久代

堆空間大小的設置

  • Java堆區用於存儲Java對象實例,那麼堆的大小在JVM啓動時就已經設定好了,大家可以通過選項"-Xmx"和”-Xms"來進行設置。
    • “-Xms"用 於表示堆區的起始內存,等價於-XX: InitialHeapSize
    • “-Xmx" 則用於表示堆區的最大內存,等價於-XX :MaxHeapSize
  • 一旦堆區中的內存大小超過“-Xmx"所指定的最大內存時,將會拋出OutOfMemoryError異常。
  • 通常會將-Xms和-Xmx兩個參數配置相同的值,其目的是爲了能夠在java垃圾回收機制清理完堆區後不需要重新分隔計算堆區的大小,從而提高性能。
  • 默認情況下,
    • 初始內存大小:物理電腦內存大小/ 64
    • 最大內存大小:物理電腦內存大小/ 4

年輕代與老年代

在這裏插入圖片描述

  • 存儲在JVM中的Java對象可以被劃分爲兩類:

    • 一類是生命週期較短的瞬時對象,這類對象的創建和消亡都非常迅速
    • 另外–類對象的生命週期卻非常長,在某些極端的情況下還能夠與JVM的生命週期保持一致。
  • Java堆區進一步細分的話, 可以劃分爲年輕代(YoungGen)和老年代(OldGen)

  • 其中年輕代又可以劃分爲Eden空間、Survivor0空間和Survivor1空間(有時也叫做from區、to區)。

  • 配置新生代與老年代在堆結構的佔比。

    • 默認-Xx: NewRatio=2,表示新生代佔1,老年代佔2,新生代佔整個堆的1/3
    • 可以修改-XX:NewRatio=4, 表示新生代佔1,老年代佔4,新生代佔整個堆的1/5
  • 在HotSpot中, Eden空間 和另外兩個Survivor空間缺省所佔的比例是8:1:1

  • 當然開發人員可以通過選項“-XX:SurvivorRatio”調整這個空間比例。比
    如-XX : SurvivorRatio=8

  • 幾乎所有的Java對象都是在Eden區被new出來的。

  • 絕大部分的Java對象的銷燬都在新生代進行了。

    • IBM公司的專門研究表明,新生代中80號的對象都是“朝生夕死”的。
  • 可以使用選項"-Xmn"設置新生代最大內存大小

    • 這個參數一般使用默認值就可以了。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章