Java 內存區域與內存溢出

Java 內存區域能夠分爲兩大類:java

1、線程共享的:
方法區:線程共享;用於存儲已被虛擬機加載的類信息,常量,靜態變量,即時編譯器編譯的代碼等數據。它被虛擬機規範描述爲堆的一部分。也被視爲「永久代」。

運行時常量:方法區的一部分;

堆(heap):因此線程共用;幾乎全部的對象實例、數組都是在堆上分配內存(JIT技術能夠不在堆上分配內存、好比棧);能夠物理不連續;可能存在給各線程分配的,線程私有的線程緩衝區(Thread Local
Allocation Buffer, TLAB);堆通車也被分爲初生代,年老代;

執行引擎:

本地接口庫:

直接內存:非虛擬機運行時數據區的一部分,也不是java虛擬機規範中定義的內存區域,也可能致使內存異常;裏面的內存爲堆外內存。

 

2、線程獨享的:
虛擬機棧:生命週期和線程相同;其中的局部變量表保存基礎類型數據或者對象的引用;若是線程請求的棧深度超過了虛擬機運行的深度,就會拋出StackOverMemoryError;

本地方法棧:和虛擬機棧相似,甚至有些虛擬機上面並無區分這二者。

程序計算器:當前線程執行字節碼的行號指示器,被字節碼解釋器用於選擇下一條執行指令。佔用內存小,只用於java代碼。

 

對象內存佈局:數組

1、對象:由三部分組成,對象頭(Header)、實例數據(Instance data)、對齊填充(padding)二、對象頭部:a、一部分用於存儲自身運行時數據,包括哈希碼(25bit)、GC分代年齡(4bit)、鎖狀態標記(2bit)、線程持有的鎖、偏向線程ID、偏向時間戳;b、一部分爲類型指針,指向它的類元數據 
相關文章
相關標籤/搜索