我试图用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
一起运行导致了所需的异常。
功能上达到OutOfMemoryException
比它看起来更难,因为递归函数几乎总是先运行到StackOverflowException
。
但有一种可变的方法可以保证OutOfMemoryException
:一遍又一遍地加倍List
。 Scala的List
s不受最大阵列大小的限制,因此可以扩展直到没有更多的内存。
这是一个例子:
def explodeList[A](list: List[A]): Unit = {
var mlist = list
while(true) {
mlist = mlist ++ mlist
}
}
要回答您的实际问题,请尝试使用JVM选项-Xmx___m
(例如-Xmx256m
)。这定义了允许JVM分配的最大堆大小。