天天看點

簡述Java記憶體區域

概述

本文将介紹Java虛拟機(JVM)記憶體的各個區域,了解虛拟機是怎樣使用記憶體的。

運作時資料區域

根據虛拟機規範,虛拟機所管理的記憶體将會包括以下幾個運作時資料區域,如下圖所示。

簡述Java記憶體區域
  • 線程獨占:每個線程都會有它獨立的空間,随線程生命周期而建立和銷毀
  • 線程共享:所有線程能通路這塊記憶體資料,随虛拟機或者GC而建立和銷毀

方法區

方法區用于存儲已被虛拟機加載的類資訊、常量、靜态變量、編譯後的代碼等資料。方法區隻是虛拟機規範重的一個邏輯區劃,具體的實作不受規範限制。如:

  • HotSpot在java7中将方法區放在永久代(使用永久代實作方法區),通過GC機制進行管理
  • HotSpot在java7中将方法去存儲在中繼資料空間,通過GC機制進行管理

堆記憶體

Java堆由虛拟機啟動時建立,唯一的目的就是存放對象執行個體。也因為Java堆是垃圾收集器管理的主要區域,是以很多時候也稱為“GC堆”。由于收集器采用分代收集算法,堆記憶體還可以細分為:老年代、新生代(Eden、From Survivor、To Survivor)

虛拟機棧

Java虛拟機棧是線程私有的,每一個線程都在空間有一個私有的空間,它的生命周期和線程相同。虛拟機棧描述的是Java方法執行的記憶體模型,每個方法在執行的同時都會建立一個棧幀。棧幀内容包含:局部變量表、操作數棧、動态連接配接、方法放回位址、附加資訊等。

本地方法棧

本地方法棧和虛拟機棧功能類似,虛拟機棧是為虛拟機執行Java方法而準備的,本地方法棧是為虛拟機使用Native本地方法而準備的。

程式計數器

為了線程線程切換後能恢複到正确的執行位置,每條線程都需要一個獨立的程式計數器,線程間互不影響。程式計數器可以看作是目前線程所執行的位元組碼的行号訓示器,記錄目前線程執行位元組碼的位置,存儲的是位元組碼指令位址,如果是Native方法,這個計數器值為空。

繼續閱讀