Java 8元空间垃圾收集

use*_*642 8 java garbage-collection jvm metaspace

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

在此输入图像描述

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

the*_*472 5

您可以尝试设置-XX:MaxMetaspaceExpansion=0。在尝试增加元空间之前,这将强制使用完整的GC-释放动态创建的方法/类数据。此外,您可以尝试将MaxMetaspaceFreeRatio值设置为比默认值低的值,以在GC之后进一步缩小元空间本身。

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

元空间收集本身依赖于垃圾收集器正在卸载的类。因此,根据GC的不同,您可能需要进行调整以尽早回收垃圾。