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