Java的內存結構

Java中的內存結構java

運行時數據區域的劃分:
數組

程序計數器(PC寄存器)數據結構

程序計數器(Program Counter Register)是一塊較小的內存空間,能夠看作是當前線程所執行的字節碼的行號指示器。字節碼解釋器工做就是經過改變這個計數器的值來選擇下一條執行的字節碼指令,分支、跳轉、循環、異常處理、線程恢復等基礎功能都須要依賴計數器來完成。多線程

Java虛擬機的多線程就是經過線程輪流切換並分配處理器執行時間的方式來實現的,在任何一個肯定的時刻,一個處理器都只會執行一條線程中的指令。爲了線程切換後能夠恢復到正確的執行位置,每一個線程都須要有一個獨立的程序計數器,各個線程之間的計數器互相不影響,獨立存儲,這類區域也稱爲「私有線程」的內存。優化

線程執行Java方法,計數器記錄的是正在執行的虛擬機字節碼指令的地址;若是執行的是本地方法(Native),計數器爲空(undefined)。程序計數器是惟一一個在Java虛擬機規範中沒有規定任何OutOfMemoryError狀況的區域。線程

Java虛擬機棧(Java方法棧)指針

Java虛擬機棧(Java Virtual Machine Stack)也是線程私有的,他的生命週期與線程相同。虛擬機棧描述的是Java方法執行的內存模型:每一個方法在執行時都會建立一個棧幀(Stack Frame:方法運行時的基礎數據結構)用於存儲局部變量表、操做數棧、動態連接、方法出口等信息。每一個方法從調用直至執行完成的過程,就對應着一個棧幀在虛擬機棧中從入棧到出棧的一個過程。對象

局部變量表存放了編譯期可知的各類基本數據類型(byte、short、int、long、float、double、char、boolean)、對象引用(reference類型,它不等同與對象自己,多是一個指向對象起始地址的指針,也多是指向一個表明對象句柄或其它與此對象相關的位置)和returnAddress類型(指向一條字節碼指令的地址)。其中的64位的long和double類型的數據會佔用兩個局部變量空間,其他數據類型只佔用一個。(能夠將局部變量表當作一個數組,long和double佔用兩個數組單元,其他佔用一個數組單元,一個數組單元在64位的HotSpot上佔用8個字節,32位的HotSpot上佔用4個字節,這也意味着在局部變量表,除了long和double,其他的類型所佔的空間大小是相同的。可是在堆上存儲的字節長度與實際值域相吻合)局部變量表所需的內存空間在編譯期間就完成了分配,當進入一個方法時,這個方法須要在幀中分配多大的局部變量空間是徹底肯定的,在方法運行期間不回改變局部變量表的大小。blog

兩個異常:線程請求的棧深度大於虛擬機所容許的深度,拋出StackOverflowError異常。虛擬機的動態擴展沒法申請到足夠的內存,會拋出OutOfMemoryError異常。接口

本地方法棧

本地方法棧(Native Method Stack)與虛擬機棧所發揮的做用是很是相似的,他們之間的區別不過是虛擬機棧爲虛擬機執行java方法(也就是字節碼)服務,二本地方法棧爲虛擬機使用到的Navicat方法服務 。

本地方法棧也會拋出SatckOverflowError和OutOfMemoryError。

Java堆

Java堆(Java Heap)是Java虛擬機所管理的內存中最大的一塊。java堆是被全部線程共享的一塊內存區域,在虛擬機啓動時建立。 此內存區域的惟一目的就是存放對象實例,幾乎全部的對象實例都在這分配內存。 Java虛擬機規範中描述:全部的對象實例以及數組都要在堆上分配,可是對着JIT編譯器的發揮和逃逸技術逐漸成熟,棧上分配、標量替換優化技術將會致使一些微妙的變化發生,全部的對象都分配在堆上也逐漸變得不是那麼絕對。

Java堆能夠處在物理上不連續的內存空間中,只要邏輯上是連續的便可。若是在堆中沒有內存完成實例分配,而且堆頁沒法擴展時,將會拋出OutOfMemoryError異常。

字符串常量池是在堆中存放和實現的。

方法區

方法區(Method Area)和Java堆同樣,是各個線程共享的內存區域。用於存儲已被虛擬機加載的類信息、常量、靜態常量。即時編譯編譯後額代碼等數據(字節碼相關的文件)。當方法區沒法知足內存分配需求時,將拋出OutOfMemoryError異常。

運行時常量池(Runtime Constant Pool)是方法區的一部分,Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有常量池信息。常量池用於存放編譯器生成的各類字面量(文本字符串、八種基本類型的值、被聲明爲final的常量等)和符號引用(類和方法的全限定名、字段的名稱和描述符、方法的名稱和描述符),當常量池沒法申請到內存時會拋出OutOfMemoryError異常。

相關文章
相關標籤/搜索