您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Java虛擬機JVM運行時的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Java虛擬機JVM運行時的示例分析”這篇文章吧。
JVM(Java虛擬機)是一個抽象的計算模型。就如同一臺真實的機器,它有自己的指令集和執行引擎,可以在運行時操控內存區域。目的是為構建在其上運行的應用程序提供一個運行環境。JVM可以解讀指令代碼并與底層進行交互:包括操作系統平臺和執行指令并管理資源的硬件體系結構。
我們知道的JVM內存區域有:堆和棧,這是一種泛的分法,也是按運行時區域的一種分法,堆是所有線程共享的一塊區域,而棧是線程隔離的,每個線程互不共享。
線程不共享區域
每個線程的數據區域包括程序計數器、虛擬機棧和本地方法棧,它們都是在新線程創建時才創建的。
程序計數器(Program Counter Rerister)
程序計數器區域一塊內存較小的區域,它用于存儲線程的每個執行指令,每個線程都有自己的程序計數器,此區域不會有內存溢出的情況。
虛擬機棧(VM Stack)
虛擬機棧描述的是Java方法執行的內存模型,每個方法被執行的時候都會同時創建一個棧幀(Stack Frame)用于存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。每一個方法被調用直至執行完成的過程就對應著一個棧幀在虛擬機棧中從入棧到出棧的過程。
本地方法棧(Native Method Stack)
本地方法棧用于支持本地方法(native標識的方法,即非Java語言實現的方法)。
虛擬機棧和本地方法棧,當線程請求分配的棧容量超過JVM允許的最大容量時拋出StackOverflowError異常。
線程不共享區域如下圖綠色背景所示。
線程共享區域
線程共享區域包含:堆和方法區。
堆(Heap)
堆是最常處理的區域,它存儲在JVM啟動時創建的數組和對象,JVM垃圾收集也主要是在堆上面工作。
如果實際所需的堆超過了自動內存管理系統能提供的最大容量時拋出OutOfMemoryError異常。
方法區(Method Area)
方法區是可供各條線程共享的運行時內存區域。存儲了每一個類的結構信息,例如運行時常量池(Runtime Constant Pool)、字段和方法數據、構造函數和普通方法的字節碼內容、還包括一些在類、實例、接口初始化時用到的特殊方法。
當創建類和接口時,如果構造運行時常量池所需的內存空間超過了方法區所能提供的最大內存空間后就會拋出OutOfMemoryError
運行時常量池(Runtime Constant Pool)
運行時常量池是方法區的一部分,每一個運行時常量池都分配在JVM的方法區中,在類和接口被加載到JVM后,對應的運行時常量池就被創建。運行時常量池是每一個類或接口的常量池(Constant_Pool)的運行時表現形式,它包括了若干種常量:編譯器可知的數值字面量到必須運行期解析后才能獲得的方法或字段的引用。
如果方法區的內存空間不能滿足內存分配請求,那Java虛擬機將拋出一個OutOfMemoryError異常。
棧包含Frames,當調用方法時,Frame被推送到堆棧。一個Frame包含局部變量數組、操作數棧、常量池引用。
以上是“Java虛擬機JVM運行時的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。