【JVM】01 內存模型(運行時數據區)

JVM(java virtual machine),一種可以運行 java 字節碼的虛擬機。java 語言一次編譯,到處運行,間接的說明了,只要編譯的文件和 jvm 對加載編譯的文件格式一致,任何語言都可以由 JVM 運行。

JVM 由三個主要的子系統構成

  • 類加載子系統
  • 運行時數據區(內存結構)
  • 執行引擎
    在這裏插入圖片描述

今天我們主要學習 JVM 的內存模型 — 運行時數據區。

Java 的內存模型(運行時數據區)在這裏插入圖片描述
1 方法區(Method Area)

所有定義的方法的信息都保存在該區域,靜態變量+常量+類信息(構造方法/接口定義)+運行時常量池都存在方法區中,雖然JVM 規範把方法區描述爲堆的一個邏輯部分,但是它卻有一個別名叫做Non-Heap(非堆),目的應該是爲了和Java的堆區分開。

2 堆(Heap)

jvm 啓動時自動分配創建堆內存,存放對象的實例,凡是 new 出來對象(包括常量池)都在堆上分配內存,當對象申請不到內存將拋出OutOfMemoryError異常,堆是垃圾收集器管理的主要區域。堆是類出生到消亡的地方。方法區和堆存放的是可共享信息,存在線程安全問題。

在這裏插入圖片描述

2.1 新生代(Young Generation)

新生代分爲兩部分:伊甸區(Eden space)和倖存者區(Survivor space),所有的類都是在伊甸區被new出來的。
倖存區又分爲From和To區。程序創建對象,且Eden區的空間不足時,觸發垃圾回收機制,將Eden區中不再使用的對象進行會後,將Eden區中剩餘的對象移到FromSurvivor區,若From Survivor區也滿了,再對該區進行垃圾回收,然後移動到To Survivor區。

2.2 老年代(Old Generation)

新生代經過多次GC仍然有一些舊對象,這些對象將被放入老年代,老年代也滿了,此時觸發Major GC(也可以叫Full GC),進行老年區的內存清理。若老年區執行了Full GC之後發現依然無法進行對象的保存,就會拋出OOM(OutOfMemoryError)異常

2.3 元空間(Meta Space)

JDK1.8之後,元空間替代永久代,它是對JVM規範中方法區的實現,區別在於元數據區不在虛擬機當中,而是用的本地內存,永久代在虛擬機當中,永久代邏輯結構上也屬於堆,但是物理上不屬於。

3 棧(Statck)

Java線程執行方法的內存模型,一個線程對應一個棧(兩者同生共死),每個方法在執行的同時都會創建一個棧幀(用於存儲局部變量表,操作數棧,動態鏈接,方法出口等信息)不存在垃圾回收問題,線程運行完成,棧隨之消失(棧的生命週期與線程相同)所以不需要進行垃圾回收。

一個棧幀就是一個方法,當一個 Java 方法被調用時,會創建一個棧幀,併入棧。一旦完成相應的調用,則出棧。所有的棧幀都出棧後,線程也就結束了,棧消失。

每個棧幀,都包含四個區域:

  • 局部變量表
  • 操作數棧
  • 動態連接
  • 完成出口
    0060215085235.png)

4 本地方法棧(Native Method Stack)

與棧作用相似,區別不過是Java棧爲JVM執行Java方法服務,而本地方法棧爲JVM執行native方法服務。登記native方法,在Execution Engine執行時加載本地方法庫。

5 程序計數器(Program Counter Register)

一個指針,存放java 線程的私有數據,指向方法區中的方法字節碼,執行下一條指令的地址,由執行引擎讀取下一條指令,內存空間小到可以忽略。

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