当前位置: 首页 > 知识库问答 >
问题:

JAVAlang.OutOfMemoryError:Java堆空间和HashMap

宰父霖
2023-03-14

抱歉再次发布此代码。之前的问题是,我得到了一个堆栈溢出错误,该错误通过使用long而不是int来修复。然而,对于较大的n值,我在线程“main”java中得到了一个异常。lang.OutOfMemoryError:Java堆空间。问题:

Given a positive integer n, prints out the sum of the lengths of the Syracuse 
sequence starting in the range of 1 to n inclusive. So, for example, the call:
lengths(3)
will return the the combined length of the sequences:
1
2 1
3 10 5 16 8 4 2 1 
which is the value: 11. lengths must throw an IllegalArgumentException if 
its input value is less than one.

我的代码:

  import java.util.*;


  public class Test {

HashMap<Long,Integer> syraSumHashTable = new HashMap<Long,Integer>();

public Test(){

}

public int lengths(long n)throws IllegalArgumentException{

    int sum =0;

    if(n < 1){
        throw new IllegalArgumentException("Error!! Invalid Input!");
    }   

    else{

        for(int i=1;i<=n;i++){
            sum+=getStoreValue(i);
        }
        return sum;


    }


}

private int getStoreValue(long index){
    int result = 0;

    if(!syraSumHashTable.containsKey(index)){
        syraSumHashTable.put(index, printSyra(index,1));
    }

    result = (Integer)syraSumHashTable.get(index);

     return result;

}

public static int printSyra(long num, int count) {
    if (num == 1) {
        return count;
    }
    if(num%2==0){

        return printSyra(num/2, ++count);
    }

    else{

        return printSyra((num*3)+1, ++count) ;

    }
}


}

因为我必须将前面的数字相加,所以我将在线程“main”java中结束异常。lang.OutOfMemoryError:Java堆空间的巨大值为n。我知道哈希表应该有助于加速计算。如果我的递归方法printSyra遇到了我在使用HashMap之前计算过的元素,如何确保它能够提前返回值。

驱动程序代码:

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Test t1 = new Test();
    System.out.println(t1.lengths(90090249));

    //System.out.println(t1.lengths(3));
}

共有1个答案

张建华
2023-03-14

你需要使用迭代法而不是递归法。这种递归方法会对线程的堆栈跟踪产生压力。

public static int printSyra(long num, int count) {
    if (num == 1) {
        return count;
    }

    while (true) {
            if (num == 1) break; else if (num%2 == 0) {num /= 2; count++;) else {num = (num*3) + 1; count++;} 
    }
    return count;
}
 类似资料:
  • 我试图在Eclipse和GGTS上编译我的Grails项目,在这两个平台上每次都收到相同的错误: 我已经激活了堆空间查看器,但它从来没有达到我在eclipse.ini和ggts.ini上定义的1GB最大大小(甚至没有达到400M),所以我想问题是我的MAC上的JVM选项应该改变。 我设置的Eclipse和GGTS值: -xx:permsize=1024m java-xx:+printflagsfi

  • 问题内容: 我最近在具有24个CPU和32GB RAM的服务器上使用了带有Ipython的PySpark。它仅在一台机器上运行。在我的过程中,我想收集以下代码中给出的大量数据: 当我做 它给我outOfMemory错误。。另外,此错误发生后,我无法在Spark上执行任何操作,因为它失去了与Java的连接。它给。 看起来堆空间很小。如何设置更大的限制? 编辑 : 我在运行之前尝试过的事情: 我根据此

  • 问题内容: 我在执行多线程程序时遇到以下错误 上面的错误发生在其中一个线程中。 据我所知,堆空间仅由实例变量占用。如果这是正确的,那么为什么在运行一段时间后会出现此错误,因为在创建对象时分配了实例变量的空间。 有什么办法可以增加堆空间? 我应该对程序进行哪些更改,以使其占用更少的堆空间? 问题答案: 如果要增加堆空间,可以 -在命令行上使用。默认情况下,这些值基于JRE版本和系统配置。你可以在Ja

  • 我面临一些关于内存问题的问题,但我无法解决它。非常感谢您的帮助。我不熟悉Spark和pyspark功能,试图读取大约5GB大小的大型JSON文件,并使用 每次运行上述语句时,都会出现以下错误: 我需要以RDD的形式获取JSON数据,然后使用SQLSpark进行操作和分析。但是我在第一步(读取JSON)本身就出错了。我知道要读取如此大的文件,需要对Spark会话的配置进行必要的更改。我遵循了Apac

  • 我想从网页上选定的文本中提取名词,并在文本显示时突出显示它们。所以我使用OpenNLP库来解析和获取名词列表。它在java类中运行良好,没有内存问题,尽管在显示输出之前花费了6-7秒,但当我在jsp页面中运行代码时,我得到了以下错误: 根本原因 我读到的一些解决方案建议通过这样做来增加apache tomcat的堆内存大小: 所以我将其设置为-Xmx2g,但仍然会产生相同的错误。我认为我不需要修改

  • 我最近一直在我的服务器上使用PySpark和Ipython,服务器上有24个CPU和32GB RAM。它只在一台机器上运行。在我的过程中,我想收集大量的数据,如下代码所示: 当我做的时候 它给了我outOfMemory错误。。此外,我不能在此错误后对Spark执行任何操作,因为它失去了与Java的连接。它给出了。 看起来堆空间很小。我怎么才能把它设置到更大的限度呢? 编辑: 运行前尝试的内容: 我