Java 8元空间垃圾收集

我正在运行的java进程在运行的第一个小时左右执行得很好。 但是,性能会迅速降低。 在进行性能分析时,我发现元空间垃圾收集经常发生,直到小时标记然后失控:

在此处输入图像描述

我很确定我能够使用-XX:MaxMetaspaceSize选项来解决这个问题。 但是,我想更多地了解为什么会出现这种情况。 我无法想象为什么垃圾收集算法的行为会像这样。 有没有人对更好的解决方案有解释或建议? 谢谢

您可以尝试设置-XX:MaxMetaspaceExpansion=0 。 这应该强制完整的GC – 释放动态创建的方法/类数据 – 在尝试增长元空间之前。 此外,您可以尝试将MaxMetaspaceFreeRatio设置为低于默认值的值,以便在GC之后更多地缩小元空间本身。

有关其他与元空间相关的选项,请参阅此答案 。

Metaspace集合本身依赖于垃圾收集器卸载的类。 因此,根据GC,您正在使用调整来尽早回收垃圾也可能有所帮助。