簡體   English   中英

Java 8 中的 MetaSpace 有什么用?

[英]What is the use of MetaSpace in Java 8?

我知道他們已經用 Java 8 中的 MetaSpace 替換了 PermGen。但我有幾個問題:

  1. MetaSpace默認是GC收集的嗎?
  2. 甚至 PermGen 也是通過添加-XX:+CMSClassUnloadingEnabled之類的 args 來收集的,那么是什么讓 MetaSpace 比 PermGen 更好?
  3. MetaSpace 是基於本地內存的,所以它把 java 對象保存在磁盤上而不是 VM 上?
  4. 甚至 MetaSpace 也會內存不足? 如果再次這樣,我會得到OutOfMemoryException
  5. 默認情況下,MetaSpace 可以隨着內存的增加而增長?

MetaSpace默認是GC收集的嗎?

是的,GC 將在元空間滿時運行,它還會動態增加(允許)為元數據分配的內存。

甚至 PermGen 也是通過添加 -XX:+CMSClassUnloadingEnabled 之類的 args 來收集的,那么 MetaSpace 有什么比 PermGen 更好的呢?

改進在於元空間的動態擴展,這是 permgen 無法做到的。

MetaSpace 是基於本地內存的,所以它把 java 對象保存在磁盤上而不是 VM 上?

根據元空間的描述,它只使用本機內存(無分頁)。

根據 Pierre-Hugues Charbonneau 的研究(鏈接在這里),很明顯,元空間的引入並不一定能解決 OOM 問題,它充其量只是解決問題的方法,它試圖動態調整元空間內存的大小以適應越來越多的類在加載時可能會產生不可控制的增長(只要本機內存允許)。

我們可以通過將MaxMetaspaceSize參數設置為 JVM 並運行提供的示例程序來實現著名的 OOM 錯誤。

非常感謝 Pierre-Hugues Charbonneau。

作為回應:

  1. 默認情況下,如果 Metaspace 內存達到 MaxMetaspaceSize,則會收集它。 此參數最初是無限的。 限制是您機器中的內存。 但是當不再需要類和類加載器時,內存會自動釋放。 如果您懷疑 ClassLoader 有內存泄漏,您只需要調整此參數。

  2. MetaSpece 使用本機內存,內存中的指針組織使得 GC 比舊的 PermGen 內存更快。

  3. 不,這意味着 JVM 像普通 C 程序一樣使用內存,並且不為 java 對象使用虛擬內存空間。 那似乎內存僅受機器限制。 請注意,如果需要,可以將機器的內存交換到磁盤。

  4. 如果你設置參數 MaxMetaspaceSize 你可以得到 OutOfMemory ,如果你不設置這個參數你可以得到進程是否分配了所有的機器內存(包括交換空間)。

  1. MetaSpace默認是GC收集的嗎?

    一旦類元數據使用達到“MaxMetaspaceSize”默認為"unlimited" ,就會觸發死類和類加載器的垃圾收集,因此需要適當的監控來限制此類 GC 的延遲或頻率。

  2. 甚至 PermGen 也是通過添加 -XX:+CMSClassUnloadingEnabled 之類的 args 來收集的,那么 MetaSpace 有什么比 PermGen 更好的呢?

    主要目標是刪除 permgen,以便用戶不必考慮正確調整它的大小。

  3. MetaSpace 是基於本地內存的,所以它把 java 對象保存在磁盤上而不是 VM 上?

    磁盤不是本機內存,而是存儲設備。 本機內存,在這種情況下是區域,是從 Java 堆中剩余的進程的內存

  4. 甚至 MetaSpace 也會內存不足?

    是的,它受機器內存量的限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM