gpt4 book ai didi

scala.tools.nsc.interpreter 内存泄漏

转载 作者:行者123 更新时间:2023-12-04 15:47:41 25 4
gpt4 key购买 nike

我需要使用 Scala 实现一个 DSL(域特定语言),这个 DSL 将在 Scala 解释器(scala.tools.nsc.interpreter)中解释。问题是解释器使用的内存不断增加,直到抛出 outOfMemory 异常。每次我要执行一行 DSL 时,我都无法重新初始化解释器,因为解释器需要一段时间才能加载。我不能只调用reset(),因为我需要跟踪解释器执行环境中的一些数据。

即使我执行以下操作,也会发生内存泄漏:

while (true)
{
interpreter.interpret("println(4 + 5)")
}

一段时间后,我会得到:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at ch.epfl.lamp.util.ByteArray.<init>(ByteArray.java:24)
at ch.epfl.lamp.fjbg.JCode.<init>(JCode.java:47)
at ch.epfl.lamp.fjbg.JExtendedCode.<init>(JExtendedCode.java:113)
at ch.epfl.lamp.fjbg.FJBGContext.JCode(FJBGContext.java:122)
at ch.epfl.lamp.fjbg.JMethod.<init>(JMethod.java:52)
at ch.epfl.lamp.fjbg.FJBGContext.JMethod(FJBGContext.java:87)
at ch.epfl.lamp.fjbg.JClass.addNewMethod(JClass.java:246)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genMethod(GenJVM.scala:755)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator$$anonfun$genClass$7.apply(GenJVM.scala:307)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator$$anonfun$genClass$7.apply(GenJVM.scala:307)
at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
at scala.collection.immutable.List.foreach(List.scala:45)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genClass(GenJVM.scala:307)
at scala.tools.nsc.backend.jvm.GenJVM$JvmPhase$$anonfun$run$4.apply(GenJVM.scala:86)
at scala.tools.nsc.backend.jvm.GenJVM$JvmPhase$$anonfun$run$4.apply(GenJVM.scala:86)
at scala.collection.mutable.HashMap$$anon$2$$anonfun$foreach$3.apply(HashMap.scala:102)
at scala.collection.mutable.HashMap$$anon$2$$anonfun$foreach$3.apply(HashMap.scala:102)
at scala.collection.Iterator$class.foreach(Iterator.scala:660)
at scala.collection.mutable.HashTable$$anon$1.foreach(HashTable.scala:157)
at scala.collection.mutable.HashTable$class.foreachEntry(HashTable.scala:190)
at scala.collection.mutable.HashMap.foreachEntry(HashMap.scala:43)
at scala.collection.mutable.HashMap$$anon$2.foreach(HashMap.scala:102)
at scala.tools.nsc.backend.jvm.GenJVM$JvmPhase.run(GenJVM.scala:86)
at scala.tools.nsc.Global$Run.compileSources(Global.scala:953)
at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.compileAndSaveRun(IMain.scala:756)
at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.compile(IMain.scala:731)
at scala.tools.nsc.interpreter.IMain$Request.compile(IMain.scala:873)
at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:576)
at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:543)
at com.ericsson.ims_dsl.IMS_Interpreter$$anonfun$e$1.apply(IMS_Interpreter.scala:50)
at com.ericsson.ims_dsl.IMS_Interpreter$$anonfun$e$1.apply(IMS_Interpreter.scala:50)
at scala.tools.nsc.interpreter.IMain.beQuietDuring(IMain.scala:200)

有人可以帮我解决这个问题吗?

最佳答案

每次调用interpret方法,请求被存储。因此,如果您尝试无限次调用此方法,您应该会遇到麻烦。所以这不是一个真正的错误。

您可以通过增加 JVM 最大堆大小来增加崩溃前可能的迭代次数......您可能需要计算可能的调用次数以检查它是否符合您的目标。

关于scala.tools.nsc.interpreter 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7586188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com