Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GC是否从元空间收集垃圾?_Java_Garbage Collection_Java 8_Dispose - Fatal编程技术网

Java GC是否从元空间收集垃圾?

Java GC是否从元空间收集垃圾?,java,garbage-collection,java-8,dispose,Java,Garbage Collection,Java 8,Dispose,我一直以为垃圾收集器只能清理垃圾堆,现在我也这么认为 在Java8中,permGen被删除,并被Metaspace替换 据我所知,元空间是垃圾收集的() 谁从元空间收集垃圾?我认为您的困惑源于口语术语“垃圾收集”,它被广泛使用,但并没有真正描述托管环境中发生的事情 内存管理是一个复杂的过程,简化为: 标识垃圾对象,这实际上是确定哪些对象是可访问的(读取:不是垃圾)的过程,并将未遇到的所有东西都认为是垃圾。 将对象引用排队到引用队列和/或触发器终结(如有必要) 回收以前被垃圾占用的内存,这也可能

我一直以为垃圾收集器只能清理垃圾堆,现在我也这么认为

在Java8中,permGen被删除,并被Metaspace替换

据我所知,元空间是垃圾收集的()


谁从元空间收集垃圾?

我认为您的困惑源于口语术语“垃圾收集”,它被广泛使用,但并没有真正描述托管环境中发生的事情

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

  • 标识垃圾对象,这实际上是确定哪些对象是可访问的(读取:不是垃圾)的过程,并将未遇到的所有东西都认为是垃圾
  • 将对象引用排队到引用队列和/或触发器终结(如有必要)
  • 回收以前被垃圾占用的内存,这也可能是另一种方式:有时活动对象被移动到不同的内存空间
因此,对于一个不包含Java对象的内存空间,前两点通常没有多大意义,这就是您的问题。解决前两点的算法通常只处理Java堆(定义为包含普通Java对象实例和类似结构化数据的空间)

您链接的声明“Metaspace是GCed”似乎主要解决了第三点。如果不再需要,元空间中的内存可能会被回收。这并不意味着它需要遍历元空间中的活动引用或类似的内容。显然,当关联的
class
ClassLoader
变得不可访问时,类元数据就过时了,这两个对象都是Java堆上的普通(几乎)对象

因此,当元空间大小达到某个限制时,将触发垃圾收集,但是关于上面的前两个项目符号,它不会处理元空间,因为它不是可以告诉您类是否已变得未使用的元空间。它将是一个普通的垃圾收集,但它将是一个“完全GC”或当前使用的GC算法对模式的任何术语,包括在包含类和类加载器的内存段(也称为“生成”)内收集垃圾


一旦收集了
Class
ClassLoader
堆实例,在清理过程中,它们关联的元空间数据也可以回收。

我不确定是否理解您的意思,但我认为GC只能从java堆收集垃圾,但元空间不在java堆内。因此,将使用不同的垃圾收集器算法来收集元空间?(意味着它既不是次要GC也不是主要GC),因为收集元空间的方式不同于收集heap@amarnathharish必须有专门的代码来释放元空间中的内存,这与其他空间不同,但是由于存储在元空间中的工件与类相关联,这取决于类集合是否能够回收此内存。检测到类不可访问通常发生在一个主要的GC(也称为“完全GC”)中。多亏了快速响应,所以当旧的一代被填满或元空间发生调整时,完全GC就会发生?当它发生时,它收集旧的Gen和Meta SPACE,不管需要收集什么?@阿玛纳塔哈里斯,你可以这样看,或者你认为在Meta SpACE中回收内存,它需要收集旧一代(识别不可到达的类),而当收集老一代由于填充了旧一代,关于可回收元空间工件的知识是免费的副产品。