JAVA虛擬機器執行時記憶體劃分--執行時資料區域
阿新 • • 發佈:2018-12-03
Java虛擬機器在執行java程式時會把記憶體劃分為以下幾個不同的資料區域:
java虛擬機器記憶體劃分(執行時)
1、執行緒私有的:
程式計數器(Program Counter Register):可以看作當前執行緒所執行的位元組碼的行號指示器。java多執行緒中一個時刻,一個處理器都只會執行一條執行緒中的指令,線上程輪流切換的過程中,每個執行緒都有自己的程式計數器,互不影響,以便執行緒切換恢復到正確的執行位置。唯一不會發生OutOfMemoryError的區域。如果執行的是java方法,計數器值為虛擬機器位元組碼指令地址;如果執行native方法,值為空。
java虛擬機器棧(VM Stack):
本地方法棧:
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 限制方法區大小。