[英]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中的實時引用或類似的東西。 顯然,當關聯的Class
和ClassLoader
變得無法訪問時,類元數據已經過時,它們都是生活在Java堆上的普通(好的,幾乎)對象。
因此,當Metaspace大小達到限制時,將觸發垃圾收集,但是對於上面的前兩個子彈,它將不會處理Metaspace,因為它不是Metaspace,它可以告訴您Class
是否已經未使用。 它將是一個普通的垃圾收集,但它將是一個“Full GC”或當前使用的GC算法對於模式的任何術語,包括在包含類和類加載器的內存段(也稱為“生成”)內收集垃圾。
收集Class
和ClassLoader
堆實例后,還可以在清理期間回收其關聯的Metaspace數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.