我一直认为垃圾收集器只清除堆,现在我认为是这样的。
在java 8中,permGen被删除,并被Metaspace取代。
据我所知,Metaspace是垃圾收集(https://stackoverflow.com/a/24075360/2674303)
谁在Metaspace收集垃圾?
发布于 2014-10-21 10:24:05
我认为,您的困惑源于“垃圾收集”这个口语化的术语,它被广泛使用,但并没有真正描述在托管环境中发生的事情。
内存管理是一个复杂的过程,简化后的过程是:
因此,对于不包含Java对象的内存空间,前两点通常没有多大意义,这就是您的问题所在。解决前两点的算法通常只处理Java堆(定义为包含普通Java对象实例和类似结构化数据的空间)。
您所链接的声明“Metaspace is GCed”似乎主要解决了第三点。事实上,如果不再需要,Metaspace中的内存可能会被回收。这并不意味着它需要遍历Metaspace或类似的活动引用。显然,当类元数据的关联Class和ClassLoader变得不可访问时,类元数据就过时了,因为它们都是生活在Java堆上的普通(好的,几乎)对象。
因此,当Metaspace大小达到极限时,垃圾收集将被触发,但对于上面的前两个项目,它将不会处理Metaspace,因为不能通过Metaspace来判断Class是否已被使用。它将是一个普通的垃圾收集,但它将是一个“完整的GC”,或者当前使用的GC算法对于包括在包含类和类加载器的内存段(也称为“生成”)中收集垃圾的模式的任何术语。
一旦收集了Class和ClassLoader堆实例,它们相关的Metaspace数据也可以在清理期间被回收。
https://stackoverflow.com/questions/26462136
复制相似问题