2014-10-20 113 views

回答

3

我认为你的困惑源于俗称的“垃圾收集”,它被广泛使用,但并未真正描述在托管环境中发生的情况。

内存管理是一个复杂的过程,其是,简化的,约:

  • 确定哪些是垃圾,这实际上是确定哪些对象是可达(读取的处理的对象:不是垃圾)并考虑没有遇到的所有事情都是垃圾
  • 如果需要,将对象引用排入引用队列和/或触发终结
  • 回收以前由垃圾占用的内存t结合是周围的其他方法:有时活对象移动到不同的存储空间,而不是

所以不包括Java对象的内存空间,前两个点通常使没有太大意义这是你的问题似乎是关于。处理前两个点的算法通常只处理Java堆(定义为包含普通Java对象实例和类似结构化数据的空间)。

您已链接的声明,称为“Metaspace是GCed”似乎主要解决第三个点。这是关于Metaspace中的内存如果不再需要可能会被回收的事实。这并不意味着它需要遍历Metaspace或类似的内容。很显然,类元数据在与其关联的ClassClassLoader变得无法访问时已经过时,这些都是生活在Java堆上的普通(几乎)对象。

因此,当Metaspace大小达到极限时,将触发垃圾回收,但是关于上面的第一个两个子弹,它不会处理Metaspace,因为它不是Metaspace,它可以告诉您Class是否已被使用。它将是一个普通的垃圾回收,但它将是一个“Full GC”或者当前使用的GC算法对包括在包含类和类加载器的内存段(又名“generation”)中收集垃圾的模式所使用的任何术语。

一旦ClassClassLoader堆实例已被收集,它们相关的元数据空间数据也可以在清理过程中回收。