從四則運算認識JVM內存模型

首先,在main()方法裏面定義了y、x、d等變量,而在math()方法裏面對傳入變量作對應的四則運算(這裏採用"+"、"x"),計算值並return返回main()方法。

於是,採用<ASM工具,ProxyGenerator>對其生成相應的字節碼分析可得:

 

由圖可知,在方法裏面定義的局部變量都有其對應的歸屬地<局部變量表>,先進後出。程序計數器可以看作是當前線程所執行的字節碼的行號指示器<分支、循環、跳轉、異常處理、線程恢復等基礎功能都依賴計數器finished>,若線程正在執行的是一個Java方法,則記錄的是正在執行的虛擬機字節碼指令的地址,若爲Native方法,則計數器值爲null(Undefined),此內存區域是唯一一個在Java虛擬機規範中沒有規定任何oom情況的區域。與程序計數器一樣,Java虛擬機棧也是線程私有的,它的生命週期與線程相同,描述的是Java方法執行的內存模型,每個方法在執行時會創建一個棧幀,用於存儲局部變量表、操作數棧、動態鏈接、方法出口等,在調用math()方法並return<出口>的地方,也有其相應的歸屬等等。

Java虛擬機規範對Java虛擬機棧規定了倆種異常情況:若線程請求的棧深度大於虛擬機所允許的深度,將拋出StackOverflowError異常;若可動態擴展,而無法可申請到足夠的內存,將拋出OutOfMemoryError異常。<本地方法棧也同樣會拋出>。

當在沒有被引用的時候,通過GC機制回收,如有則從Eden到From到To過渡最終到老年代,這時候就會full gc出現oom<提示內存已耗盡>。

SoS:堆的內存管理尤爲關鍵,那就讓我們再一起去認識GC<do>·👉yxd179喲👉

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