我正在运行的一个Java进程,在运行的第一小时左右表现始终良好。然而,性能随后迅速下降。在分析时,我发现元空间垃圾回收在一小时内发生得相当频繁,然后失控: 我相信我可以使用-XX:MaxMetaspaceSize选项来解决这个问题。然而,我想更多地了解为什么会发生这种行为。我无法想象垃圾收集算法为什么会表现出这样的行为。有人能解释一下或提供更好的解决方案吗?谢谢。
你可以尝试设置-XX:MaxMetaspaceExpansion=0。这应该在尝试增加元空间之前强制进行完整的GC-释放动态创建的方法/类数据。此外,您可以尝试将MaxMetaspaceFreeRatio设置为低于默认值的值,以在GC后更多地缩小元空间本身。有关其他元空间相关选项,请参见此答案。元空间集合本身依赖于垃圾收集器卸载类。因此,根据您使用的GC调整以更快地回收垃圾也可能有所帮助。