Java中JVM內存結構

Java中JVM內存結構

 線程共享區

  • 方法區:

又名靜態成員區域,包含整個程序的 class、static 成員等,類自己的字節碼是靜態的;它會被全部的線程共享和是全區級別的;java

屬於共享內存區域,存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。面試

  • Java (Heap)

存儲的所有都是 Object 對象實例,對象實例中通常都包含了其數據成員以及與該對象對應類的信息,它會指向類的引用一個,不一樣線程確定要操做這個對象;一個 JVM 實例在運行的時候只有一個 Heap 區域,並且該區域被全部的線程共享;補充說明:垃圾回收是回收堆 (heap) 中內容,堆上纔有咱們的對象數組

對於絕大多數應用來講,這塊區域是 JVM 所管理的內存中最大的一塊。線程共享,主要是存放對象實例和數組。內部會劃分出多個線程私有的分配緩衝區(Thread Local Allocation Buffer, TLAB)。能夠位於物理上不連續的空間,可是邏輯上要連續。併發

OutOfMemoryError:若是堆中沒有內存完成實例分配,而且堆也沒法再擴展時,拋出該異常。ide

 線程獨佔區

  • 本地方法棧

這個是在迭歸的時候確定是相當重要的;區別於 Java 虛擬機棧的是,Java 虛擬機棧爲虛擬機執行 Java 方法(也就是字節碼)服務,而本地方法棧則爲虛擬機使用到的 Native 方法服務。也會有 StackOverflowError 和 OutOfMemoryError 異常。.net

  • 程序計數器

這是一個全區計數器,對於線程切換是相當重要的;內存空間小,線程私有。字節碼解釋器工做是就是經過改變這個計數器的值來選取下一條須要執行指令的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能都須要依賴計數器完成線程

若是線程正在執行一個 Java 方法,這個計數器記錄的是正在執行的虛擬機字節碼指令的地址;若是正在執行的是 Native 方法,這個計數器的值則爲 (Undefined)。此內存區域是惟一一個在 Java 虛擬機規範中沒有規定任何 OutOfMemoryError 狀況的區域。3d

  • Java (Stack)

Stack 區屬於線程私有,高效的程序通常都是併發的,每一個線程都會包含一個 Stack 區域,Stack 區域中含有基本的數據類型以及對象的引用,其它線程均不能直接訪問該區域;Java 棧分爲三大部份:基本數據類型區域、操做指令區域、上下文等。線程私有,生命週期和線程一致。描述的是 Java 方法執行的內存模型:每一個方法在執行時都會牀建立一個棧幀(Stack Frame)用於存儲局部變量表、操做數棧、動態連接、方法出口等信息。每個方法從調用直至執行結束,就對應着一個棧幀從虛擬機棧中入棧到出棧的過程。對象

局部變量表:存放了編譯期可知的各類基本類型(boolean、byte、char、short、int、float、long、double)、對象引用(reference 類型)和 returnAddress 類型(指向了一條字節碼指令的地址)blog

StackOverflowError:線程請求的棧深度大於虛擬機所容許的深度。

OutOfMemoryError:若是虛擬機棧能夠動態擴展,而擴展時沒法申請到足夠的內存。

若是想了解更多關於JVM的信息,請參考:

ü  《Java虛擬機(JVM)你只要看這一篇就夠了!:http://www.javashuo.com/article/p-uhqvzxiy-ms.html

ü  《面試必問之JVM原理: https://baijiahao.baidu.com/s?id=1605937053950156833&wfr=spider&for=pc

ü  《java堆內和堆外內存介紹: http://www.javashuo.com/article/p-gkuzbtkr-me.html

相關文章
相關標籤/搜索