如何使用IntelliJ为Scala分配更少的内存

问题描述 投票:1回答:1

我试图用OutOfMemoryException崩溃我的程序(在IntelliJ中运行):

  def OOMCrasher(acc: String): String = {
    OOMCrasher(acc + "ADSJKFAKLWJEFLASDAFSDFASDFASERASDFASEASDFASDFASERESFDHFDYJDHJSDGFAERARDSHFDGJGHYTDJKXJCV")
  }
  OOMCrasher("")

但是,它只运行了很长时间。我的怀疑是,用一个字符串填充分配给JVM的所有GB内存只需要很长时间。所以我正在研究如何使IntelliJ为JVM分配更少的内存。这是我尝试过的:

在运行配置 - > VM选项中:

 --scala.driver.memory 1k || --driver.memory 1k

这两个都导致崩溃:

Unrecognized option: --scala.driver.memory
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

我还尝试将选项放在编辑配置 - >程序参数中。这导致程序再次运行很长时间,而不是产生OutOfMemoryException

编辑:

我将接受任何成功解释如何为程序分配更少内存的答案,因为这是主要问题。

更新:

将功能更改为:

  def OOMCrasher(acc: HisList[String]): HisList[String] = {
    OOMCrasher(acc.add("Hi again!"))
  }
  OOMCrasher(Cons("Hi again!", Empty))

其中HisList是一个简单的LinkedList实现,以及与-Xmx3m一起运行导致了所需的异常。

scala intellij-idea jvm
1个回答
2
投票

功能上达到OutOfMemoryException比它看起来更难,因为递归函数几乎总是先运行到StackOverflowException

但有一种可变的方法可以保证OutOfMemoryException:一遍又一遍地加倍List。 Scala的Lists不受最大阵列大小的限制,因此可以扩展直到没有更多的内存。

这是一个例子:

def explodeList[A](list: List[A]): Unit = {
  var mlist = list

  while(true) {
    mlist = mlist ++ mlist
  }
}

要回答您的实际问题,请尝试使用JVM选项-Xmx___m(例如-Xmx256m)。这定义了允许JVM分配的最大堆大小。

© www.soinside.com 2019 - 2024. All rights reserved.