JVM 內存結構
方法區:也叫永久區,線程共享,用於存儲類結構信息的地方,包括常量池、靜態變量、構造函數等類型信息,類型信息是由類加載器在類加載時從類文件中提取出來的,永久區同樣存在垃圾回收機制,用為用戶通過加載器加載的一些類同樣會成為垃圾,JVM 會回收一個未被類引用所占的空間,以使方法區空間達到最小
堆:是存儲 Java 對象的地方,是 GC 的主要區域,同樣是線程共享的主要區域
Java 虛擬機棧:存儲基本數據類型,局部變量,虛擬機棧和線程緊密聯系,每創建一個線程就會創建一個對應的虛擬機棧,所以虛擬機棧是線程私有的,這個棧中還包括一個個的棧幀,沒吊用一個方法就會向棧中創建並壓入一個棧幀,每個方法從執行到結束的過程,就對應了虛擬機棧從入棧到出戰的過程
本地方法棧:本地方法棧和虛擬機棧功能類似,只不過虛擬機棧為 Java 方法服務,而本地方法棧為外部方法服務,外部方法用 native 標識
本地方法接口:Java 本地接口(JNI)允許運行在Java虛擬機(JVM)上的代碼調用本地程序和類庫,或者被它們調用,這些程序和類庫可以是其它語言編寫的,比如 C、C++ 或者匯編語言
直接內存:堆外內存,又被稱為直接內存,這部分內存不是由 JVM管理和回收的,需要我們手動的回收,堆內內存是屬於 JVM 的,由 JVM 進行分配和管理,屬於"用戶態",而堆外內存是由操作系統管理的,屬於"內核態",在 JDK1.4 中加入了 NIO 類,它可以調 native 函數庫直接分配堆外內存,然後通過 Java 堆中的 DirectByteBuffer 對象來指向這塊內存,進行內存分配等工作
執行引擎:虛擬機核心的組件就是執行引擎,它負責執行虛擬機的字節碼,一般戶先進行編譯成機器碼後執行
運行時常量池:Class 文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池,用於存放編譯期生成的各種字面量和符號引用,這部分內容將在加載後進入方法區的運行時常量池中存
PC:程序計數器是一塊較小的內存空間,它可以看做是當前線程所執行的字節碼的行號指示器 ;在虛擬機的概念模型裏(僅僅是概念模型,各種虛擬機可能會通過一些更高效的方式去實現),字節碼解釋器工作時,就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令,分支、循環、跳準、異常處理、線程恢復等基礎功能都需要依賴這個計數器來完成
JVM 內存結構