程序員火花塞 2021-09-19 06:10:08 阅读数:462
反正我是帶著這些問題往下讀的
內存是非常重要的系統資源,是硬盤和 CPU 的中間倉庫及橋梁,承載著操作系統和應用程序的實時運行。JVM 內存布局規定了 Java 在運行過程中內存申請、分配、管理的策略,保證了 JVM 的高效穩定運行。不同的 JVM 對於內存的劃分方式和管理機制存在著部分差异。
下圖是 JVM 整體架構,中間部分就是 Java 虛擬機定義的各種運行時數據區域。
jvm-framework
Java 虛擬機定義了若幹種程序運行期間會使用到的運行時數據區,其中有一些會隨著虛擬機啟動而創建,隨著虛擬機退出而銷毀。另外一些則是與線程一一對應的,這些與線程一一對應的數據區域會隨著線程開始和結束而創建和銷毀。
下面我們就來一一解毒下這些內存區域,先從最簡單的入手
程序計數寄存器(Program Counter Register),Register 的命名源於 CPU 的寄存器,寄存器存儲指令相關的線程信息,CPU 只有把數據裝載到寄存器才能够運行。
這裏,並非是廣義上所指的物理寄存器,叫程序計數器(或PC計數器或指令計數器)會更加貼切,並且也不容易引起一些不必要的誤會。JVM 中的 PC 寄存器是對物理 PC 寄存器的一種抽象模擬。
程序計數器是一塊較小的內存空間,可以看作是當前線程所執行的字節碼的行號指示器。
PC 寄存器用來存儲指向下一條指令的地址,即將要執行的指令代碼。由執行引擎讀取下一條指令。
jvm-pc-counter
(分析:進入class文件所在目錄,執行javap -v xx.class反解析(或者通過IDEA插件Jclasslib直接查看,上圖),可以看到當前類對應的Code區(匯編指令)、本地變量錶、异常錶和代碼行偏移量映射錶、常量池等信息。)
:使用PC寄存器存儲字節碼指令地址有什麼用呢?為什麼使用PC寄存器記錄當前線程的執行地址呢?
*?:因為CPU需要不停的切換各個線程,這時候切換回來以後,就得知道接著從哪開始繼續執行。JVM的字節碼解釋器就需要通過改變PC寄存器的值來明確下一條應該執行什麼樣的字節碼指令。
:PC寄存器為什麼會被設定為線程私有的?
*?:多線程在一個特定的時間段內只會執行其中某一個線程方法,CPU會不停的做任務切換,這樣必然會導致經常中斷或恢複。為了能够准確的記錄各個線程正在執行的當前字節碼指令地址,所以為每個線程都分配了一個PC寄存器,每個線程都獨立計算,不會互相影響。
Java 虛擬機棧(Java Virtual Machine Stacks),早期也叫 Java 棧。每個線程在創建的時候都會創建一個虛擬機棧,其內部保存一個個的棧幀(Stack Frame),對應著一次次 Java 方法調用,是線程私有的,生命周期和線程一致。
作用:主管 Java 程序的運行,它保存方法的局部變量、部分結果,並參與方法的調用和返回。
特點:
棧中可能出現的异常:
Java 虛擬機規範允許?Java虛擬機棧的大小是動態的或者是固定不變的
可以通過參數-Xss來設置線程的最大棧空間,棧的大小直接决定了函數調用的最大可達深度。
棧中存儲什麼?
光給面試題不給答案不是我的風格。這裏面的面試題也只是鳳毛麟角,還有答案的話會極大的增加文章的篇幅,减少文章的可讀性
CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視頻】
版权声明:本文为[程序員火花塞]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210919061007683G.html