Увеличение пространства кучи в 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 ]

0 голосов
/ 20 мая 2015

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

-Xms512M -Xmx1524M

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

0 голосов
/ 27 марта 2014

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

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

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

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

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

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