Bluej OutOfMemoryError

Я написал java-программу в Bluej и запускал ее для небольших значений (100000). Но для большей границы (1000000) я получаю java.lang.OutOfMemoryError: Java heap space. Как я могу решить это в 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)
 {
 ****** 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);
 ****** end = System.currentTimeMillis();
 System.out.println("Time elapsed : "+(end-start)/1000d+" seconds");
 }
}
3 ответа

Я знаю, что это очень старый, но нет правильного ответа в файл bluej.defs и добавьте

bluej.vm.args = -Xmx2G или любая сумма

примечание ^ окна нет

также вам может потребоваться изменить JVM, который использует bluej, потому что по умолчанию 32 бит, что может вызвать некоторые проблемы, вы можете сделать это, переименовав папку jdk в папку bluej в jdk-32 или что-нибудь еще, чтобы он спросил вас, что jdk вы хотите использовать при запуске, выберите 64-битный


Согласно странице http://www.bluej.org/help/faq.html#jvmargs

Windows: используйте свойство bluej.windows.vm.args в файле bluej.defs

Linux/Unix/эквивалент: отредактируйте сценарий оболочки "bluej", который создается установщиком (в каталоге, где вы установили BlueJ), и измените последнюю строку (которая запускает BlueJ).

Обновить

Как отметил Макато, эта проблема, с которой вы сталкиваетесь, указывает на то, что потенциально что-то не так с вашей программой, поскольку она, похоже, не эффективно использует память. Отправьте фрагмент.

Обновить Код выглядит нормально


попробуйте запустить java с более высоким ram с помощью команд Windows Commors с

javaw -Xmx2048 -Xms1024 -jar your_jar_file_name.jar

Таким образом, в основном, xmx - это ваша максимальная RAM, которую вы выделяете, а ваш xms - это минимальный xms который он должен использовать.

licensed under cc by-sa 3.0 with attribution.