在java 8中触发元数据空间内存上的gc

时间:2017-06-23 05:05:35

标签: java-8 garbage-collection jvm

当jvm上没有设置MaxMetaspaceSize属性时,什么条件会触发Metaspace的垃圾收集。

假如我关闭了几个未使用的类加载器,那么有一个空间来释放元空间内存中的内存。我的问题是,完整的gc会触发元空间内存的清理,还是以其他方式触发。

4 个答案:

答案 0 :(得分:1)

  

因为默认情况下,Java 8中的Metaspace不受限制,jvm何时理解它需要从其元空间中清除未引用的类。

Metaspace本身不是垃圾收集的。但是java堆是。收集java.lang.Class个对象时,底层元数据也会被释放。因此,在大多数情况下,如果有任何类符合卸载条件,常规GC周期也将释放元空间。

  

但是想知道gc什么时候被触发来清理取消部署的应用程序的元空间内存。

最迟当元空间的当前容量已满时,可能在常规垃圾收集卸载类时更早。

答案 1 :(得分:0)

是的,它是完整的GC来清理元空间,特别是你应该在gc上启用详细模式后看到像这个Full GC (Metadata GC Threshold)这样的条目。

答案 2 :(得分:0)

here有明确记录,我可以在这里引用。

  

-XX:MetaspaceSize =大小   设置分配的类元数据空间的大小,该大小将在第一次超过垃圾收集时触发。垃圾收集的阈值取决于使用的元数据量而增加或减少。默认大小取决于平台

直接引号,但重点是我的;)

检查来自@Holger的答案可能会有所帮助。

答案 3 :(得分:-2)

请使用System.gc()或Runtime.gc()