我在Scala中编写了这个基本程序:
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会帮忙吗?
答案 0 :(得分:7)
StackOverflowError是内存耗尽主题的变体,它只是确切地说明了哪个内存区域用完了。
是的,-Xss
会提供帮助,但还有更好的方法....
此页面有几个您可以尝试的替代实现:http://en.literateprograms.org/Fibonacci_numbers_(Scala)
您需要使用尾递归或基于流的变体来降低堆栈大小。