天天看點

JVM記憶體結構

JVM記憶體結構 - 運作時資料區

JVM記憶體結構
  • 共享:方法區和堆是所有線程共享的記憶體區域
  • 私有:Java棧、本地方法棧和程式計數器是線程私有的記憶體區域
  1. 方法區/永久代:存儲運作時常量池,已被虛拟機加載的類資訊,常量,靜态變量,即時編譯器編譯後的代碼等資料。JDK8以後,方法區被取消了,由元空間取代,功能上差別不大,最大的差別是“元空間”使用作業系統的直接記憶體,而方法區使用的是虛拟機記憶體。
  2. 堆:儲存對象執行個體和數組
  3. Java棧(Java方法執行的記憶體模型):每個線程都有自己的java虛拟機棧,線程裡的每個方法就是一個棧幀,棧幀又有變量。每一個方法被調用直至執行完成的過程,就對應着一個棧幀在虛拟機中從入棧到出棧的過程
  4. 本地方法棧:JVM調用本地方法,為虛拟機能使用到Native方法服務
  5. 程式計數器:記錄目前線程所執行到的位元組碼行号

JVM記憶體結構 - Java Memory Model

JVM記憶體結構
  1. 堆記憶體:堆記憶體是JVM中最大的一塊由年輕代和老年代組成,而年輕代記憶體又被分為三部分,Eden空間、From Survivor空間、To Survivor空間,預設情況下年輕代按照8:1:1的比例配置設定
  2. 方法區:方法區儲存類資訊、常量、靜态變量等資料,是線程共享的區域,為與Java堆區分,方法區還有一個别名Non-Heap(非堆)
  3. 棧:棧又分為Java虛拟機棧和本地方法棧,主要用于方法的執行

JVM 記憶體結構 - 對象配置設定規則

JVM記憶體結構

GC類型

  • Minor GC針對新生代的GC
  • Major GC 針對老年代的GC
  • Full GC 針對新生代、老年代和永久代的GC

對象配置設定規則

  1. 對象優先配置設定在Eden區
  2. 大對象直接進入老年代(大對象是指需要大量連續空間的對象)
  3. 長期存活的對象進入老年代:虛拟機為每個對象定義了一個年齡計數器,如果對象經過了1次Minor GC那麼對象會進入Survivor區,之後每經過一次Minor GC那麼對象的年齡加1,直到達到閥值(預設門檻值 15)對象進入老年代
  4. 動态判斷對象的年齡:如果Survivor區中相同年齡的對象大小的總和大于Survivor空間的一半,年齡大于或等于該年齡對象可以直接進入老年代
  5. 空間配置設定擔保:隻有老年代的連續空間大于新生代對象總大小或者曆次晉升的平均大小就會進行Minor GC,否則将進行Full GC