一.執行時資料區域

執行緒私有的:程式計數器+虛擬機器棧+本地方法棧

執行緒共享的:堆+方法區(執行時常量池)+直接記憶體(非執行時資料區的一部分)

*JDK1.8後將方法區廢除,新增元空間。

1.1 程式計數器

記錄指令的偏移地址,是唯一一個不會出現OutOfMemoryError的記憶體區域。

思考:為什麼不會出現OutOfMemoryError?

OutOfMemoryError出現原因是由於執行時記憶體動態擴增導致記憶體不夠用,而程式計數器是當執行到下一條指令的時候,改變的只是程式計數器中儲存的地址,不需要申請新的記憶體來儲存新的指令地址,因此,永遠不會出現OutOfMemoryError

1.2 Java虛擬機器棧

虛擬機器棧為虛擬機器執行 Java 方法 (也就是位元組碼)服務

實際上,Java虛擬機器棧是由一個個棧幀組成,而每個棧幀中都擁有:區域性變量表、運算元棧、動態連結、方法出口資訊。

區域性變量表主要存放了編譯器可知的各種資料型別、物件引用。

1.3 本地方法棧

與虛擬機器棧類似,只不過是為native方法服務

1.4 堆

垃圾收集管理(GC)的主要區域,主要存放物件例項,給物件和陣列分配記憶體

1.5 方法區(目前由元空間取代)

儲存已被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等資料

”永久代“用來實現方法區,使GC能像管理堆一樣管理記憶體

*JDK1.8後被元空間取代,使用直接記憶體。

1.6 執行時常量池

用於存放編譯期生成的各種字面量和符號引用,例如:String a="123"

JDK1.7後將執行時常量池從方法區中移了出來,在 堆(Heap)中指定一塊區域存放執行時常量池。

1.7 直接記憶體

不屬於JVM執行時資料區域,但也會發生OutOfMemoryError