斯卡拉意外的堆栈溢出
我在斯卡拉写这个基本程序:斯卡拉意外的堆栈溢出
import scala.collection.mutable.HashMap
object HelloWorld {
val treasureMap = new HashMap[BigInt, BigInt]
def main(args: Array[String]) {
println(fibCache(10))
}
def fibCache(n: BigInt): BigInt = {
if (n == 0 || n == 1) {
return n
}
return treasureMap.getOrElseUpdate(n, fibCache(n - 1) + fibCache(n - 2))
}
}
和我期望与真值很大,我有一个OutOfMemoryError或东西,而是我看到这一点:
Exception in thread "main" java.lang.StackOverflowError
at java.math.BigInteger.compareMagnitude(Unknown Source)
at java.math.BigInteger.compareTo(Unknown Source)
at scala.math.BigInt.compare(BigInt.scala:141)
at scala.math.BigInt.$less$eq(BigInt.scala:145)
at scala.math.BigInt.fitsInLong(BigInt.scala:130)
at scala.math.BigInt.hashCode(BigInt.scala:120)
at scala.runtime.BoxesRunTime.hashFromNumber(Unknown Source)
at scala.collection.mutable.HashTable$HashUtils$class.elemHashCode(HashTable.scala:366)
at scala.collection.mutable.HashMap.elemHashCode(HashMap.scala:43)
at scala.collection.mutable.HashTable$class.findEntry(HashTable.scala:108)
at scala.collection.mutable.HashMap.findEntry(HashMap.scala:43)
at scala.collection.mutable.HashMap.get(HashMap.scala:63)
at scala.collection.mutable.MapLike$class.getOrElseUpdate(MapLike.scala:186)
at scala.collection.mutable.HashMap.getOrElseUpdate(HashMap.scala:43)
有人可以帮助解释为什么吗?另外,有没有我可以用来缓解这种情况的运行时设置? -Xss会有帮助吗?
StackOverflowError是关于内存不足的主题的变体,它只是准确地确定哪个内存区域已用完。
所以,是的,-Xss
将帮助,但有一个更好的办法....
本页面有几个替代实现,你可以尝试:http://en.literateprograms.org/Fibonacci_numbers_(Scala)
你要使用的尾巴 - 递归或基于流的变体来减小堆栈大小。
我很熟悉StackOverflow是什么。当我用Java编写这个等价物时,它不会这样。它在堆叠之前耗尽内存。 – 2011-05-15 16:45:22
加1表示有用的链接... – 2011-05-15 16:45:43
用于尾递归的+1 – 2011-05-15 16:49:02
刚刚在我的机器(3GB的Macbook)上运行它与最新版本的Scala,它按预期运行。 – 2011-05-15 16:39:47
你使用了多大的价值?结果是什么? – 2011-05-15 16:41:17
32/64位,可用物理内存和-Xss参数都将影响问题发生的确切位置,因此不要担心所选的实际数字。只要知道会有*某些*点就足够了,这取决于你的配置。 – 2011-05-15 16:58:24