總是我以爲垃圾收集器只清除堆,現在我認爲是這樣。GC是否從Metaspace收集垃圾?
在java 8中,permGen被刪除,並被Metaspace取代。
而且我的理解是元空間垃圾回收(https://stackoverflow.com/a/24075360/2674303)
誰從元空間中收集的垃圾?
總是我以爲垃圾收集器只清除堆,現在我認爲是這樣。GC是否從Metaspace收集垃圾?
在java 8中,permGen被刪除,並被Metaspace取代。
而且我的理解是元空間垃圾回收(https://stackoverflow.com/a/24075360/2674303)
誰從元空間中收集的垃圾?
我認爲你的困惑源於俗稱的「垃圾收集」,它被廣泛使用,但並未真正描述在託管環境中發生的情況。
內存管理是一個複雜的過程,其是,簡化的,約:
所以不包括Java對象的內存空間,前兩個點通常使沒有太大意義這是你的問題似乎是關於。處理前兩個點的算法通常只處理Java堆(定義爲包含普通Java對象實例和類似結構化數據的空間)。
您已鏈接的聲明,稱爲「Metaspace是GCed」似乎主要解決第三個點。這是關於Metaspace中的內存如果不再需要可能會被回收的事實。這並不意味着它需要遍歷Metaspace或類似的內容。很顯然,類元數據在與其關聯的Class
和ClassLoader
變得無法訪問時已經過時,這些都是生活在Java堆上的普通(幾乎)對象。
因此,當Metaspace大小達到極限時,將觸發垃圾回收,但是關於上面的第一個兩個子彈,它不會處理Metaspace,因爲它不是Metaspace,它可以告訴您Class
是否已被使用。它將是一個普通的垃圾回收,但它將是一個「Full GC」或者當前使用的GC算法對包括在包含類和類加載器的內存段(又名「generation」)中收集垃圾的模式所使用的任何術語。
一旦Class
和ClassLoader
堆實例已被收集,它們相關的元數據空間數據也可以在清理過程中回收。
我不確定我是否理解你,但我認爲GC只能從java堆收集垃圾,但Metaspace不在java堆內部。 – gstackoverflow 2014-10-20 14:23:11