Scala意外堆栈溢出

时间:2011-05-15 16:31:47

标签: scala stack-overflow

我在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会帮忙吗?

1 个答案:

答案 0 :(得分:7)

StackOverflowError是内存耗尽主题的变体,它只是确切地说明了哪个内存区域用完了。

是的,-Xss 提供帮助,但还有更好的方法....

此页面有几个您可以尝试的替代实现:http://en.literateprograms.org/Fibonacci_numbers_(Scala)

您需要使用尾递归或基于流的变体来降低堆栈大小。