簡體   English   中英

GC是否從Metaspace收集垃圾?

[英]Does GC collects garbage from Metaspace?

總是我認為垃圾收集器只清除堆,現在我想是的。

在java 8中,permGen被刪除,它被Metaspace取代。

正如我所知,Metaspace是垃圾收集( https://stackoverflow.com/a/24075360/2674303

誰從Metaspace收集垃圾?

我認為你的困惑源於口語術語“垃圾收集”,它被廣泛使用,但並沒有真正描述在托管環境中發生的事情。

內存管理是一個復雜的過程,簡化為:

  • 識別垃圾對象,這實際上是確定哪些對象可以訪問的過程 (讀取:不是垃圾),並將未遇到的所有內容都視為垃圾
  • 如有必要,將對象引用排入引用隊列和/或觸發終結
  • 回收以前由垃圾占用的內存,也可能是另一種方式:有時將活動對象移動到不同的內存空間

因此,對於不包含Java對象的內存空間,前兩點通常沒有多大意義,這就是您的問題似乎是什么。 解決前兩點的算法通常僅處理Java堆(定義為包含普通Java對象實例和類似結構化數據的空間)。

您已鏈接的聲明稱“Metaspace is GCed”似乎主要針對第三點。 事實上,如果不再需要,Metaspace中的內存可能會被回收。 這並不意味着它需要遍歷Metaspace中的實時引用或類似的東西。 顯然,當關聯的ClassClassLoader變得無法訪問時,類元數據已經過時,它們都是生活在Java堆上的普通(好的,幾乎)對象。

因此,當Metaspace大小達到限制時,將觸發垃圾收集,但是對於上面的前兩個子彈,它將不會處理Metaspace,因為它不是Metaspace,它可以告訴您Class是否已經未使用。 它將是一個普通的垃圾收集,但它將是一個“Full GC”或當前使用的GC算法對於模式的任何術語,包括在包含類和類加載器的內存段(也稱為“生成”)內收集垃圾。

收集ClassClassLoader堆實例后,還可以在清理期間回收其關聯的Metaspace數據。

暫無
暫無

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

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