繁体   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