Увеличение пространства кучи в Eclipse: (java.lang.OutOfMemoryError) - PullRequest
48 голосов
/ 22 декабря 2011
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)

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

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

Ответы [ 13 ]

148 голосов
/ 22 декабря 2011

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

-Xms512M -Xmx1524M

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

39 голосов
/ 22 декабря 2011

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

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

или любые значения, которые вы хотите.

7 голосов
/ 22 декабря 2011

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

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

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

5 голосов
/ 22 декабря 2011

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

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

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

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

2 голосов
/ 18 декабря 2016

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

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

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

1 голос
/ 30 декабря 2017

В файле eclipse.ini введите следующие данные

-Xms512m

-Xmx2048m

-XX: MaxPermSize = 1024M

1 голос
/ 22 декабря 2011

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

См. эту ссылку .

eclipse -vmargs -Xmx1024m

Редактировать: См. Также см. Этот превосходный вопрос

1 голос
/ 22 декабря 2011

Чтобы увеличить размер кучи в eclipse, измените файл eclipse.ini.

см.

http://wiki.eclipse.org/FAQ_How_do_I_increase_the_heap_size_available_to_Eclipse%3F

0 голосов
/ 06 апреля 2018

Иногда исключение не остановится после увеличения памяти в файле eclipse ini. тогда попробуйте ниже вариант

Перейдите в Окно >> Настройки >> MyEclipse >> Java Enterprise Project >> Веб-проект >> Вкладка «Развертывание» Под -> Под политиками развертывания библиотек UnCheck -> Jars из пользовательских библиотек

0 голосов
/ 08 ноября 2016

Перейдите в «Окно -> Параметры -> Общие -> C / C ++ -> Анализ кода» и отключите «Ошибки синтаксиса и семантики -> Не удается создать экземпляр абстрактного класса»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...