標籤:運行時資料區 常量 類資訊 沒有 地方 gis 永久代 異常 記憶體管理機制
java程式員把記憶體管理的工作交給虛擬機器,一旦出現記憶體泄露或者溢出問題,如果不瞭解記憶體是怎樣工作的,那麼排查錯誤將是一件異常艱難的工作。
java記憶體地區與記憶體溢出異常
java運行時資料區域劃分:
線程隔離的
1.程式計數器(Program Counter Register)
當前線程執行代碼的行號指標,當線程切換並分配處理器執行時間,為了保證線程恢複到正確的執行位置,每個線程都有獨立的計數器
2.虛擬機器棧(VM Stack)
虛擬機器棧描述的是java方法執行的記憶體模型:每個方式執行的同時會建立一個棧幀(Stack Frame),用於儲存局部變數表、運算元棧、動態連結、方法出口等資訊。
局部變數表存放了編譯期可知的基礎資料型別 (Elementary Data Type),Reference類型,returnAddress類型。
其中long和double佔用兩個slot,其他佔用一個,局部變數表所需記憶體在編譯完全確定下來, 方法運行期間不會該表局部變數表大小。
這個地區規範了兩種異常狀況:
虛擬機器棧數超過虛擬機器允許數量,拋StackOverflowError
虛擬機器記憶體擴充無法申請足夠的記憶體空間,拋OutOfMemoryError
3.本地方法棧(Native Method Stack)
本地方法棧與虛擬機器棧作用類似,虛擬機器棧為虛擬機器執行java程式服務,本地方法棧為虛擬機器執行本地方法服務。
本地方法棧也會拋出StackOverflowError,OutOfMemoryError異常。
線程共用的
4.堆(Heap)
java 堆是所有線程共用的一塊記憶體地區,在Java虛擬機器規範中的描述是:The heap is the runtime data area from which memory for all class instances and arrays is allocated。
但是隨著jit編譯器發展和逃逸分析技術的成熟,棧內分配,標量替換使得對象不一定放在堆中存放
java堆是記憶體回收的主要管理地區,所以也成為GC堆,分代收集演算法把記憶體分為一下幾個地區:
新生代
Eden 、From Survivor、To Survivor
老年代
如果堆中沒有記憶體完成分配,並且堆也無法擴充時,拋OutOfMemoryError
5.方法區(Method Area)
Method Area是所有線程共用的地區,儲存類資訊,常量資訊,靜態變數資訊,編譯後代碼等。
SpotHot虛擬機器把GC分代收集擴充至方法區,方便像管理堆一樣來管理方法區,所以有些人更願意成它為“永久代”(Permanent Generation)
java自動記憶體管理機制