線程私有:html
一、程序計數器:前端
程序計數器是一個較小的內存空間,它能夠被當作當前線程所執行的字節碼的行號指示器。程序計算器保證了線程切換後能恢復到正確的執行位置。 若是線程正在執行的是一個Java方法,這個計數器記錄的是正在執行的虛擬機字節碼指令的地址;若是正在執行的是Natvie方法,這個計數器值則爲空(Undefined)。在這裏,程序計數器是惟一一個在Java虛擬機規範中沒有規定OutOfMemoryError狀況的區域。java
二、Java棧(全稱是java虛擬機棧):數組
虛擬機棧棧描述的是Java方法執行的內存模型,每一個方法在執行的同時都會建立一個棧幀,用於存儲局部變量表、操做數棧,動態連接、方法出口等信息。每個方法從調用直至執行完成的過程,就對應着一個棧幀在虛擬機棧中入棧出棧的過程。服務器
局部變量表:在變量槽中保存方法的參數和變量(即各類基本數據類型、對象引用類型),每一個變量槽 4 個字節佔 32 位,能夠是基本數據類型也能夠是對象引用。局部變量表大小在編譯時就已經肯定,long 和 double 類型數據會佔 2 個變量槽,其他的只佔用 1 個數據結構
操做數棧:在執行指令的時候用於數據的存取,其大小也是在編譯時就已經肯定jvm
動態連接:每一個棧幀都有它在運行時常量池中所屬方法的引用,在運行時會轉換爲直接引用jsp
返回地址:當一個方法開始執行後,有兩種方式能夠退出這個方法:一是執行引擎遇到返回的字節碼指令;另外一種是在方法執行中出現了異常而且沒有在此方法中處理,這種退出不會返回給上層調用者任何值。不管如何退出,都須要繼續執行上層方法。在方法退出時可能的執行操做有:把返回值(若是有)壓入上層方法的棧幀的操做數棧中,調整 PC 寄存器指向方法調用指令的後一條指令。ui
調節參數lua
<jvm-arg>-Xss1m</jvm-arg>
在Java虛擬機規範中,對這個區域規定了兩種異常情況:若是線程請求的棧深度大於虛擬機所容許的深度,將拋出StackOverflowError異常;若是虛擬機棧能夠動態擴展(當前大部分的Java虛擬機均可動態擴展,只不過Java虛擬機規範中也容許固定長度的虛擬機棧),當擴展時沒法申請到足夠的內存時會拋出OutOfMemoryError異常。
三、本地方法方法棧:
本地方法棧(Native Method Stacks)與虛擬機棧所發揮的做用是很是類似的,其區別不過是虛擬機棧爲虛擬機執行Java方法(也就是字節碼)服務,而本地方法棧則是爲虛擬機使用到的Native方法服務。虛擬機規範中對本地方法棧中的方法使用的語言、使用方式與數據結構並無強制規定,所以具體的虛擬機能夠自由實現它。甚至有的虛擬機(譬如Sun HotSpot虛擬機)直接就把本地方法棧和虛擬機棧合二爲一。與虛擬機棧同樣,本地方法棧區域也會拋StackOverflowError和OutOfMemoryError異常。
線程共享:
一、Java堆:
Java堆是被全部線程共享的一塊內存區域,在虛擬機啓動時建立
Java堆是垃圾收集器管理的主要區域,所以不少時候也被稱作「GC堆」。
Java堆能夠處於物理上不連續的內存空間中,只要邏輯上是連續的便可,就像咱們的磁盤空間同樣。在實現時,既能夠實現成固定大小的,也能夠是可擴展的,不過當前主流的虛擬機都是按照可擴展來實現的(經過-Xmx和-Xms控制)。
<jvm-arg>-Xms2048m</jvm-arg> <jvm-arg>-Xmx2048m</jvm-arg> <jvm-arg>-Xmn512m</jvm-arg> <jvm-arg>-XX:SurvivorRatio=8</jvm-arg> <jvm-arg>-XX:MaxTenuringThreshold=15</jvm-arg>
能夠看到,-Xms==-Xmx==2048m,年輕代大小-Xmn==512m,這樣,年老代大小就是2048-512==1536m,這個比率值得記住,在企業開發中,年輕代:年老代==1:3,而此時,咱們配置的-XX:MaxTenuringThreshold=15(這也是默認值),年輕代對象通過15次的複製後進入到年老代(關於這一點,在以後的GC機制中會說),
二、方法區:
方法區(Method Area)與Java堆同樣,是各個線程共享的內存區域,它用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。雖然Java虛擬機規範把方法區描述爲堆的一個邏輯部分,可是它卻有一個別名叫作Non-Heap(非堆),目的應該是與Java堆區分開來。
運行時常量池是方法區一個很是重要的區域,簡稱 RCP。首先咱們要知道在字節碼文件中,除了有類的字段、方法等信息描述外,還有常量池信息。常量池用來保存常量(字符串常量和 final 常量)與符號引用,這部份內容在被類加載後,會儲存到方法區中的 RCP 中,能夠說 RCP 是類中的常量池在運行時的表示形式。另外運行時產生的常量也能夠被放入常量池中,好比 String 的 intern() 方法,當常量池擴展時沒法申請到內存時會拋出 OutOfMemoryError 異常。
<jvm-arg>-XX:PermSize=256M</jvm-arg> <jvm-arg>-XX:MaxPermSize=256M</jvm-arg>
注意:常量池在jdk1.6在方法區;在jdk1.7在堆
附:元數據區
備註: 部份內容轉自 https://blog.csdn.net/luanlouis/article/details/40043991 http://www.cnblogs.com/java-zhao/p/5179836.html