from: Understanding metaspace line in JVM heap printoutoracle
JDK8 裏, 打印堆內存信息的時候, 會出現相似以下日誌信息;
Metaspace used 2425K, capacity 4498K, committed 4864K, reserved 1056768Kjvm
那麼這些子項各表明什麼意思? 先看看來自oracle官方的解釋:
In the line beginning with Metaspace, the used value is the amount of space used for loaded classes. The capacity value is the space available for metadata in currently allocated chunks. The committed value is the amount of space available for chunks. The reserved value is the amount of space reserved (but not necessarily committed) for metadata.spa
在Metaspace這一行中, used表示加載類佔用內存空間的內存大小。capacity表明當前分配的內存塊(chunk)中供Metadata使用的內存大小。 committed表明全部內存塊(chunk)佔用內存之和。。。。reserved表明專門存儲metadata而預約的空間大小, 但沒必要必定是committed。日誌
Metaspace 由一個或多個虛擬空間組成。 虛擬空間是從OS分配的具備連續地址的空間。這些虛擬空間會按需分配。當被分配的時候, 虛擬空間會預約來自OS的內存,可是暫時不會提交它。Metaspace預約的內存就是全部虛擬空間的總大小。blog
在虛擬空間裏,分配單元叫作Metachunk(簡單點叫作: chunk)。但一個新的內存塊從虛擬空間分配的時候, 相應的內存會被提交。Metaspace中被提交的內存就是全部內存塊總和。內存
內存塊區別於佔用內存大小。當ClassLoader被GC的時候, 全部屬於該ClassLoader的chunk都會被清除。釋放內存塊會被維護在全局空閒內存列表中。Metaspace 容量是全部被分配內存塊的總和。ci
新的內存塊分配規則(步驟)get
1. 先在空閒內存列表中,尋找已存在而且合適的空閒內存塊
2. 若是沒有合適的空閒內存塊, 就從當前虛擬空間中分配一個新的內存塊。
3. 若是當前虛擬空間也消耗殆盡了, 預約(開闢)一個新的虛擬空間。it
class Metadata 會被分配在內存塊中。 內存塊可能不包含來自多個ClassLoader的數據(class metadata), 可是一個ClassLoader可能須要多個內存塊(chunk)存儲class metadata。used Metaspace佔用內存大小等於多個內存塊(chunk)中的全部class metadata總和。io
stackoverflow的一張圖清晰明確的說明: