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