在windows中使用eclipse增加java堆大小
我正在编写一个java程序,以便在windows中使用eclipse生成首批5000万个埃拉托斯提尼素数在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
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;
}