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

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

申請 也有 linux lin inux 程序 vivo 操作系統 數據區

這裏概要介紹一下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字節碼的核心,執行方式主要分為:解釋執行、編譯執行、自適應優化執行、硬件芯片執行等方式。關於執行引擎也可以單獨總結。

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