JVM的基本結構和JVM的記憶體結構

TuxedoLinux發表於2018-05-22

JVM的基本結構和JVM的記憶體結構


 

這裡概要介紹一下JVM在啟動後,作為作業系統的一個程式的基本結構,以及從作業系統角度看,JVM如何管理它從作業系統裡申請來的記憶體的,也就是JVM的記憶體結構或者叫JVM記憶體模型。

 

1、JVM的基本結構

================

JVM啟動後,對作業系統來說,JVM是一個的程式,這個程式的基本結構如上圖所示。它包括:類載入器子系統、執行時資料區、執行引擎和本地方法介面

執行時資料區是JVM從作業系統申請來的堆空間和作業系統給JVM分配的棧空間的總稱。JVM為了執行Java程式,又進一步對執行時資料區進行了劃分,劃分為Java方法區、Java堆、Java棧、PC暫存器、本地方法棧等,這裡JVM從作業系統申請來的堆空間被劃分為方法區和Java堆,作業系統給JVM分配的棧空間構成Java棧。

 

2、從作業系統角度看JVM的記憶體結構

==============================

從Linux作業系統角度看,JVM是一個普通的應用程式程式,那麼JVM具有一般作業系統程式的特點,一般的程式的記憶體結構和JVM程式的記憶體結構是類似的,它們的記憶體結構類比參見下圖。

Linux把一個程式在記憶體中所佔的空間分為:方法區、資料區、堆區、棧區,對應地,JVM在記憶體中也有JVM方法區、JVM資料區、堆區和棧區。

程式碼區  中存放應用程式的機器程式碼,執行過程中程式碼不能被修改,具有隻讀和固定大小的特點。

資料區  中存放了應用程式中的全域性資料,靜態資料和一些常量字串等,其大小也是固定的。

堆         是執行時程式動態申請的空間,屬於程式執行時直接申請、釋放的記憶體資源。

棧區      用來存放函式的傳入引數、臨時變數,以及返回地址等資料。未使用區是分配新記憶體空間的預備區域。

由圖中可以知道,JVM堆被JVM進一步分為:執行時資料區中Java的方法區和Java堆(圖中顯示的是:永久、新生、老年,這是分代垃圾回收時的術語,實際上永久代和Java方法區對應,新生代和老年代和Java堆對應),也就說Java方法區和Java堆其實都是JVM堆的一部分。JVM的棧區構成了Java的執行緒棧。

Java方法區,在分代垃圾回收時也被稱為永久區,包括了已被虛擬機器載入的類資訊、常量池、靜態變數、即時編譯器編譯後的程式碼等資料,它實際上構成了Java程式的方法區和資料區。垃圾回收器也會對這部分記憶體進行回收,比如常量池的清理和類的解除安裝。

 (這裡要注意區分JVM堆和Java堆,JVM方法區和Java方法區)

Java堆包括新生代和老年代,新生代包括Edge區兩個Survivor區(from Survivor 和 To Survivor)。

JVM的垃圾回收器主要工作是回收Java堆中的垃圾記憶體,具體來說就是JVM堆中的新生代和老年代所佔的記憶體。垃圾回收的內容主要關注這兩塊區域。執行Java程式之前,可以通過Xms(Java堆初始大小)和Xmx(Java堆最大值)來調整堆記憶體。

關於JVM的垃圾回收器的工作過程,和它回收垃圾記憶體時所遵循的策略也即垃圾回收演算法,可以單獨寫一篇文章總結,這裡不再寫。

 

3、JVM的類載入子系統

===================

JVM的類載入子系統主要用來載入和解除安裝Java類,其工作過程對應於一個類在記憶體中的生命週期,一般可以分為:載入、連線(驗證、準備、解析)、初始化、使用類和解除安裝類。

這個子系統的每一個階段的工作內容可以單獨總結為一篇文章,比如類的載入和類載入器,目前不在這裡多寫。

 

4、執行引擎

=============

執行引擎是JVM執行Java位元組碼的核心,執行方式主要分為:解釋執行、編譯執行、自適應優化執行、硬體晶片執行等方式。關於執行引擎也可以單獨總結。

 

參考文獻

1、《深入理解Java虛擬機器》,周志明。

2、Linux與JVM的記憶體關係分析,http://tech.meituan.com/linux-jvm-memory.html

3、http://blog.hesey.net/2011/04/introduction-to-java-virtual-machine.html

相關文章