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