java內存區域介紹

java虛擬機在執行java程序的過程當中會把它所管理的內存劃分爲不一樣的區域,這些區域有各自不一樣的用途,以及建立和銷燬時間,java虛擬機所管理的區域有:方法區、虛擬機棧、本地方法棧、堆、程序計數器等。java

1  程序計數器:多線程

  程序計數器是一塊較小的內存空間,它的做用能夠看作是當前線程執行的字節碼的行號指示器,因爲虛擬機的多線程是經過線程輪流切換並分配處理器執行時間的方式來實現,在任何一個肯定的時刻,一個處理器只會執行一條線程中的指令。所以,爲了線程切換後能恢復到正確的執行位置,每條線程都須要有一個獨立的程序計數器,各條線程之間的計數器互不影響,獨立存儲,若是線程正在執行是一個java方法,這個計數器記錄的是正在執行的字節碼指令的地址;若是執行的是Native方法,這個計數器值則爲空。此內存區域是惟一一個在java虛擬機規範中沒有規定任何OutOfMemoryError狀況的區域。線程

2  java虛擬機棧對象

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

  局部變量表存放了編譯期可知的各類基本數據類型(boolean,byte,char,short,int)、對象引用和returnAddress類型(指向了一條字節碼指令的地址)。內存

  其中64位長度的long和double類型的數據會佔用兩個局部變量空間,其他的數據類型只佔用一個。局部變量表所需的內存空間在編譯期間完成分配,當進入一個方法時,這個方法須要在幀中分配多大的局部變量空間是徹底肯定的,在方法運行期間不會改變局部變量表的大小。虛擬機

  在java虛擬機規範中,對於這個區域規定了兩種異常情況:若是線程請求的棧深度大於虛擬機所容許的深度,將跑出StackOverflowError異常:若是虛擬機棧能夠動態擴展,當擴展時沒法申請到足夠的內存就會拋出OutOfMemoryError異常。編譯

3  本地方法棧變量

  本地方法棧與虛擬機棧發揮的做用很是類似,其區別不過是虛擬機棧是爲虛擬機執行的java方法服務,而本地方法棧則是爲虛擬機使用的Native方法服務。虛擬機規範中對本地方法棧中的方法使用語言、使用方式等並沒有明確規定,所以具體的虛擬機能夠自由實現。甚至有的虛擬機把本地方法棧和虛擬機棧合二爲一。本地方法棧也會跑出StackOverflowError和OutOfMemoryError異常。擴展

相關文章
相關標籤/搜索