JVM內存結構

JVM內存結構大致如下:
其中白色塊部分是線程共享,粉色塊是線程隔離的
在這裏插入圖片描述

堆是JVM中最大的一塊內存空間,絕大部分對象都存在堆內存內,然後堆又可以做以下細分:
在這裏插入圖片描述

虛擬機棧

虛擬機棧由棧幀組成,每一次方法調用都會創建一個棧幀,然後去壓棧。當方法返回時,則對應着出棧操作。
在這裏插入圖片描述
棧幀中由包含局部變量表、操作數棧、指向運行時常量池的引用、方法返回地址、動態鏈接。

方法裏的變量在執行時,會從局部變量表或對象實例的字段裏複製變量或常量,放入操作數棧,計算時則從操作數棧裏放入或取走數據。

本地方法棧

本地方法棧和虛擬機棧功能類似,虛擬機棧管理JAVA方法,而本地方法棧管理NATIVE方法

程序計數器

用來記錄各個線程執行的字節碼地址

方法區

方法區包含類信息、運行時常量池、字符串常量池和靜態變量
在這裏插入圖片描述

  • 靜態常量池:也叫class文件常量池,主要存放:
    • 字面量:例如文本字符串、final修飾的常量
    • 符號引用:例如類和接口的全限定名、字段的名稱和描述符、方法的名稱和描述符
  • 運行時常量池:當類加載到內存中後,JVM就會將靜態常量池中的內容存放到運行時的常量池中;運行時常量池裏面存儲的主要是編譯器間生成的字面量、符號引用等等
  • 字符串常量池:也可以理解成運行時常量池分出來的一部分,類加載到內存的時候,字符串會存到字符串常量池裏面