java內存區域初窺

運行時數據區域

jvm.png

程序計數器

程序計數器 (Program Counter Register) 是一塊較小的內存空間,能夠看作是當前線程所執行的字節碼的行號指示器。在虛擬機的概念模型(各類虛擬機可能會經過更高效的字節碼去實現)裏,字節碼解釋器工做時就是經過改變這個計算器的值來選取 下一條須要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能都須要依賴這個計數器來完成。java

  • 每條線程都須要有一個獨立的程序計數器,各條線程之間計數器互不影響,獨立存儲。線程私有。jvm

  • 線程執行的是一個java方法,計數器記錄的是正在執行的虛擬機字節碼制定地址。spa

  • 線程執行的是一個native方法,這個計數器值則爲空(undefined)。線程

  • 惟一一個不會出現OutOfMemoryError狀況的區域。對象

java虛擬機棧

java虛擬機棧 (Java Virtual Machine Stacks) 描述的是java方法執行的內存模型,每一個方法在執行的同時都會建立一個棧幀用於存儲局部變量表、操做數棧、動態鏈接、方法出口等。接口

  • 線程私有,生命週期與線程相同生命週期

  • 若是線程請求的棧深度大於虛擬機所容許的深度,將拋出StackOverflowError異常內存

  • 若是虛擬機棧能夠動態擴展,若是擴展時沒法申請到足夠的內存,則將拋出OutOfMemoryError異常rem

本地方法棧

與java虛擬機棧所發揮的做用很是類似,本地方法棧 (Native Method Stack) 是爲虛擬機所使用的native方法服務。編譯器

java堆

通常來講,java堆 (Java Heap) 是java虛擬機所管理的內存最大的一塊,此區域的惟一目的就是存放對象實例,幾乎全部的對象實例都在這裏分配內存。

  • 全部線程共享的內存區域

  • 垃圾收集器管理的主要區域(GC堆),還能夠細分爲新生代和老年代或者Eden空間、From Survivor空間和to Survivor空間

  • java堆能夠處於物理上不連續的內存空間中,只要邏輯上連續的便可(可經過-Xmx和-Xms控制大小)

方法區

方法區(Method Area)是用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。

  • 線程共享

運行時常量

運行時常量是方法區的一部分,Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池,用於存放編譯期生成的各類字面量和符號引用,這部份內容將在類加載後進入方法區的運行時常量池中存放。

相關文章
相關標籤/搜索