1. 程式人生 > >Java虛擬機器記憶體劃分分析

Java虛擬機器記憶體劃分分析

根據《Java虛擬機器規範(Java SE7版)》的規定,Java虛擬機器所管理的記憶體將會包括以下幾個執行時資料區域,如圖所示

一、程式計數器

        程式計數器是一塊較小的記憶體空間,他的作用可以看做是當前執行緒所執行的位元組碼的行號指示器。在虛擬機器的概念模型裡(僅是概念模型,各種虛擬機器可能會通過一些更高效的方式去實現),位元組碼直譯器工作時就是通過改變這個計數器的值來選取下一條需要執行的位元組碼指令,分支、迴圈、跳轉、異常處理、執行緒恢復等基礎功能都需要依賴這個計數器來完成。
        由於java虛擬機器的多執行緒是通過執行緒輪流切換並分配處理器執行時間的方式來實現的,在任何一個確定的時刻,一個處理器(對於多核處理器來說是一個核心)只會執行一條執行緒中的指令。因此,為了執行緒切換後能恢復到正確的執行位置,每條執行緒都需要有一個獨立的程式計數器,各條執行緒之間的計數器互不影響,獨立儲存,我們稱這類記憶體區域為“執行緒私有”的記憶體。

        如果執行緒正在執行一個java方法,這個計數器記錄的是正在執行的虛擬機器位元組碼指令的地址;如果正在執行的是Native方法,這個計數器為空(undefined)。此記憶體區域是唯一一個在java虛擬機器規範中沒有規定任何OutOfMemoryError情況的區域。

二、虛擬機器棧

        虛擬機器棧也是執行緒私有的,它的生命週期與執行緒相同。虛擬機器棧描述的是Java方法執行的記憶體模型:每個方法在執行的同時都會建立一個棧幀用來存放儲存區域性變量表、運算元表、動態連線、方法出口等資訊,每一個方法從呼叫直至執行完成的過程,就對應著一個棧幀在虛擬機器棧中入棧到出棧的過程。

        具體的說就是執行一個類(類中有main方法)時,執行到main方法,就會把為main方法建立一個棧幀,然後在加到虛擬機器棧中,棧幀中會存放這main方法中的各種區域性變數,物件引用等東西。當在main方法中呼叫別的方法時,就會有另一個方法的棧幀入虛擬機器棧,當該方法呼叫完了之後,彈棧,然後main方法處於棧頂,就繼續執行,直到結束,然後main方法棧幀也彈棧,程式就結束了。

        在java虛擬機器規範中,對這個區域規定了二種異常狀況:如果執行緒請求的棧深度大於虛擬機器所允許的深度,將丟擲StackOverflowError異常;如果虛擬機器棧可以動態擴充套件,如果擴充套件時無法申請到足夠的記憶體,就會丟擲OutOfMemeryError異常。

三、Java堆

        所有執行緒共享的一塊記憶體區域。Java虛擬機器所管理的記憶體中最大的一塊,因為該記憶體區域的唯一目的就是存放物件例項。Java堆是垃圾收集器管理的主要區域,因此很多時候也被稱為GC堆。從記憶體回收的角度來看,由於現在收集器基本都採用分代收集演算法,所以Java堆還可以細分為:新生代和老年代;再細緻一點的有Eden空間、From Survivor空間、To Survivor空間等。

        根據Java虛擬機器規範的規定,Java堆可以處在物理上不連續的記憶體空間中,只要邏輯上是連續的即可,就像我們的磁碟空間一樣。在實現時,既可以實現成固定大小的,也可以是可擴充套件的,不過當前主流的虛擬機器都是按照可擴充套件來實現的(通過-Xmx和-Xms控制)。如果在堆中沒有記憶體完成例項分配,並且堆也無法擴充套件時,將會丟擲OutOfMemoryError異常。

四、方法區

        方法區和Java堆一樣,是各個執行緒共享的記憶體區域,它用於儲存已被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等資料。方法區域又被稱為“永久代”,但這僅僅對於Sun HotSpot來講,JRockit和IBM J9虛擬機器中並不存在永久代的概念。Java虛擬機器規範把方法區描述為Java堆的一個邏輯部分,而且它和Java Heap一樣不需要連續的記憶體,可以選擇固定大小或可擴充套件,另外,虛擬機器規範允許該區域可以選擇不實現垃圾回收。相對而言,垃圾收集行為在這個區域比較少出現,但是這部分割槽域的回收確實是必要的。在Sun公司的BUG列表中,曾出現過的若干個嚴重的BUG就是由於低版本的HotSpot虛擬機器對此區域未完全回收而導致記憶體洩漏。

五、本地方法棧

      該區域與虛擬機器棧所發揮的作用非常相似,只是虛擬機器棧為虛擬機器執行Java方法服務,而本地方法棧則為使用到的本地作業系統(Native)方法服務。在虛擬機器規範中對本地方法棧中方法使用的語言,使用方式與資料結構並沒有強制規定,因此虛擬機器可以自由實現。有些虛擬機器比如(Sun HotSpot虛擬機器)直接將本地方法棧和虛擬機器棧合二為一。與虛擬機器棧一樣,本地方法區域也會丟擲StackOverFlowError(SOF)和OutOfMemoryError(OOM)異常。

--------------------------------------------引自《深入理解JVM虛擬機器》

相關推薦

Java虛擬機器記憶體劃分分析

根據《Java虛擬機器規範(Java SE7版)》的規定,Java虛擬機器所管理的記憶體將會包括以下幾個執行時資料區域,如圖所示一、程式計數器        程式計數器是一塊較小的記憶體空間,他的作用可以看做是當前執行緒所執行的位元組碼的行號指示器。在虛擬機器的概念模型裡(僅

JAVA虛擬機器記憶體劃分學習

JAVA虛擬機器所管理的記憶體將分為以下幾個區:  1.程式計數器:主要包括程式的分支、迴圈、跳轉、異常處理等基礎功能;  2.棧:主要用於儲存區域性變數、方法出口、物件引用等資訊; 是執行緒私有的,生命週期與執行緒相同;  3.堆:主要儲存物件的例項;是執

java 虛擬機器記憶體劃分,類載入過程以及物件的初始化

涉及關鍵詞: 虛擬機器執行時記憶體 java記憶體劃分 類載入順序  類載入時機  類載入步驟  物件初始化順序  構造程式碼塊順序 構造方法 順序 記憶體區域   java記憶體圖  堆 方法區 虛擬機器棧 本地方法棧 程式計數器  區域性變量表   棧幀  java堆 執行時常量池   直接記憶體

java虛擬機器記憶體區域的劃分以及作用詳解

        為什麼有時候學著學著會突然之間覺得一切度是那麼無趣,男的每個月也有那麼幾天難道?哈哈,不然是什麼,我還是要堅持,可以做少一點,但是不能什麼度不做。總會過去的,加油                                              

Java虛擬機器記憶體溢位原因分析以及解決方案

在Java虛擬機器規範的描述之中,除了程式計數器外,虛擬機器記憶體的其他幾個執行時區域都有可能發生記憶體溢位OutOfMemoryError(OOM)異常的可能。 最常見的記憶體溢位情況就是Java堆的記憶體溢位。明顯異常提示資訊為:Java heap Space.為了方便

深入JVM(Java虛擬機器)(一)Java虛擬機器記憶體區域劃分

   本文為博主參閱自《深入理解Java虛擬機器:JVM高階特性與最佳實踐(第2版)》,書中的全部講解均以《Java虛擬機器規範(Java SE 7)》為依據    圖一中為JVM規範中對java虛擬機器記憶體區域的劃分及定義,為單執行緒時的粗略劃分 圖二,中所繪為JVM

Java虛擬機器記憶體區域劃分-----內容為自己記憶所用

首先是通過網上圖片自己所畫的java虛擬機器記憶體圖 1.程式計數器 程式計數器與執行緒的相關的 當一個執行緒停止工作後,在次啟動該執行緒,執行緒是如何回到上一次停止工作的地方,此時便應用到了程式計數器 2.本地方法棧 它就是與外界一些關聯,比如作業系統之類

Java虛擬機器記憶體區域劃分

Java程式執行時的資料區域 Java虛擬機器在執行Java程式的過程中,會把它所管理的記憶體劃分為若干個不同的資料區域,這些區域都有各自的用途,以及建立和銷燬的時間,有的區域隨著虛擬機器程序的啟動而存在,有些區域則依賴使用者執行緒的啟動和結束而建立和銷燬。J

Java虛擬機器--記憶體區域劃分

執行時資料區域 在執行時資料區內,白色部分的是執行緒私有的:虛擬機器棧、本地方法棧、程式計數器 程式計數器:執行緒私有,可以看做當前執行緒所執行的位元組碼的行號指示器。若執行緒正在執行

《深入理解Java虛擬機器》個人讀書總結——JAVA虛擬機器記憶體

《深入理解Java虛擬機器》個人讀書總結——JAVA虛擬機器記憶體 最近在讀《深入理解Java虛擬機器》,網上對Java虛擬機器的總結有很多,自己覺得自己也應該記錄一點個人的讀書總結,以便日後複習方便。 隨著開發工作的逐漸深入,對Java的理解不能止步於crud,Java不像C語言

java虛擬機器(第二版) 第二章總結 (三)-手工復現java虛擬機器記憶體溢位(OutOfMemoryError異常)

  文章概述 的java虛擬機器記憶體溢位的簡要概述,復現堆記憶體,棧記憶體,方法區的執行時常量池記憶體等區域的溢位情況,以及上述區域發生記憶體溢位的判斷方式和解決思路。   1,概述:      IDE為eclipse,需要在執

jvm學習筆記(1)——java虛擬機器記憶體區域

一、java記憶體區域:      1、程式計數器(執行緒私有):     記憶體中較小的記憶體空間,可以當做當前執行緒所執行位元組碼的行號指示器。如分支、迴圈、跳轉、異常處理、執行緒恢復都需要依賴這個計數器完成。 2、java虛擬機

Java虛擬機器 記憶體管理與垃圾回收

java和C++之間有一堵由記憶體自動分配與垃圾回收所圍成的高牆,外面的人想進來,裡面的人想出去 主要內容 記憶體分佈 垃圾回收機制 垃圾收集器 Java記憶體分佈 當java虛擬機器執行程式時,會把由虛擬機器管理的記憶體劃分為不同的區域,他們的作用不同,建立和銷燬時間也不同,有的是虛擬

Java虛擬機器記憶體模型與執行緒

Java虛擬機器—記憶體模型與執行緒 Lyon Keep balance,Be a better man! ​關注他 3 人讚了該文章 前言: 本文主要介紹Java的記憶體模型和Java執行緒。 Java記憶體模型的主要目標是定義程式中各個變數的訪問規則,即在JVM

JVM系列第6講:Java 虛擬機器記憶體結構

看到這裡,我相信大家對於一個 Java 原始檔是如何變成位元組碼檔案,以及位元組碼檔案的含義已經非常清楚了。那麼接下來就是讓 Java 虛擬機器執行位元組碼檔案,從而得出我們最終想要的結果了。在這個過程中,Java 虛擬機器會載入位元組碼檔案,將其存入 Java 虛擬機器的記憶體空間中,之後進行一系列的初始化

JVM調優--------理解java虛擬機器記憶體模型

java虛擬機器記憶體模型是java程式執行的基礎,為了能使Java應用程式正常執行,JVM虛擬機器將記憶體資料分為程式計數器,虛擬機器棧,本地方法棧,Java堆和方法區 程式計數器用於存放下一條執行的指令;虛擬機器棧和本地方法棧用於存放函式呼叫堆疊資訊;java堆用於存放Java程式執行時所需

Confluence 提高Java虛擬機器記憶體

Confluence 提高Java虛擬機器記憶體 版本 系統:CentOS release 6.8 (Final)Java版本:1.8.0_162Confluence版本:6.8.5 問題描述 confluence記憶體使用率的配置都是預設的,相對會比較低,可以根據實際server的配置情況,升級記憶

JVM篇:淺談java虛擬機器記憶體模型

  博主最近嘗試著瞭解JVM,博主目前的一些理解,總之會隨著博主的深入瞭解慢慢完善吧 圖片來自網路 當JVM執行時,便會建立這五個區域,退出時銷燬。 JVM的五個區域:方法區、堆、棧(也可以稱為虛擬機器棧)、程式計數器、本地方法棧 博主在這裡說明一下:方法區概括了元空間

Java虛擬機器-記憶體管理

參考深入理解Java虛擬機器 執行時記憶體包括: 方法區(Method Area) 虛擬機器棧(VM Stack) 本地方法棧(Native Method Stack) 堆(Heap) 程式計數器(Program counter Register) 程式計數器

Java 虛擬機器記憶體溢位問題和解決方法

一什麼是記憶體溢位 1記憶體溢位是指應用系統中存在無法回收的記憶體或使用的記憶體過多,最終使得程式執行要用到的記憶體大於虛擬機器能提供的最大記憶體。 2 Java的記憶體管理就是物件的分配和釋放問題。 在Java中,記憶體的分配是由程式完成的,而記憶體的釋