您的位置:首頁>數碼>正文

Java記憶體區域總結

一、Java記憶體模型

Java運行時資料區一般分為:程式計數器區、方法區、Java棧、Java本地棧、Java堆組成。

1、程式計數器

程式計數器是執行緒私有的一塊較小的記憶體區域, 用於保存當前執行緒執行位元組碼的行號指示器, 執行緒的切換、異常都能正確的恢復到指定的要執行的位元組碼位置都是這個行號指示器的功能, 這個區域是一個唯一一個沒有拋出OutOfMemoryError的異常。

2、Java棧

Java棧也是執行緒私有的一塊記憶體區域, 它的生命週期與執行緒的生命週期相同。 一個方法被執行的同時會創建一個棧幀, 將其壓入棧中, 方法執行完成的同時就會把此棧幀彈出棧,

也就是一個方法從被執行到退出也就是一個棧幀入棧出棧的過程。 以前我們經常說的”Java堆”和“Java棧”, 很粗的一個說法 —堆也可能說的另外的一個記憶體區域-堆, 棧應該說的不是Java棧, 應該是Java棧中的區域變數表-用於保存基底資料型別資訊(如:int float long )和對象引用指標、返回類型指針。 虛擬機器設置參數: -Xxs200k (注意棧的記憶體大小最少為160k), 也可能出現OutOfMemoryError的異常, 當請求棧的深度大於JVM所允許的棧的最大深度的時候會拋出一個SatckOverflowError的異常。

3、方法區

方法區是所有執行緒共用的一片記憶體區域, 用於保存類資訊、方法名、靜態變數、常量等資訊。 我們也成為永久代。 常量池是方法區的一部分, 用於保存字面量和符號。

在JVM中設置參數為:-XX:PermSize100M -XX:MaxPermSize300M。 也可能出現OutOfMemoryError的異常

4、堆

堆這塊記憶體區域是最為重要的一片記憶體區域, 幾乎所有的物件實例都保存在此區域, 也是GC管理最重要的區域, 也成為GC堆。 堆也可以細劃分為:老年代和新生代。 JVM設置參數:

-Xms10M -Xmx100M 當申請的記憶體無法申請到足夠的記憶體的時候會出現OutOfMemoryError的異常資訊。

5、物件訪問

物件訪問也就是reference類型如 Object object = new Object;

Object object 這個反應到虛擬機器棧中的區域變數表中保存reference類型出現, new Object;這會出現在Java堆中將物件實例放在此記憶體區域, Object 類型的體現出這些資訊保存在方法區中。

reference類型資料訪問物件有兩種:

5.1、基於控制碼池

基於控制碼池的物件訪問方式是在Java堆中創建一個控制碼池, 控制碼池中保存堆中實例物件的記憶體位址,

而reference 類型的資料保存了堆中控制碼池中的一個位址。

5.2、直接記憶體位址

直接記憶體位址是reference類型的資料保存的就是Java堆中的所在的實例的位址。

6、直接記憶體

直接記憶體不是JVM中的運行時資料區的一部分, 這部分也會被頻繁的使用。 在JDK1.4中引入了NIO 基於通道和緩衝區的新的I/O, 可以使用本地函數直接在分配堆以外的記憶體, 在堆中保存一個DrectByteBuffer的直接記憶體的位址, 這樣操作可以避免了本地堆和Java堆來回複製資料的問題。 這要注意我們在配置Java堆參數的時候一定要考慮到直接記憶體所占記憶體的一部分。

Next Article
喜欢就按个赞吧!!!
点击关闭提示