Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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
Java Bluej OutOfMemoryError_Java_Out Of Memory_Bluej - Fatal编程技术网

Java Bluej OutOfMemoryError

Java Bluej OutOfMemoryError,java,out-of-memory,bluej,Java,Out Of Memory,Bluej,我用Bluej编写了一个java程序,并以较小的值(100000)运行它。但是对于更大的范围(1000000),我得到了java.lang.OutOfMemoryError:java堆空间。我如何用Bluej解决它?提前谢谢 import java.io.*; import java.util.*; class prob { private static final int N = 1000000;//5000000 private static final int h = M

我用Bluej编写了一个java程序,并以较小的值(100000)运行它。但是对于更大的范围(1000000),我得到了
java.lang.OutOfMemoryError:java堆空间
。我如何用Bluej解决它?提前谢谢

import java.io.*;
import java.util.*;

class prob
{
    private static final int N = 1000000;//5000000
    private static final int h = Math.min(N, (int)(Math.cbrt(0.5*N*N)));;
    private static byte[][] small;
    private static int[] smallSums;
    private static int[] smallCounts;
    private static int periodCount;
    private static int periodSum;

    private static void recursiveInit(int x, int y, int steps, int h)
    {
        if (x <= h)
        {
            for (int z = x + y; z <= 2*h; z += x)
                recursiveInit(z, x, steps + 1, h);
        }
        else if (x <= h + y)
        {
            small[y][x - h - 1] = (byte)steps;
        }
    }

    private static long recurseRule(int a, int b, int c, int d, int steps, int limit, int y)
    {
        int i = c;
        int j = d;
        long sum = 0;
        for (;;)
        {
            i += a;
            j += b;
            if (i*(h + 1) + j*y > limit) break; 
            int xmax = (limit - j*y)/i - (h + 1);
            int k = xmax%y;
            long cnt = smallCounts[k] + (xmax/y)*periodCount;
            long s = smallSums  [k] + (xmax/y)*periodSum;
            sum += cnt*steps + 2*s + recurseRule(i, j, a, b, steps + 2, limit, y);
        }
        return sum;
    }

    public static void main(String[] args)
    {
        double start = System.currentTimeMillis();
        smallCounts = new int[h];
        smallSums = new int[h];
        small = new byte[h + 1][];
        for (int y = 1; y <= h; ++y) small[y] = new byte[y];
        for (int x = 2; x <= 2*h; ++x) recursiveInit(x, 1, 1, h);
        long sum = N;
        for (int y = 1; y <= h && y <= N; ++y)
        {
            smallSums[0] = small[y][0];
            smallCounts[0] = 0;
            if (small[y][0] != 0) ++smallCounts[0];
            for (int i = 1; i < y; ++i)
            {
                smallSums[i] = smallSums[i - 1] + small[y][i];
                smallCounts[i] = smallCounts[i - 1];
                if (small[y][i] != 0) ++smallCounts[i];
            }
            periodCount = smallCounts[y - 1];
            periodSum = smallSums[y - 1];
            int f = (h + 1)/y + 1;
            for (int gmax = N/y; gmax > 0;)
            {
                int r = N/gmax;
                int gmin = N/(r + 1);
                int i1 = (y + y*f) - (h + 1);
                int i2 = (r + y*f) - (h + 1);
                int j1 = i1%y;
                int j2 = i2%y;
                int k = i2/y - i1/y;
                int s = smallSums  [j2] - smallSums  [j1] + k*periodSum;
                int c = smallCounts[j2] - smallCounts[j1] + k*periodCount;
                sum += (gmax - gmin)*(2L*s + c + recurseRule(1, 0, 0, 1, 3, r, y));
                gmax = gmin;
            }
        }
        System.out.println("The sum is "+sum);
        double end = System.currentTimeMillis();
        System.out.println("Time elapsed : "+(end-start)/1000d+" seconds");
    }
}
import java.io.*;
导入java.util.*;
类问题
{
私有静态最终整数N=1000000;//5000000
私有静态final int h=Math.min(N,(int)(Math.cbrt(0.5*N*N));;
专用静态字节[][]小;
私有静态整数[]小和;
私有静态int[]小计数;
私有静态整数周期计数;
私有静态整数周期和;
私有静态void recursiveInit(int x,int y,int steps,int h)
{
如果(x根据页面

Windows:在bluej.defs中使用bluej.Windows.vm.args属性

Linux/Unix/等效:编辑安装程序创建的“bluej”shell脚本(在安装bluej的目录中),并修改最后一行(启动bluej)

更新

正如Makato所指出的,您面临的这个问题表明您的程序可能有问题,因为它似乎没有有效地使用内存。请发布一个代码片段

更新
您的代码看起来正常

尝试使用Windows命令和处理器以更高的ram运行java

javaw-Xmx2048-Xms1024-jar您的文件名.jar


因此,基本上,
xmx
是您分配的最大RAM,而
xms
是它应该使用的最小RAM。

我知道这很旧,但没有正确的答案 转到bluej.defs文件并添加

bluej.vm.args=-Xmx2G或任意数量

注意^windows不在那里


此外,您可能必须更改bluej使用的JVM,因为默认值为32位,这可能会导致一些问题。您可以通过将bluej文件夹中的jdk文件夹重命名为jdk-32或其他任何方式来执行此操作,以便它会问您在启动时要使用什么jdk选择64位的JVM我们不知道您正在运行的代码告诉您如何修复首先,您能否提供代码,以便我们可以问:“您对这个代码段做了什么?”在提问时,请提供一个具体的例子,说明您正在努力实现的目标以及您目前所做的工作。在当前的状态下,您的问题无法得到真正的回答,可能会被关闭。要了解更多关于提出好问题的信息,请参阅如何提问-既然有这种公众需求,请您现在发布一些代码好吗你的问题确实是可以回答的。谢谢你发布代码。不。还有一些问题是错误的。一些更深层次的问题。一些需要查看代码的问题。@Makoto我不是想猜测操作代码。也许它正做着她想要做的事,她只是诚实地被堆空间不足所困扰。但我们不确定。我真的不知道我认为还有其他问题——如果用户的代码库内存使用率很高,他们现在就知道如何增加虚拟内存了(而且,我严重怀疑他们是否会选择BlueJ作为IDE)@Makoto我已经更新了我的答案,以反映您的担忧-谢谢这更多的是掩盖问题,而不是实际解决问题。没有代码的上下文,我们不能说这是最终的答案。也许他的程序使用了大量内存。所以试着用更高的ram运行java应该可以解决问题。而且“如果没有代码的上下文,我们就不能说这是最终的答案。”“我们?只有你我的论点很简单:我们不知道是什么导致了高内存使用率。是的,你的修复解决了眼前的问题,但这并不意味着它不会在以后出现。这也不意味着我们已经正式“解决”问题也是如此。仅仅因为它可以这样解决并不意味着它是合适的,特别是当我们还没有看到高内存使用率的实际原因时。他的应用程序确实需要高内存才能运行,所以我们只能允许应用程序有更多的ram。