在实际耗尽该池的可用内存之前,我们似乎遇到了OutOfMemoryError:Metaspace。
更具体地说,一旦该池的提交金额达到最大值,我们就会出现该错误,而不是使用金额时。
以下是设置:
我们在Oracle Java 8更新121上运行Jenkins服务器,并具有以下元空间参数-XX:MetaspaceSize=10G -XX:MaxMetaspaceSize=10G
。我们还有Datadog监控堆和非堆池。
我们遇到了Jenkins日志表明某个线程抛出了OutOfMemoryError:Metaspace的问题。但是,在事件发生时的Datadog中,非堆使用量显示为非常低(下图)。
起初我认为Datadog可能测量错了,但是使用jconsole我得到当前使用的匹配结果(我没有在事件发生时打开jconsole)。
我唯一的另一个结论是错误源于尝试分配更多提交的元空间,即使它与使用量之间仍有很大差距。
我是否遗漏了有关这些内存池应该如何工作的内容?
注意:我完全清楚这是一个非常大的元空间,我们可能会在某个地方发生类加载器泄漏。这是我们在试图调查泄漏时遇到的问题。