2013-11-15 4 views
0

Я написал программу Java в Bluej и запустил ее для небольших значений (100000). Но для большей границы (1000000) я получаю java.lang.OutOfMemoryError: Java heap space. Как я могу решить это в Bluej? Заранее спасибо.Bluej OutOfMemoryError

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"); 
    } 
} 
+1

Мы не знаем, какой код вы используете, чтобы рассказать вам, как исправить его, чтобы начать ... можете ли вы предоставить код, чтобы мы могли спросить: «Что вы делаете с этим фрагментом?» – Makoto

+0

При задании вопросов предоставьте конкретный пример того, что вы пытаетесь достичь, а также то, что вы делали в настоящее время. В текущем состоянии на ваш вопрос нельзя ответить и может быть закрыт. Чтобы узнать больше о том, как задавать большие вопросы, см. «Как спросить» http://stackoverflow.com/questions/how-to-ask – Damodaran

+0

, так как это общественный спрос, пожалуйста, разместите часть своего кода –

ответ

0

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

ОС Windows: использовать свойство bluej.windows.vm.args в bluej.defs

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

Update

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

Update Вы код выглядит OK

+0

Нет. Что-то * else * неверно. Что-то гораздо глубже. Что-то, что требует просмотра кода. – Makoto

+0

@ Makoto Я не пытаюсь угадать код OP. Возможно, он делает именно то, чего хочет, и она честно просто обеспокоена отсутствием кучи пространства. –

+0

Но мы не знаем этого наверняка. Я действительно считаю, что что-то еще не так - если бы это был пользователь с кодовой базой с высоким объемом использования памяти, они уже знали бы, как увеличить виртуальную память (и, я бы * серьезно сомневаюсь, что они будут использовать BlueJ как их IDE выбора). – Makoto

-1

попробовать запустить Java с более высокой оперативной памятью с помощью команд Windows, процессор с

javaw -Xmx2048 -Xms1024 -jar your_jar_file_name.jar

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

+0

Это больше маскирует проблему, чем ее исправляет.Без контекста кода мы не можем сказать или не сказать, что это окончательный ответ. – Makoto

+0

Возможно, его программа использует тонну памяти. Поэтому попробуйте запустить java с более высоким RAM, чтобы исправить это. А также «Без контекста кода, _we_ не может сказать или не сказать, что это окончательный ответ. - Макото» мы? это только YOU – Jeremy

+0

Мои аргументы просты: мы * не знаем *, что вызывает высокую память. Да, ваше исправление заботится о ** немедленной ** боли, но это не значит, что оно не будет появляться позже по дороге. Это также не означает, что мы формально «решили» проблему. Просто потому, что это можно решить, как это не значит, что это уместно ***, особенно ***, когда мы не видели фактической ** причины использования высокой памяти. – Makoto

0

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

bluej.vm.args = -Xmx2G или любое количество

примечания^окон не существует

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