2014-10-20 115 views

回答

3

我認爲你的困惑源於俗稱的「垃圾收集」,它被廣泛使用,但並未真正描述在託管環境中發生的情況。

內存管理是一個複雜的過程,其是,簡化的,約:

  • 確定哪些是垃圾,這實際上是確定哪些對象是可達(讀取的處理的對象:不是垃圾)並考慮沒有遇到的所有事情都是垃圾
  • 如果需要,將對象引用排入引用隊列和/或觸發終結
  • 回收以前由垃圾佔用的內存t結合是周圍的其他方法:有時活對象移動到不同的存儲空間,而不是

所以不包括Java對象的內存空間,前兩個點通常使沒有太大意義這是你的問題似乎是關於。處理前兩個點的算法通常只處理Java堆(定義爲包含普通Java對象實例和類似結構化數據的空間)。

您已鏈接的聲明,稱爲「Metaspace是GCed」似乎主要解決第三個點。這是關於Metaspace中的內存如果不再需要可能會被回收的事實。這並不意味着它需要遍歷Metaspace或類似的內容。很顯然,類元數據在與其關聯的ClassClassLoader變得無法訪問時已經過時,這些都是生活在Java堆上的普通(幾乎)對象。

因此,當Metaspace大小達到極限時,將觸發垃圾回收,但是關於上面的第一個兩個子彈,它不會處理Metaspace,因爲它不是Metaspace,它可以告訴您Class是否已被使用。它將是一個普通的垃圾回收,但它將是一個「Full GC」或者當前使用的GC算法對包括在包含類和類加載器的內存段(又名「generation」)中收集垃圾的模式所使用的任何術語。

一旦ClassClassLoader堆實例已被收集,它們相關的元數據空間數據也可以在清理過程中回收。