Java8元空间垃圾收集

Java8元空间垃圾收集,java,garbage-collection,jvm,metaspace,Java,Garbage Collection,Jvm,Metaspace,我正在运行的java进程在运行的头一个小时内始终表现良好。然而,性能随后迅速下降。分析时,我发现metaspace垃圾收集在小时标记之前发生得相当频繁,然后失控: 我很确定我可以使用-XX:MaxMetaspaceSize选项修复这个问题。然而,我想知道为什么会发生这种行为。我无法想象为什么垃圾收集算法会这样。有人对更好的解决方案有什么解释或建议吗?谢谢您可以尝试设置-XX:MaxMetaspaceExpansion=0。这应该在尝试扩展元空间之前强制执行完整的GC—释放动态创建的方法/类数据

我正在运行的java进程在运行的头一个小时内始终表现良好。然而,性能随后迅速下降。分析时,我发现metaspace垃圾收集在小时标记之前发生得相当频繁,然后失控:


我很确定我可以使用-XX:MaxMetaspaceSize选项修复这个问题。然而,我想知道为什么会发生这种行为。我无法想象为什么垃圾收集算法会这样。有人对更好的解决方案有什么解释或建议吗?谢谢

您可以尝试设置
-XX:MaxMetaspaceExpansion=0
。这应该在尝试扩展元空间之前强制执行完整的GC—释放动态创建的方法/类数据。此外,您可以尝试将
MaxMetaspaceFreeRatio
设置为比默认值更低的值,以便在GC之后进一步收缩元空间本身

有关其他元空间相关选项,请参见


元空间收集本身依赖于垃圾收集器卸载的类。因此,根据您使用的GC,调整它以更快地回收垃圾也可能有所帮助。

我认为您使用的框架可以在运行时生成类。最终它失去了控制。解决方案取决于您使用的框架。谢谢,是的,我是。我想到了这一点,但类的生成速率似乎没有改变。似乎所有的变化都是gc的频率降低了,这可能是一些JVM启发。它试图找到更好的参数,如最大尺寸。而且它看起来像频闪效应。在特定时刻测量的元空间大小。当GC的频率与测量的频率大致相同时,可能会出现一些奇怪的效果。当你说性能下降时,症状是什么?你真的把元空间GC和这些症状联系起来了吗?症状是这个过程做的慢多了。进程使用的内存也开始增加。该变化与图中所示的变化相关。我对上面图表的解释感兴趣,即使它实际上与我的性能问题无关。