0

看起来我们在实际用完该池的可用内存之前遇到了 OutOfMemoryError: Metaspace。

更具体地说,一旦该池的承诺量达到最大值,我们似乎就遇到了该错误,而不是在使用量达到最大值时。

这是设置:

我们有一个在 Oracle Java 8 update 121 上运行的 Jenkins 服务器,并且有以下元空间参数-XX:MetaspaceSize=10G -XX:MaxMetaspaceSize=10G。我们还有 Datadog 监控堆和非堆池。

我们遇到了一个问题,即 Jenkins 日志表明某个线程抛出了 OutOfMemoryError: Metaspace。然而,在事件发生时的 Datadog 中,使用的非堆数量非常低(下图)。

起初我认为 Datadog 可能测量错误,但使用 jconsole 我得到了当前使用情况的匹配结果(事件发生时我没有打开 jconsole)。

我唯一的另一个结论是,错误源于尝试分配更多已提交的元空间,即使这与已使用量之间仍有很大差距。

我是否遗漏了有关这些内存池应该如何工作的信息?

注意:我完全知道这是一个非常大的元空间,而且我们可能在某个地方有类加载器泄漏。这是我们在尝试调查该泄漏时遇到的问题。

事件发生时的记忆追踪

4

0 回答 0