Java虛擬機內存區域劃分及分別存儲了哪些數據

一、運行時數據區域

在這裏插入圖片描述

二、線程隔離的數據區

1、程序計數器

線程私有,生命週期與線程相同。

**作用:**程序所執行的字節碼的 行號指示器

程序計數器(Program CounterRegister) 是一塊較小的內存空間,它可以看作是程序所執行的字節碼的 行號指示器。在虛擬機的概念模型裏,字節碼解釋器工作時就是通過改變這個計數器的值來 選取下一條 需要執行的字節碼指令。分支、循環、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器來完成。

如果線程正在執行的是一個 Java 方法,這個計數器記錄的是正在執行的虛擬機字節碼指令的地址;如果正在執行的是 Native 方法,這個計數器值則爲空(Undefined)。此內存區域是唯一一個在 Java 虛擬機規範中沒有規定任何 OutOfMemoryError 情況的區域。

2、虛擬機棧

線程私有,生命週期與線程相同。

作用: 描述Java方法執行的內存模型
每個方法在執行的同時都會創建一個棧幀(棧幀是方法運行時的基礎數據結構),用於存儲局部 變量表、操作數棧、動態鏈接、方法出口 等信息。每一個方法從調用直至執行完成的過程,就對應着一個棧幀在虛擬機棧中入棧到出棧的過程

局部變量表中存放了哪些數據?
局部變量表存放了編譯期可知的各種 基本數據類型、對象引用類型和returnAddress類型(指向了一條字節碼指令的地址)。

3、本地方法棧

線程私有,生命週期與線程相同。

作用: 與虛擬機棧作用相似,不過描述的是Native方法執行的內存模型

三、所有線程共享的數據區

1、 Java 堆

對於大多數應用來說,Java堆(Java Heap) 是Java虛擬機所管理的 內存中最大的一塊。Java堆是被所有線程共享的一塊內存區域,在虛擬機啓動時創建。此內存區域的唯一目的就是 存放對象實例,幾乎所有的對象實例都在這裏分配內存。這一點在Java虛擬機規範中描述的是:所有的對象實例以及數組都要在堆上分配,但是隨着JIT編譯器的發展與逃逸分析技術的逐漸成熟,棧上分配,標量替換優化技術將會導致一些微妙的變化發生,所有的對象都分配在堆上也逐漸變得不是那麼"絕對"了。

Java 堆是垃圾收集器管理的主要區域,因此很多時候也被稱做"GC堆"(Garbage Collected Heap),如果從內存回收的角度看,由於現在收集器基本都是採用的分代收集算法,所以Java堆中還可以細分爲: 新生代和老年代; 在細緻一點的有Eden空間,From Survivor空間,To Survivor空間等。

在這裏插入圖片描述

2、方法區

方法區(Method Area) 與Java堆一樣,是各個線程共享的內存區域。
它用於存儲已被虛擬機加載的 類信息、常量、靜態變量、即時編譯器編譯後的代碼 等數據。

運行時常量池

運行時常量池(Runtime Constant Pool) 是方法區的一部分。Class文件中除了有類的版本,字段,方法,接口等描述信息外,還有一項信息是常量池(Constant Pool Table),用於存放編譯期生成的各種字面量符號引用這部分內容將在類加載後存放到方法區的運行時常量池中。

類加載機制中的解析階段,虛擬機將常量池內的符號引用替換爲直接引用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章