【问题标题】:Why does Java throw java.lang.OutOfMemoryError: Metaspace but there is plenty of free metaspace?为什么 Java 会抛出 java.lang.OutOfMemoryError: Metaspace 但是有很多可用的元空间?
【发布时间】:2016-12-07 07:58:18
【问题描述】:

在我的应用程序中,我在运行时使用 javassist 库创建了许多 java 类。在某些时候会抛出 java.lang.OutOfMemoryError: Metaspace,但 java 进程监控(基于 java.lang.management.MemoryPoolMXBean)报告说有大量可用的元空间。这是为什么?以及如何使用 100% 的元空间内存池?

我创建了一个最小的应用程序来重现问题https://github.com/vlkv/java_metaspace_oom

下载它,cd到项目目录,然后执行'ant run'。在这个应用程序中,我设置了 -XX:MaxMetaspaceSize=100m,但是 OOM 在某个时候抛出了大约 23564Kb 使用的元空间。

错误的调用栈是:

javassist.CannotCompileException: by java.lang.OutOfMemoryError: Metaspace
    at javassist.ClassPool.toClass(ClassPool.java:1170)
    at javassist.CtClass.toClass(CtClass.java:1316)
    at com.tradingview.Main.generateRandomClass(Main.java:53)
    at com.tradingview.Main.main(Main.java:24)
Caused by: java.lang.OutOfMemoryError: Metaspace
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:642)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at javassist.ClassPool.toClass2(ClassPool.java:1183)
    at javassist.ClassPool.toClass(ClassPool.java:1164)
    ... 3 more

【问题讨论】:

  • 当请求的内存量超过可用空间时,它会抛出此异常。当可用空间为零时不是。
  • @EJP 根据 OP,抛出异常时仍有一些可用空间
  • @vitvlkv 您是否调试过它以查看异常来自程序的何处?愿意提供Minimal, Complete, Verifiable Example吗?
  • @qxz 这是“最小完整可验证示例”github.com/vlkv/java_metaspace_oom
  • @qxz "根据OP的说法,抛出异常时还有一些可用空间" free/used比是3比1。不是"一些空间"而是巨大的数量!跨度>

标签: java out-of-memory metaspace


【解决方案1】:

哇,我刚刚找到了答案。 问题是在我的应用程序中,我为每个生成的类创建了一个单独的新类加载器。我在我的示例应用程序中进行了修改,将所有生成的类放到一个 ClassLoader 中,然后在空闲元空间几乎为零时抛出 OOM。修复在这里https://github.com/vlkv/java_metaspace_oom/commit/d6bcade51f79758e2413d1852c771f163392c294 branch fix_of_the_problem

有人知道java进程中类加载器的限制是什么吗?以及如何增加它们?

还发现了这个Why MetaSpace Size is twice as big as Used MetaSpace?

【讨论】:

  • 请解释“大量空闲元空间”和“空闲元空间几乎为零”之间的矛盾。
猜你喜欢
  • 2014-07-27
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多