Java虛擬機(JVM)運行時數據區

JVM規範定義了在執行程式期間所需的某些運行時數據區域。其中一些是在JVM啟動時創建的。其他是線程局部的,只有在創建線程時才會創建(並線上程被銷毀時銷毀)。它們分別如下 -

PC(程式計數器)寄存器

它是每個線程局部,包含線程當前正在執行的JVM指令的地址。

它是每個線程局部,並在方法調用期間存儲參數,局部變數和返回地址。如果線程需要的堆疊空間超過允許的堆疊空間,則可能發生StackOverflow錯誤。如果堆疊是動態可擴展的,它仍然可以拋出OutOfMemoryError。

它在所有線程之間共用,並包含在運行時創建的對象,類的元數據,數組等。它是在JVM啟動時創建的,並在JVM關閉時銷毀。可以使用某些標誌來控制JVM從操作系統中請求的堆量(稍後將詳細介紹)。必須注意不要求太少或太多的記憶體,因為它對性能有顯著的影響。此外,GC管理此空間並不斷移除死對象以釋放空間。

方法區

此運行時區域對所有線程都是通用的,並在JVM啟動時創建。它存儲每類結構,例如常量池(稍後會詳細介紹),構造函數和方法的代碼,方法數據等。JLS沒有指定是否需要對該區域進行垃圾回收,因此,實現了 JVM可能會選擇忽略GC。此外,根據應用的需要,這可能會或可能不會擴展。JLS對此沒有任何要求。

運行時常量池

JVM維護每類/每類型的數據結構,此數據結構在鏈接加載的類時充當符號表(其眾多角色之一)。

本機方法棧

當線程調用本機方法時,它進入一個新的世界,其中Java虛擬機的結構和安全限制不再妨礙其自由。本機方法可能會訪問虛擬機的運行時數據區域(它取決於本機方法介面),但也可以執行其他任何需要的操作。

垃圾收集

JVM管理Java中對象的整個生命週期。創建對象後,開發人員不再需要擔心它。如果對象變為死亡(也就是說,它不再引用它),它將使用眾多演算法之一從GC中彈出 - 串行GC,CMS,G1等。

在GC過程中,對象在內存中移動。因此,在進行過程中,這些對象不可用。整個應用程式必須在整個過程中停止。這種停頓稱為“停止世界”的停頓,並且是一個巨大的開銷。GC演算法主要旨在減少此時間。在以下章節中詳細討論這個問題。

由於GC,Java中的記憶體洩漏非常罕見,但它們可能會發生。在後面的章節中看到如何在Java中創建記憶體洩漏。


以下是糾正/補充內容:

第一個堆,應該是棧或堆疊?為什麼要五十個字?為什麼要五十個字?為什麼要五十個字?為什麼要五十個字?為什麼要五十個字?為什麼要五十個字?為什麼要五十個字?為什麼要五十個字?為什麼要五十個字?為什麼要五十個字?為什麼要五十個字?  提交時間:2019-09-01
上一篇: Java虛擬機(JVM)類加載器 下一篇: Java虛擬機(JVM)JIT編譯器