Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在windows中使用eclipse增加java堆大小_Java_Memory_Error Handling_Out Of Memory_Heap Size - Fatal编程技术网

在windows中使用eclipse增加java堆大小

在windows中使用eclipse增加java堆大小,java,memory,error-handling,out-of-memory,heap-size,Java,Memory,Error Handling,Out Of Memory,Heap Size,我正在编写一个java程序,以便在windows中使用eclipse生成首批5000万个埃拉托斯提尼素数 package first; import java.util.Arrays; public class primegen { private static int[] generatePrimes(int max) { boolean[] isComposite = new boolean[max + 1]; for (int i = 2; i * i <= ma

我正在编写一个java程序,以便在windows中使用eclipse生成首批5000万个埃拉托斯提尼素数

package first;

import java.util.Arrays;

public class primegen {
private static int[] generatePrimes(int max) {
    boolean[] isComposite = new boolean[max + 1];
    for (int i = 2; i * i <= max; i++) {
        if (!isComposite [i]) {
            for (int j = i; i * j <= max; j++) {
                isComposite [i*j] = true;
            }
        }
    }
    int numPrimes = 0;
    for (int i = 2; i <= max; i++) {
        if (!isComposite [i]) numPrimes++;
    }
    int [] primes = new int [numPrimes];
    int index = 0;
    for (int i = 2; i <= max; i++) {
        if (!isComposite [i]) primes [index++] = i;
    }
    return primes;
}

//The following snippet of code is to check the heapsize
public static void main(String[] args) {
           long heapsize=Runtime.getRuntime().totalMemory();
       System.out.println("heapsize is::"+heapsize);

      System.out.println(generatePrimes(982451653)[4]);

   }
}
它给出了以下错误:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at first.primegen.generatePrimes(primegen.java:7)
at first.primegen.main(primegen.java:30)
我发现JVM中有一些-xmx命令。 我应该在哪里输入该命令,以及应该使用该命令设置的适当堆大小是多少

我的机器上有4 GB的RAM 64位Windows 7

打开Eclipse,窗口->首选项

搜索已安装的Jre,必须指向您的JDK

编辑相同的参数并输入默认VM参数,如下所示或根据您的要求

-Xmx1024m -XX:MaxPermSize=512m
下面是psudo代码供您开始使用

private static BitSet generatePrimes(int max) {
        BitSet sieve = new BitSet(max);
        int size = sieve.size();

        for (int i = 2 ; i < size ; i++)
            sieve.set(i);

        int finalBit = (int) Math.sqrt(size);

        for (int i = 2 ; i < finalBit ; i++) {
            if (sieve.get(i)) {
                for (int j = 2 * i ; j < size ; j += i)
                    sieve.clear(j);
            }
        }

        return sieve;
    }

如果使用位集而不是布尔[],它将使用1/8的内存。我还建议您使用64位版本的Java,因为它默认使用内存的1/4,即最大2 GB,而不是32位windows客户端JVM所使用的最大64 MB。顺便说一句,您不能以字符串的方式打印素数,因为字符串限制为20亿个字符,您需要更多的内存来打印所有素数。创建一个20亿字符的字符串需要8 GB的内存。每个int值至少需要4个字节,并且内存不足。我建议您扫描该位集并打印找到的所有值,因为一次只需要<200字节。我不知道位集是什么。此外,我不会打印此阵列。我只需要这个数组存在,这样我就可以访问这个数组中存储的任何素数。我将编辑我的问题。我建议你看一下标准库的文档,它使用每值一位,而不是每值8位。当您为您的机器构建如此大的数组时,您应该有所不同。当我在默认VM参数部分写入-Xmx1024m-XX:MaxPermSize=512m,然后运行程序时,print语句为System.out.printlngeneratePrimes472882027[4];它返回以下内容:Java HotSpotTM 64位服务器VM警告:忽略选项MaxPermSize=512m;支持在8.0中被删除,但它确实提供了11,这是预期的输出。请注意,上面的数字是2500万素数,程序仍然给出了5000万素数的OutofMemory错误。对于您提到的伪代码,是否筛选一个素数数组直到int max?如果无法运行和验证,您不清楚位集的用法,因此我给了您示例代码,但可能需要很少的修改。但是,是的,与布尔值相比,位集占用的内存更少,所以请使用它。也开始接受答案以吸引更多的观众
private static BitSet generatePrimes(int max) {
        BitSet sieve = new BitSet(max);
        int size = sieve.size();

        for (int i = 2 ; i < size ; i++)
            sieve.set(i);

        int finalBit = (int) Math.sqrt(size);

        for (int i = 2 ; i < finalBit ; i++) {
            if (sieve.get(i)) {
                for (int j = 2 * i ; j < size ; j += i)
                    sieve.clear(j);
            }
        }

        return sieve;
    }