jvm學習-內存模型

內存劃分

Java虛擬機在執行Java程序的過程當中會把它所管理的內存劃分紅若干個不一樣區域,這些區域都有各自用他,以及建立銷燬時間,有的區域隨進程的啓動而存在,有的依賴用戶線程的啓動和結束而創建和銷燬,它有以下幾個區域,以下圖:this

jdk8方法區變成了metaspacespa

數據區域

程序計數器:    每個線程都有一個程序計數器,記錄着正在執行的虛擬機字節碼指令的地址,若是執行的是native方法,這個計數器爲空;
Java虛擬機棧:每個線程都有一個Java虛擬機棧,每一個方法執行的時候都建立一個棧幀,方法執行的時候就是一個棧幀在在虛擬機棧中的入棧出棧
本地方法棧:    根據虛擬機棧很是類似,區別就是它裏面執行的是本地方法
堆:                  全部線程共享區域,又稱GC堆,此區域的惟一目的就是存放生成的對象實例,它裏面又分爲年輕代,年老代方便內存分配和垃圾回收,這也是內存調優最核心的區域
方法區:           存儲每個類的結構信息、常量、靜態變量,算是堆的一個邏輯部分(能夠叫成永久代)線程

棧幀

每一個棧幀都有本身的局部變量表、操做數棧和指向當前方法所屬的類的運行常量池的引用,一條線程中只有一個棧幀是正在活動的,稱爲當前棧幀。對象

局部變量表:長度由編譯期決定,long和double須要兩個局部變量保存,局部變量表能夠完成方法調用時的參數傳遞,第0個局部變量必定是用來存放被調用對象的引用(this)進程

操做數棧:    存放部分執行結果的數據,操做數棧也被用來準備方法參數以及接收方法結果內存

動態連接:   字節碼中的方法調用指令就以常量池中指向方法的符號引用爲參數。這些符號引用一部分會在類加載階段或第一次使用的時候轉化爲直接引用,這種轉化稱爲靜態解析,虛擬機

                      另一部分將在每一次的運行期間轉  化爲直接引用,這部分稱爲動態鏈接。編譯

返回地址:  方法退出後要返回到方法被調用的位置,正常退出返回棧幀的內容就能夠幫助調用者恢復執行狀態,異常退出須要異常處理器處理肯定。變量

內存異常

棧異常 :若是線程請求分配的容量大於Java虛擬機容許的最大容量,Java虛擬機就會拋一個StackOverflowError擴展

               若是虛擬機棧能夠動態擴展,而且擴展動做已經嘗試過,但沒法申請到足夠的內存則拋出OutOfMemoryError

堆異常 :若是堆中沒法申請到內存則拋OutOfMemoryError

方法區:若是方法區中的內存不能知足內存分配請求,那麼拋出 OutOfMemoryError

相關文章
相關標籤/搜索