Java 8中触发Metaspace内存的垃圾回收

5
当jvm上没有设置MaxMetaspaceSize属性时,什么条件会触发Metaspace的垃圾回收?
例如,如果我关闭了一些未使用的类加载器,则有可能释放metaspace内存中的空间。我的问题是,是否完整的垃圾回收会触发清除metaspace内存,还是以其他方式触发?

1
你是在问在什么条件下metaspace内存才会被释放,还是在什么条件下metaspace填充触发了GC?这是两件不同的事情。 - the8472
1
由于Java 8中的Metaspace默认情况下没有限制,那么JVM何时会意识到需要清理其Metaspace中未引用的类呢? - Uday Shankar
4个回答

2
默认情况下,Java 8中的Metaspace没有限制,那么JVM什么时候会清理其Metaspace中未引用的类?Metaspace本身不会被垃圾回收,但Java堆会被垃圾回收。当java.lang.Class对象被收集时,底层元数据也会被释放。因此,在大多数情况下,如果有任何符合卸载条件的类,则常规GC周期也将释放Metaspace。但是想要了解的是,何时触发GC以清理未部署应用程序的Metaspace内存?最迟在Metaspace的当前容量已满时,可能会更早地在定期垃圾回收卸载类时进行释放。

类对象不是存储在堆空间中吗?那么堆空间上的GC如何帮助清理元空间呢? - Uday Shankar
2
不,Class对象在堆中。类的内部表示在元空间中。 - the8472
哦,是的 @the8472 我可能弄错了关于类对象存储在元空间中。我的问题现在是,在没有设置MaxMetaspaceSize属性的情况下,jvm在什么条件下进行元空间垃圾回收。如果设置了该属性,jvm似乎会使用MinMetaspaceFreeRatio、MaxMetaspaceFreeRatio来触发垃圾回收。 - Uday Shankar
1
我不想设置那个属性,相反,我希望在可以卸载时积极清理元空间。只是想知道如何做到这一点。 - Uday Shankar
我们正在一个环境中运行,在这个环境中我们需要在Tomcat服务器上进行多次热部署应用程序(最多5个)。因此,这些应用程序会定期被卸载和重新部署以获取新内容。这些应用程序的特点是动态的,每个应用程序都可以加载任意数量的类。这就是为什么我们不想设置任何maxMetaspace属性,而是想了解gc何时触发以清理未部署应用程序的元空间内存。 - Uday Shankar
显示剩余2条评论

0

这里有清晰的文档链接,我可以在此引用:

-XX:MetaspaceSize=size 设置分配给类元数据空间的大小,一旦超过该大小,将触发垃圾回收。垃圾回收的阈值会根据元数据使用量的增加或减少而相应调整。默认大小取决于平台

直接引用但强调是我的;)

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


0

是的,它是清理元空间的完整GC,具体来说,启用gc的详细模式后,您应该会看到像这样的条目Full GC(Metadata GC Threshold)


-2
请使用 System.gc() 或 Runtime.gc()。

1
我不想手动或编程方式触发垃圾回收,我想了解当未设置属性时,JVM实际上何时自动触发垃圾回收。 - Uday Shankar
https://www.dynatrace.com/resources/ebooks/javabook/how-garbage-collection-works/ - BalaMurugan.N

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接