JVM學習一(運行時數據區(qū)域)

Java內存區(qū)域與內存溢出異常

(一)運行時數據區(qū)域

可參考
https://www.zhihu.com/question/20097631
https://blog.csdn.net/TJtulong/article/details/89598598
https://www.cnblogs.com/chanshuyi/p/jvm_serial_00_why_learn_jvm.html

運行時數據區(qū).png

1、程序計數器(Program Counter Register)

(1)程序計數器是一塊較小的內存空間,它可以看作是當前線程所執(zhí)行的字節(jié)碼的行號指示器;
(2)程序計數器處于線程獨占區(qū);
(3)如果線程執(zhí)行的是java方法,這個計數器記錄的是正在執(zhí)行的虛擬機字節(jié)碼指令的地址。而如果是native方法,這個計數器的值則為空(Undefined);
(4)此內存區(qū)域是唯一一個在java虛擬機規(guī)范中沒有規(guī)定任何OutOfMemoryError情況的區(qū)域;

2、Java虛擬機棧(Java Virtual Machine Stack)

虛擬機棧描述的是java方法執(zhí)行的動態(tài)內存模型。

棧幀(方法運行時的基本數據結構)

每個方法執(zhí)行,都會創(chuàng)建一個棧幀,伴隨著方法從創(chuàng)建到執(zhí)行完成。用于存儲局部變量表,操作數棧,動態(tài)鏈接,方法出口等;

局部變量表

1)存放編譯器可知的各種基本數據類型,引用類型,returnAddress類型。
2)局部變量表的內存空間在編譯器完成分配,當進入一個方法時,這個方法需要在幀分配多少內存是固定的,在方法運行期間是不會改變局部變量表的大小。
3)大?。?br> StackOverflowError:線程請求的棧深度大于虛擬機所允許的深度;
OutOfMemoryError:如果蓄奴籍??梢詣討B(tài)擴展(大部分都可以),而擴展時無法申請到足夠的內存;

3、本地方法棧(Native Method Stack)

本地方法棧于虛擬方法棧所發(fā)揮的作用時非常相似的
區(qū)別:本地方法棧為虛擬機執(zhí)行native方法服務;
虛擬機棧為悉尼及執(zhí)行Java方法服務;

4、Java堆(Java Heap)

Java堆是Java虛擬機所管理的內存中最大的一塊,被所有線程共享,在虛擬機啟動時創(chuàng)建

(1)目的:存放對象實例 ;
(2)垃圾收集器管理的主要區(qū)域(GC堆,Garbage Collected Heap):新生代(Eden空間、From Survivor空間、To Survivor空間等)、老年代;另外,還可能劃分出多個線程私有的分配緩沖區(qū)(Thread Local Allocation Buffer,TLAB);
(3)OutOfMemoryError:堆中沒有內存完成實例分配,并且堆也無法再擴展時拋出;
(4)不需要連續(xù)的內存空間,邏輯連續(xù)就行。

5、方法區(qū)(Method Area)

(1)方法區(qū)是線程共享的內存區(qū)域,用于存儲已被虛擬機加載的類信息(類的版本、字段、方法、接口)、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數據;
(2)HotSpot虛擬機上吧方法區(qū)成為“永久代”(Permanent Generation),本質上兩者并不等價,只是能省去專門為方法區(qū)編寫內存管理代碼的工作;
(3)方法區(qū)的垃圾回收效率很低;
(4)OutOfMemoryError:和堆類似。

image.png

(上面說到,jdk1.8 中,已經不存在永久代(方法區(qū)),替代它的一塊空間叫做 “ 元空間 ”,和永久代類似,都是 JVM 規(guī)范對方法區(qū)的實現(xiàn),但是元空間并不在虛擬機中,而是使用本地內存,元空間的大小僅受本地內存限制,但可以通過 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize 來指定元空間的大小。)

6、運行時常量池(Runtime Constant Pool)

上面提到的類文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池,用于存放編譯期生成的各種字面量和符號引用,這部分內容會在類加載之后進入運行常量池。
(1)運行時常量池具有動態(tài)性,運行期間也可以講常量放入池中,比如String類的intern()方法;
https://blog.csdn.net/tyyking/article/details/82496901
(2)OutOfMemoryError

7、直接內存(Direct Memory)

直接內存并不是虛擬機運行時數據區(qū)的一部分,也不是javca虛擬機規(guī)范中定義的內存區(qū)域;而且也會出現(xiàn)OutOfMemoryError異常。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容