1. 程式人生 > >JAVA虛擬機器執行時記憶體劃分--執行時資料區域

JAVA虛擬機器執行時記憶體劃分--執行時資料區域

Java虛擬機器在執行java程式時會把記憶體劃分為以下幾個不同的資料區域:

java虛擬機器記憶體劃分(執行時)
1、執行緒私有的:
  程式計數器(Program Counter Register):可以看作當前執行緒所執行的位元組碼的行號指示器。java多執行緒中一個時刻,一個處理器都只會執行一條執行緒中的指令,線上程輪流切換的過程中,每個執行緒都有自己的程式計數器,互不影響,以便執行緒切換恢復到正確的執行位置。唯一不會發生OutOfMemoryError的區域。如果執行的是java方法,計數器值為虛擬機器位元組碼指令地址;如果執行native方法,值為空。
  java虛擬機器棧(VM Stack):

生命週期同線程相同,描述的是Java方法執行的記憶體模型:每個方法在執行的同時都會建立一個棧幀,用於儲存區域性變量表、運算元棧、動態連結、方法出口等資訊。每一個方法從呼叫直至完成的過程,就對應著一個棧幀在虛擬機器中從入棧到出棧的過程。 區域性變量表存放編譯期可知的基本資料型別(boolean、int、byte、short、double、long、float、char),物件引用(指向物件起始地址的指標或者是代表物件的控制代碼),returnAdress(指向位元組碼指令地址).。區域性變量表所需的記憶體空間在編譯期間完成分配。此區域發生的異常:StackOverflowError(執行緒請求的棧深度大於虛擬機器允許的深度)、OutOfMemoryError(虛擬機器棧動態擴充套件時無法申請到足夠的記憶體)
  本地方法棧:
和 java虛擬機器棧一樣,區別是一個為執行Java方法服務、一個為為虛擬機器使用到的Native方法服務
2、執行緒共享:
  java堆(Heap):虛擬機器管理的記憶體最大的一塊。虛擬機器啟動時建立,作用存放物件例項。垃圾收集器管理的管理的主要區域,又稱為GC堆。OutOfMemoryError(如果在堆中沒有記憶體完成例項分配,並且堆無法擴充套件)
  方法區(Method Area):儲存已被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等資料。OutOfMemoryError(無法滿足記憶體分配時)
·
OOM異常:
  java堆溢位 (OOM :java heap space) :不斷地建立物件達到限制。-Xms堆的最小值,-Xmx堆的最大值。他們設定一樣可以避免堆自動擴充套件。
  解決:1.檢查堆引數和物理機記憶體比較是否可以調大;2.從程式碼上檢查物件是否有生命週期過長情況
  棧溢位:棧的容量-Xss引數設定
  執行時常量池溢位(oom:PermGen space):-XX:PermSize -XX:MaxPermSize 限制方法區大小。