我是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
Run Code Online (Sandbox Code Playgroud)
老实说,这不是什么大不了的事,但是虽然我明白了OOME是什么,但我想弄清楚的问题是 - 它真的应该是什么?答案是"不",但......
Mat*_*zok 15
基本上,当编译和运行程序时,SBT只使用一个JVM - 它运行的JVM.因此,如果元空间中存在无法进行垃圾回收的任何内容,则最终可能会耗尽内存 - 例如,如果您创建了一些连接(我看到了MongoDB或ElasticSearch的示例)并且忘记在关闭时关闭它,它将保持打开状态你收集了一些对象 - 在几次重新编译 - 重载循环之后,很少有对象可能会耗尽你的元空间.
所以这是一个内存泄漏,通常不会影响你的程序,但是SBT会让你看到异常.
从长远来看,你应该识别泄漏并将其删除,为了解决方法你可以使用像SBT左轮手枪这样的东西,它允许你在另一个JVM中启动程序 - 因此内存泄漏不会总结,因为你将关闭并运行新的JVM而不是在与SBT相同的JVM中运行所有内容.