1. 程式人生 > 程式設計 >Java執行時資料區劃分原理解析

Java執行時資料區劃分原理解析

Java中物件建立,記憶體分配,垃圾回收的權力交給了虛擬機器,這其中有利也有弊,程式設計師也減輕了負擔,但是如果不熟悉Java的記憶體區域劃分,一旦出現記憶體溢位和洩漏,將會很難定位問題的根源,這就有必要了解Java的執行時資料區劃分。

Java執行時資料區劃分原理解析

方法區(Method Area)

是由各個執行緒共享的記憶體區域,用來儲存已被虛擬機器載入的型別資訊、常量、靜態變數、即時編譯器編譯後的程式碼快取等資料。

堆(Heap)

Java虛擬機器所管理的一塊最大的記憶體區域,由所有的執行緒共享的一塊記憶體區域;堆記憶體在虛擬機器啟動時建立,用來存放物件例項,陣列;Java堆是垃圾收集器管理的記憶體,在G1垃圾收集器之前,堆記憶體普遍採用分代設計思想,新生代,老年代,永久代...,現代垃圾收集器已經不主張採用分代設計理論概念;Java堆既可以被實現成固定大小的,也可以是可擴充套件的,不過當前主流的Java虛擬機器都是按照可擴充套件來實現的(通過引數-Xmx和-Xms設定)。如果在Java堆中沒有記憶體完成例項分配,並且堆也無法再擴充套件時,Java虛擬機器將會丟擲OutOfMemoryError異常。

虛擬機器棧(VM Stack)

虛擬機器棧為執行緒私有,每個方法執行時,虛擬機器都會建立棧幀儲存區域性變量表(包含Java的基本資料型別,以及物件的引用,非物件本身)、運算元棧、動態連線方法出口等資訊,方法從被呼叫到執行結束,對應著一個棧幀在虛擬機器中從入棧到出棧的過程。基本資料型別在區域性變量表中的儲存空間以區域性變數槽(slot)來表示,64位長度的long和double佔用兩個變數槽,其餘資料型別佔用一個,區域性變量表所需要的記憶體空間在編譯期完成,因此進入方法時,每個方法在棧幀需要分配的空間時確定的,執行期間並不會改變區域性變量表的大小(即變數槽的數量),每個槽的空間大小根據虛擬機器的實現而定。

如果執行緒請求的棧深度大於虛擬機器所允許的深度,將丟擲StackOverflowError異常;如果Java虛擬機器棧容量可以動態擴充套件[2],當棧擴充套件時無法申請到足夠的記憶體會丟擲OutOfMemoryError異常。

本地方法棧(Native Method Stack)

類似於虛擬機器棧的作用,區別在於虛擬機器棧用來執行Java的方法,本地方法棧為虛擬機器使用到的笨的方法服務。

程式計數器(Program Counter Register)

是Java記憶體中較小的一部分記憶體空間,由每個Java執行緒所獨享,可以理解為當前執行緒執行的位元組碼行號指示器,Java中程式的執行往往是多執行緒的,在某一個確切的時刻,一個處理器核心直會執行執行緒中的一條指令,每個執行緒都是在不停的切換執行,為了保證切換後可以執行到正確的位置,每個執行緒都要有一個獨立的程式計數器,每個計數器之間互不影響。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。