深入理解Java虛擬機學習筆記:第二章,運行時數據區域

第二章 Java內存區域與內存溢出異常

運行時數據區域

一、Java運行時數據區

二、程序計數器

1.定義:程序計數器是一塊較小的內存空間,它可以看作是當前線程所執行的字節碼的行號指示器。字節碼解釋器就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器來完成。
2.它是線程獨有的
3.它是唯一一個在Java虛擬機規範中沒有規定任何OutOfMemoryError情況的區域。

三、Java虛擬機棧

1.定義:該塊區域指的是線程棧,在線程創建的時候分配的。在線程中,每個方法都會創建一個棧幀用於存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。每一個方法從調用到執行完成,對應的就是一個棧幀在線程棧中入棧到出棧的過程。
2.它是線程獨有的,生命週期與線程相同。
3.該塊區域的大小在啓動JVM的時候可以由 -Xss 參數來設置。
4.當進入一個方法時,這個方法在棧幀中分配多大的局部變量空間是在編譯期間就完全確定的,在運行期間不會改變局部變量表的大小。
5.在該區域中,如果線程請求的棧深度大於虛擬機所允許的深度,將拋出StackOverflowError異常;如果虛擬機棧可以動態擴展(大部分虛擬機都支持動態擴展,也允許固定長度),在擴展時無法申請足夠的內存,就會拋出OutOfMemoryError異常。

四、本地方法棧

1.定義:本地方法棧與虛擬機棧發揮的作用是相似的。在HotSpot虛擬機中不進行區分,將二者合二爲一。本地方法棧是爲虛擬機使用到的Native方法服務。而虛擬機棧是爲虛擬機執行的Java方法(也就是Java字節碼服務的)。

五、Java堆

1.定義:Java堆(Java Heap)是Java虛擬機所管理的內存中最大的一塊。Java堆是被所有線程共享的。所有的對象實例以及數組都會在堆上分配。
2.Java堆是垃圾收集器管理的主要區域。也可稱作“GC堆”(Garbage Collected Heap)。
3.現在收集器都基本採用分代收集算法,所以Java堆中還可以細分爲:新生代和老年代:在細緻一點分爲Eden區、Form Survivor空間、To Survivor空間等。
4.從內存分配的角度來看,線程共享的Java堆中可能劃分出多個線程私有的分配緩衝區(Thread Local Allocation Buffer,TLAB)。
5.可以通過虛擬機參數 -Xmx設置堆的最大值,-Xms設置堆的最小值。

六、方法區

1.方法區用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。
2.當方法區無法滿足內存分配需求時,將拋出OutOfMemoryError異常。
3.永久代並不等同於方法區,僅僅是因爲HotSpot選擇把GC分代收集擴展至方法區,或者說使用永久代來實現方法區而已。

七、運行時常量池

1.運行時常量池是方法區的一部分。
2.Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池,用於存放編譯期生成的各種字面量和符號引用,這部分內容將在類加載後進入方法區的運行常量池。
3.運行時常量池相對於Class文件常量池的另外一個重要特徵是具備動態性,Java語言並不要求常量一定是編譯期才能產生,運行期間也可以。
4.當常量池無法再申請到內存時會拋出OutOfMemoryError異常。

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