java內存區域初窺

編程語言 Java Java虛擬機 技術 科技優家 2017-04-11

運行時數據區域

程序計數器

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

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

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

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

  • 唯一一個不會出現OutOfMemoryError情況的區域。

java虛擬機棧

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

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

  • 如果線程請求的棧深度大於虛擬機所允許的深度,將拋出StackOverflowError異常

  • 如果虛擬機棧可以動態擴展,如果擴展時無法申請到足夠的內存,則將拋出OutOfMemoryError異常

本地方法棧

與java虛擬機棧所發揮的作用非常相似,本地方法棧 (Native Method Stack) 是為虛擬機所使用的native方法服務。

java堆

一般來說,java堆 (Java Heap) 是java虛擬機所管理的內存最大的一塊,此區域的唯一目的就是存放對象實例,幾乎所有的對象實例都在這裡分配內存。

  • 所有線程共享的內存區域

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

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

方法區

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

  • 線程共享

運行時常量

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

相關推薦

推薦中...