1、JVM運行時數據區域

JVM運行時數據區java

其中 方法區java堆多線程共用區域數組

其他爲現成私有區域數據結構

程序計數器:多線程

  1. 當前線程執行的字節碼的行號的存放空間,字節碼解釋器經過改變這個值來獲取下一條執行字節碼,各條線程都獨立,互不影響;
  2. 若是正在執行的是Java方法,則在計數器中記錄的是虛擬機字節碼指令的地址;
  3. 如果Native方法,則記錄的值爲Undefined;
  4. 此區域沒有規定OutOfMemoryError

Java虛擬機棧:spa

  1. 用於存放局部變量
  2. 虛擬機棧用於存儲編譯期可知的基本類型(int、long等)、對象的引用(實例在java堆中地址)和一條字節碼指令的地址
  3. 棧幀:每一個方法執行時會把方法的局部變量、操做數棧、方法出口等信息存到一個棧幀中,即一個方法的執行就是一個棧幀從入棧到出棧的過程
  4. 每一個方法在編譯期會把方法中局部變量所佔用的空間進行分配,即在方法執行能夠獲得的局部變量空間是徹底肯定的

本地方法棧: 線程

  1. 用於存放本地方法(即用native關鍵字修飾的方法)
  2. 虛擬機對於方法的語言、使用方式和數據結構都沒有特殊的規定,可有虛擬機本身實現

Java堆: 對象

  1. JVM內存管理中最大的一塊
  2. 用於存放對象實例和數組
  3. 垃圾回收的主要區域

方法區(有些地方叫 -- 非堆):內存

  1. 用於存放已經被虛擬機加載的類信息、常量、靜態變量等數據
  2. 常量池:類信息中的一部分,用於存放字面量(final修飾的常量)和符號引用(方法簽名等)
  3. 運行時常量池:方法區的一部分,在虛擬機加載Class後將常量池中數據放入運行時常量池中
  4. 運行時常量池支持動態常量,即在程序運行時將新的常量放入運行時常量池中

其中除了程序計數器,其餘區域都可以經過虛擬機參數設置爲動態擴展空間或者指定大小的空間,若空間不足均會報出 OutOfMemoryError 異常虛擬機

若是棧的請求深度超過虛擬機容許的深度,則會報出StackOverflowError異常內存管理

相關文章
相關標籤/搜索