Java 8元空间垃圾收集

9

我正在运行的一个Java进程,在运行的第一小时左右表现始终良好。然而,性能随后迅速下降。在分析时,我发现元空间垃圾回收在一小时内发生得相当频繁,然后失控:

enter image description here

我相信我可以使用-XX:MaxMetaspaceSize选项来解决这个问题。然而,我想更多地了解为什么会发生这种行为。我无法想象垃圾收集算法为什么会表现出这样的行为。有人能解释一下或提供更好的解决方案吗?谢谢。


我认为你正在使用一些在运行时生成类的框架。最终它会失去控制。解决方案取决于你使用的框架。 - talex
谢谢,是的我是。我也想到了这一点,但是生成类的速率似乎没有改变。唯一改变的似乎是垃圾回收的频率降低了。 - user1675642
这可能是一些JVM启发式。它试图寻找更好的参数,例如最大大小。而且它看起来像是闪光效应。元空间的大小在特定时间点测量。当GC的频率与测量频率大致相同时,可能会出现一些奇怪的效果。 - talex
当你说性能下降时,有哪些症状?你是否已经将元空间GC与这些症状联系起来了? - K Erlandsson
症状是进程执行速度变慢,进程使用的内存也开始增加。这种变化与图表中所见的变化相关。我对上面的图表有兴趣,即使它实际上与我的性能问题无关。 - user1675642
1个回答

9
你可以尝试设置-XX:MaxMetaspaceExpansion=0。这应该在尝试增加元空间之前强制进行完整的GC-释放动态创建的方法/类数据。此外,您可以尝试将MaxMetaspaceFreeRatio设置为低于默认值的值,以在GC后更多地缩小元空间本身。
有关其他元空间相关选项,请参见此答案
元空间集合本身依赖于垃圾收集器卸载类。因此,根据您使用的GC调整以更快地回收垃圾也可能有所帮助。

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