Подтвердить что ты не робот

Увеличение пространства кучи в Eclipse: (java.lang.OutOfMemoryError)

try {
    // CompareRecord record = new CompareRecord();
    Connection conn = new CompareRecord().getConection("eliteddaprd","eliteddaprd","192.168.14.104","1521");
    ResultSet res = null;

    if (conn != null){
        Statement stmt = conn.createStatement();
        res = stmt.executeQuery("select rowindx,ADDRLINE1 from dedupinitial order by rowindx");
    }

    Map<Integer,String> adddressMap = new LinkedHashMap<Integer, String>();
    if (res != null){
        System.out.println("result set is not null ");
        while(res.next()){
            adddressMap.put(res.getInt(1),res.getString(2));
        }
    }

    System.out.println("address Map size =========> "+adddressMap.size());
    Iterator it = adddressMap.entrySet().iterator();
    int count = 0;
    int min = 0;

    while (it.hasNext()){
        Map.Entry pairs = (Map.Entry)it.next();
        Pattern p = Pattern.compile("[,\\s]+");
        Integer outerkey = (Integer)pairs.getKey();
        String outerValue = (String)pairs.getValue();
        //System.out.println("outer Value ======> "+outerValue);

        String[] outerresult = p.split(outerValue);
        Map.Entry pairs2 = null;
        count++;
        List<Integer> dupList = new ArrayList<Integer>();

        Iterator innerit = adddressMap.entrySet().iterator();
        boolean first = true;

        while (innerit.hasNext()){
            //System.out.println("count value ===> "+count);
            int totmatch = 0;
            if(first){
                if(count == adddressMap.size()){
                    break;
                }
                for(int i=0;i<=count;i++){
                    pairs2 = (Map.Entry)innerit.next();
                }
                first  = false;
            }
            else{
                pairs2 = (Map.Entry)innerit.next();
            }
            Integer innterKey = (Integer)pairs2.getKey();
            String innerValue = (String)pairs2.getValue();
            //System.out.println("innrer value "+innerValue);
            String[] innerresult = p.split(innerValue);

            for(int j=0;j<outerresult.length;j++){
                for(int k=0;k<innerresult.length;k++){
                    if(outerresult[j].equalsIgnoreCase(innerresult[k])){
                        //System.out.println(outerresult[j]+" Match With "+innerresult[k]);
                        totmatch++;
                        break;
                    }
                }
            }

            min = Math.min(outerresult.length, innerresult.length);
            if(min != 0 && ((totmatch*100)/min) > 50) {
                //System.out.println("maching inner key =========> "+innterKey);
                dupList.add(innterKey);
            }
        }
        //System.out.println("Duplilcate List Sisze ===================> "+dupList.size()+"   "+outerkey);
    }

    System.out.println("End  =========> "+new Date());
}
catch (Exception e) {
    e.printStackTrace();
}

Здесь ResultSet обработал около 500000 записей, но это даст мне ошибку, например:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.HashMap.resize(HashMap.java:508)
    at java.util.LinkedHashMap.addEntry(LinkedHashMap.java:406)
    at java.util.HashMap.put(HashMap.java:431)
    at spite.CompareRecord.main(CompareRecord.java:91)

Я знаю, что эта ошибка возникает из-за памяти VM, но не знаете, как ее увеличить в Eclipse?

Что мне делать, если мне нужно обработать еще более 500 000 записей?

4b9b3361

Ответ 1

В Run- > Run Configuration найдите Имя класса, в котором вы были запущены, выберите его, перейдите на вкладку "Аргументы", затем добавьте:

-Xms512M -Xmx1524M

в раздел "Аргументы VM"

Ответ 2

В папке загрузки Eclipse введите записи в файле eclipse.ini:

--launcher.XXMaxPermSize
512M
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms512m
-Xmx1024m

или какие значения вы хотите.

Ответ 3

См. http://blog.headius.com/2009/01/my-favorite-hotspot-jvm-flags.html

-Xms и -Xmx задают минимальный и максимальный размеры для кучи. В качестве функции Hotspot помещает кепку в размер кучи, чтобы предотвратить ее выдувание вашей системы. Таким образом, как только вы выясните максимальную память, которую требуется вашему приложению, вы закрываете ее, чтобы код изгоев не влиял на другие приложения. Используйте эти флаги как -Xmx512M, где M означает MB. Если вы не включаете его, вы указываете байты. В этом формате используется несколько флагов. Вы также можете получить незначительный начальный прирост, установив минимальный уровень выше, так как ему не нужно сразу увеличивать кучу.

-XX: MaxPermSize = ### M устанавливает максимальный размер "постоянного поколения". Точка доступа необычна тем, что несколько типов данных сохраняются в "постоянном поколении", отдельной области кучи, которая редко (или никогда) не собиралась с мусором. Список данных, размещенных в пермин-гене, немного нечеткий, но обычно он содержит такие вещи, как метаданные класса, байт-код, интернированные строки и т.д. (И это, безусловно, зависит от версий Hotspot). Поскольку это поколение редко или никогда не собирается, вам может потребоваться увеличить его размер (или включить свинг-генератор с парами других флагов). В JRuby специально мы генерируем много байт-кода адаптера, который обычно требует большего пространства perm gen.

Ответ 4

Как предоставить вашей программе больше памяти при работе с Eclipse

Перейдите в Run/Run Configurations. Выберите конфигурацию запуска для вашей программы. Нажмите на вкладку "Аргументы". В области "Параметры программы" добавьте аргумент -Xmx, например -Xmx2048m, чтобы дать вашей программе макс. памяти объемом 2048 МБ (2 ГБ).

Как предотвратить эту проблему с памятью

Перезапишите свою программу таким образом, чтобы не хранить столько памяти в памяти. Я не смотрел ваш код подробно, но похоже, что вы храните много данных в HashMap; больше, чем подходит в памяти, когда у вас много записей.

Ответ 6

Вы можете увеличить размер памяти с помощью аргументов командной строки.

Смотрите эту ссылку.

eclipse -vmargs -Xmx1024m

Изменить: см. также этот отличный вопрос

Ответ 7

Возможно, вы захотите закрыть открытые проекты в Project Explorer. Вы можете сделать это, щелкнув правой кнопкой мыши открытый проект и выбрав "Закрыть проект".

Это то, что сработало для меня после того, как я заметил, что мне пришлось периодически увеличивать размер кучи в my_directory\eclipse\eclipse.ini.

Надеюсь, это поможет! Мир!

Ответ 8

Что делать, если мне нужно обработать еще более 500 000 записей?

Есть несколько способов увеличить размер кучи java для вашего приложения, которое несколько уже предложили. Ваше приложение должно удалить элементы из вашего adddressMap, так как ваше приложение добавит в него новый элемент, и вы не столкнетесь с oom, если появится больше записей. Посмотрите на производителя-потребителя, если вы заинтересованы.

Ответ 9

Я не профессионал в Java, но ваша проблема может быть решена с помощью "blockingqueue", если вы используете его с умом.

Попробуйте сначала извлечь фрагмент записей, обработать их и выполнить итерацию процесса до завершения обработки. Это может помочь вам избавиться от OutOfMemory Exceptions.

Ответ 10

В Eclipse goto Run- > Run Configuration найдите Имя класса, в котором вы были запущены, выберите его, нажмите вкладку Target, затем в "Дополнительные параметры командной строки эмулятора" add:

-Xms512M -Xmx1524M

затем нажмите "Применить".

Ответ 11

Перейдите в "Окно → Настройки → Общие → C/С++ → Анализ кода" и отключить "Синтаксис и ошибки семантики → Абстрактный класс не может быть создан"

Ответ 12

В файле eclipse.ini сделайте следующие записи

-Xms512m

-Xmx2048m

-XX: MaxPermSize = 1024M