JVM-运行时数据区
?JVM在運行Java代碼時,會把內存分為幾個模塊即數據區來使用,數據區的內容如下圖所示:
1. PC寄存器:
JVM支持程序多線程執行。而操作系統的任務調度采用的是時間片輪詢的搶占式調度方式,也就是說,某一個確定的時刻,一個處理器只能處理一條線程中的指令。因此,線程切換后如何恢復到原來正確的位置,便是通過每個線程各自的寄存器來實現的。在各線程中寄存器獨立,互不干擾。
如果線程執行的方法不是native的,那PC寄存器保存的就是Java虛擬機正在執行的字節碼指令的地址,如果該方法是native的,那寄存器的值就是undefined(null),此內存區域是唯一一個在JAVA虛擬機規范中沒有規定任何OutOfMemoryError情況的區域。
2. JAVA虛擬機棧:
java虛擬機棧也是Java線程私有的,它的生命周期與線程一樣,用于存儲棧幀,主要包括兩部分,方法中的局部變量和方法執行過程中產生的中間結果。每一個方法從調用直到執行完成的過程,就對應著一個棧幀在虛擬機棧中從入棧到出棧的過程。
因為除了棧幀的出棧和入棧之外,Java 虛擬機棧不會再受其他因素的影響,所以棧幀可以在堆中分配,Java 虛擬機棧所使用的內存不需要保證是連續的。
JVM規范允許VM Stack要么是一個固定大小,要么動態擴展來滿足要求。如果JVM棧是一個固定的大小,當棧被創建的時候每一個棧大小可以自由設置。而在動態擴展情況下,可以控制最大或最小內存;
Java虛擬機??赡軙l生如下異常情況:
- 如果線程請求分配的棧容量超過 Java 虛擬機棧允許的最大容量時,Java 虛擬機將會拋出一個 StackOverflowError 異常;
- 如果 Java 虛擬機??梢詣討B擴展,但擴展時無法申請到足夠的內存,或者在創建新的線程時沒有足夠的內存去創建對應的虛擬機棧,那 Java 虛擬機將會拋出一個 OutOfMemoryError 異常;
3. Java堆
對于大多數應用來說,堆是Java虛擬機所管理的內存中最大的一塊。堆是可供所有線程共享的一塊內存區域,是在虛擬機啟動的時候創建的。它唯一的目的就是存儲對象實例,幾乎所有的對象實例都在這里分配內存。
Java堆是垃圾回收器管理的主要區域,很多時候也被翻譯為GC堆。而從內存分配的角度來看,由于現在收集器基本都采用分代收集算法,所以Java堆還可以細分為:新生代,老年代,永久代等等。
Java堆的容量可以是固定大小的,也可以根據需求動態擴展,并且Java堆可以處于物理上不連續的內存空間中。只要邏輯上是連續的即可,就像我們的磁盤空間一樣。
堆中可能會發生的異常:
- 如果實際所需的堆大小超過了系統設置的最大堆容量,那JVM會拋出OutOfMemoryError異常;
4. 方法區
方法區與堆一樣,是各個線程共享的內存區域,存儲了每一個類的結構信息,如運行時常量池,靜態變量,常量,構造方法和普通方法的字節碼內容等等;方法區也是在虛擬機啟動的時候被創建。
JVM規范堆方法區的限制非常寬松,它可以作為堆的一個邏輯組成部分,擁有和堆大部分相同的性質,如可以選擇固定大小和可擴展,也可以選擇不實現垃圾回收。
同樣,當方法區無法滿足內存分配需求時,會拋出OutOfMemoryError異常;
5. 運行時常量池
首先,運行時常量池位于方法區內,屬于方法區的一部分。存放的是編譯期生成的各種字面量和符號引用。在類和接口被加載到虛擬機后,對應的運行時常量池就被創建出來。。
在創建類和接口的運行時常量池時,可能會發生如下異常情況:
- 當創建類或接口的時候,如果構造運行時常量池所需要的內存空間超過了方法區所能提供的最大值,那 Java 虛擬機將會拋出一個 OutOfMemoryError 異常。
6. 本地方法棧
本地方法棧與虛擬機棧所發揮的作用是非常相似的,它們的區別不過是虛擬機棧為虛擬機執行Java方法服務,而本地方法棧則為虛擬機使用到的Native方法服務。所以說,當虛擬機使用到其他語言的時候,就會使用到本地方法棧。
而如果Java虛擬機不支持native方法,并且自己也不依賴傳統棧的話,可以無需支持本地方法棧。如果支持本地方法棧,那這個棧一般會在線程創建的時候按線程分配。
本地方法棧和虛擬機棧性質類似,可以固定大小,也可以動態擴展,異常拋出也一樣。
?
The?Java? Virtual Machine Specification地址(其中包含了JDK6,JDK7,JDK8,JDK9各個版本):
https://docs.oracle.com/javase/specs/index.html
?
參考自:《深入理解JAVA虛擬機》
轉載于:https://www.cnblogs.com/xiaozhang2014/p/7966449.html
總結
以上是生活随笔為你收集整理的JVM-运行时数据区的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 去培训机构参加IT培训值不值
- 下一篇: 自学ng2 -生命周期钩子