【问题标题】:Is java.lang.OutOfMemoryError: Metaspace normal in sbt REPL?java.lang.OutOfMemoryError: Metaspace 在 sbt REPL 中是否正常?
【发布时间】:2017-02-24 18:17:49
【问题描述】:

我是 Scala、sbt 及其 REPL 的新手。 我真正喜欢的一件事是~ 选项,用于在编辑文件时循环运行或编译。所以我最终经常运行~run

但它会泄漏内存。在 20-30 运行之后,整个 sbt 交互式 shell 崩溃:

[info] Compiling 1 Scala source to /home/[redacted]
sbt appears to be exiting abnormally.
The log file for this session is at /tmp/sbt853875123365456892.log
java.lang.OutOfMemoryError: Metaspace
Error during sbt execution: java.lang.OutOfMemoryError: Metaspace

老实说,这没什么大不了的,但是虽然我了解 OOME 是什么,但我想弄清楚的问题是——它真的应该是这样吗?答案是“不”,但是……

  • 这是一个 sbt 错误吗? (我应该尝试举报吗?)
  • 我的程序有问题吗? (内存泄漏?)

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    基本上,SBT 在编译和运行您的程序时,只使用一个 JVM - 运行它的那个。因此,如果元空间中有任何不能被垃圾收集的东西,你最终可能会耗尽内存 - 例如,如果你创建了一些连接(我看到了 MongoDB 或 ElasticSearch 的示例)并且忘记在关闭时关闭它,它将保持打开状态以防止你从收集一些对象 - 经过几次重新编译 - 重新加载循环后,这几个对象可能会用完你的元空间。

    所以这是内存泄漏,通常不会影响您的程序,但 SBT 会使其在您看到的异常中可见。

    从长远来看,您应该识别泄漏并将其删除,作为一种解决方法,您可以使用 SBT revolver 之类的东西,它允许您在另一个 JVM 中启动程序 - 因此内存泄漏不会像您那样总结只是关闭并运行新的 JVM,而不是在与 SBT 相同的 JVM 中运行所有内容。

    【讨论】:

    • 所以如果我理解正确的话,你的意思是我的程序正在泄漏内存。
    • 很可能 - 我过去发现的所有 SBT 元空间问题都是特定程序中的某种内存泄漏 - 它可能是您的部分,可能是您的库或某些配置。您可以尝试将一些分析器附加到 SBT 并查看在重新加载之间未收集的内容。
    • @MateuszKubuszok 我在简单的示例应用程序中也遇到了这个错误。我想知道这是一般问题还是只是我的设置问题。我打开了一个问题here
    猜你喜欢
    • 2018-02-05
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    相关资源
    最近更新 更多