it-swarm.com.de

Heap-Speicherplatz in Eclipse vergrößern: (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();
}

Hier hat ResultSet ungefähr 500000 Datensätze verarbeitet, aber es wird eine Fehlermeldung angezeigt:

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)

Ich weiß, dass dieser Fehler auf VM Arbeitsspeicher zurückzuführen ist, weiß jedoch nicht, wie er in Eclipse erhöht werden kann.

Was mache ich, wenn ich mehr als 500.000 Datensätze bearbeiten muss?

46
chetan

Suchen Sie in Run-> Run Configuration den Namen der Klasse, die Sie ausgeführt haben, wählen Sie sie aus, klicken Sie auf die Registerkarte Argumente und fügen Sie Folgendes hinzu:

-Xms512M -Xmx1524M

zum Abschnitt VM Argumente 

146
Paul Jowett

Nehmen Sie im Eclipse-Downloadordner die Einträge in der Eclipse.ini-Datei vor:

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

oder was auch immer Werte Sie wollen.

37
Swagatika

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

-Xms und -Xmx legen die minimalen und maximalen Größen für den Heap fest. Hotspot ist eine Funktion, die die Größe des Heap-Speichers begrenzt, um zu verhindern, dass Ihr System durchgebrannt wird. Wenn Sie also herausgefunden haben, wie viel Speicher Ihre App maximal benötigt, beschränken Sie sie darauf, um zu verhindern, dass schädlicher Code andere Apps beeinflusst. Verwenden Sie diese Flags wie -Xmx512M, wobei M für MB steht. Wenn Sie es nicht angeben, geben Sie Bytes an. Mehrere Flags verwenden dieses Format. Sie können auch einen geringfügigen Startup-Perf-Boost erzielen, indem Sie minimum höher setzen, da der Heap nicht sofort vergrößert werden muss.

-XX: MaxPermSize = ### M legt die maximale Größe der "permanenten Generierung" fest. Hotspot ist ungewöhnlich, da verschiedene Datentypen in der "permanenten Generierung" gespeichert werden, einem separaten Bereich des Heapspeichers, der nur selten (oder nie) mit dem Müll gesammelt wird. Die Liste der von Perm-Gen gehosteten Daten ist ein wenig unscharf, enthält jedoch im Allgemeinen Dinge wie Klassenmetadaten, Bytecode, interne Zeichenfolgen usw. (und dies ist bei den Hotspot-Versionen durchaus unterschiedlich). Da diese Generation selten oder nie gesammelt wird, müssen Sie möglicherweise ihre Größe erhöhen (oder das Perm-Gen-Sweeping mit ein paar anderen Flags aktivieren). Vor allem in JRuby generieren wir eine Menge Adapter-Bytecode, der normalerweise mehr Speicherplatz benötigt.

7
RockyJ

So geben Sie Ihrem Programm mehr Speicher, wenn Sie es von Eclipse ausführen

Gehen Sie zu Konfigurationen ausführen/ausführen. Wählen Sie die Laufkonfiguration für Ihr Programm. Klicken Sie auf die Registerkarte "Argumente". Fügen Sie im Bereich "Programmargumente" ein -Xmx-Argument hinzu, beispielsweise -Xmx2048m, um Ihrem Programm eine max. von 2048 MB (2 GB) Arbeitsspeicher.

So vermeiden Sie dieses Speicherproblem

Schreiben Sie Ihr Programm so um, dass nicht so viele Daten im Speicher abgelegt werden müssen. Ich habe Ihren Code nicht im Detail betrachtet, aber es sieht so aus, als würden Sie viele Daten in einer HashMap speichern. mehr als in den Speicher passt, wenn Sie viele Datensätze haben.

5
Jesper

Sie möchten möglicherweise geöffnete Projekte in Ihrem Projektexplorer schließen. Sie können dies tun, indem Sie mit der rechten Maustaste auf ein geöffnetes Projekt klicken und "Projekt schließen" auswählen. 

Dies funktionierte für mich, nachdem ich bemerkt hatte, dass ich die Heap-Größe in meinem Verzeichnis\Eclipse\eclipse.ini regelmäßig erhöhen musste.

Hoffe das hilft! Frieden!

2
masarapmabuhay

Nehmen Sie in der Datei Eclipse.ini folgende Einträge vor

-Xms512m

-Xmx2048m

-XX: MaxPermSize = 1024m

1
Sahi R. Repswal

Um die Heap-Größe in Eclipse zu erhöhen, ändern Sie die Datei Eclipse.ini.

beziehen auf 

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

1
Rajesh Pantula

Sie können den Speicher durch die Verwendung von Befehlszeilenargumenten vergrößern. 

Siehe diesen Link .

Eclipse -vmargs -Xmx1024m

Edit: Siehe auch siehe diese ausgezeichnete Frage

1
Fredrik

Gehen Sie zu "Fenster -> Einstellungen -> Allgemein -> C/C++ -> Code-Analyse" Und deaktivieren Sie "Syntax- und Semantikfehler -> Abstrakte Klasse kann nicht instanziiert werden"

Ich bin kein Profi in Java, aber Ihr Problem kann durch "Sperren" gelöst werden, wenn Sie es sinnvoll einsetzen. 

Versuchen Sie, zunächst einen Teil der Datensätze abzurufen, zu verarbeiten und den Vorgang so lange zu wiederholen, bis Sie Ihre Verarbeitung abgeschlossen haben. Dies kann Ihnen helfen, den OutOfMemory Exceptions loszuwerden.

0
sunil dhunde

Suchen Sie in Eclipse unter Run-> Run Configuration nach dem Namen der Klasse, die Sie ausgeführt haben.

-Xms512M -Xmx1524M

klicken Sie dann auf Übernehmen.

0

Was tun, wenn ich mehr als 500000 Datensätze verarbeiten muss?

Es gibt mehrere Möglichkeiten, die Java-Heap-Größe für Ihre App zu erhöhen, für die bereits einige vorgeschlagen wurden. Ihre App muss die Elemente aus Ihrer adddressMap entfernen, da Ihre App ein neues Element hinzufügt. Sie werden also nicht auf oom treffen, wenn weitere Datensätze eingehen.

0
Jasonw

Manchmal wird die Ausnahme nicht angehalten, nachdem Sie den Speicher in der Eclipse-INI-Datei erhöht haben. Dann versuchen Sie es unten

Gehen Sie zu Fenster >> Einstellungen >> MyEclipse >> Java Enterprise-Projekt >> Webprojekt >> Registerkarte "Bereitstellung" Unter -> Unter Richtlinien für die Bibliotheksbereitstellung Unchecken -> Jars aus Benutzerbibliotheken

0