1. 程式人生 > >JVM的基本結構和JVM內存結構

JVM的基本結構和JVM內存結構

字符 函數 初始 修改 mach html 空間 使用 mage

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堆的一部分。

Java方法區包括了已被虛擬機加載的類信息、常量池、靜態變量、即時編譯器編譯後的代碼等數據,它實際上構成了Java程序的方法區和數據區。

JVM的垃圾回收器主要工作是回收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

JVM的基本結構和JVM內存結構