2017-10-28 2 views
0

Nach viel Mühe ich nicht, das Problem zu überwinden, sich einen GrenzwertVermeiden „GC Obergrenze überschritten“ Fehler

GC Kopf scheinen überschritten

Fehler in meinem Java-Programm.

Es tritt innerhalb einer großen Methode auf, die große Zeichenfolgenmanipulation, viele Listen von Objekten und Zugriff auf DB enthält. Ich habe folgendes versucht:

  1. nach der Verwendung der einzelnen Arraylist, habe ich hinzugefügt: list = new Arraylist <>(); Liste = null;
  2. für die Strings, anstatt z.B. 50 hängt an (str + = "....") Ich versuche einen mit dem gesamten Text anzufügen
  3. nach jedem DB-Zugriff schließe ich die Anweisungen und die resultSets.

Diese Methode wird von der Haupt wie folgt aufgerufen:

for(int i=0; i<L; i++) { 
    cns = new Console(i); 

    cns.processData();//this is the method 

    cns=null; 
} 

Wenn diese Schleife 1 oder 2 mal ausgeführt wird, ist alles ok. Für L> = 3 ist es fast sicher, dass ich den Garbage Collector Fehler bekommen werde.

Sollte nicht die Tatsache, dass ich eine cns = null nach jeder Ausführung der Methode, den GC zwingen und alles von der vorherigen Ausführung frei?

Sollte ich auch alle privaten Attribute des Objekts löschen, bevor Sie es auf null setzen? Vielleicht könnte ein Thread.sleep() den GC nach jeder Schleife erzwingen?

+0

Wahrscheinlich Sie dritten Lauf belegt zu viel Speicher. Ich würde vorschlagen, Ihre große Methode in kleinere aufzuteilen. GC manuell aufrufen und Thread.spleep ist ein falscher Ansatz. – Admit

Antwort

0

Es gibt eigentlich keinen Grund, cns am Ende jeder Schleife auf Null zu setzen. Sie setzen es am Anfang der Schleife sowieso auf new Console() - wenn etwas durch das Setzen auf null freigegeben werden könnte, wird es auch freigegeben, indem es auf ein neues Objekt gesetzt wird.

Sie können einen Anruf System.gc(); versuchen, das System eine Garbage Collection vorschlagen, aber ich weiß nicht, ob das Ihnen helfen oder es noch schlimmer machen würde. Das System versucht bereits, Garbage Collection durchzuführen. Wenn dies nicht der Fall ist, wird dieser Fehler nicht angezeigt.

Sie zeigen uns nicht genau, wie Sie Ihre Strings bauen, aber bedenken Sie, dass += nicht der einzige Täter ist. Wenn Sie etwas wie String s = "Hello " + "to the" + " world"; haben, ist das genauso schlimm, als wenn Sie das auf drei Zeilen setzen und += verwenden. Wenn es ein Problem ist, kann StringBuilder Ihr Freund sein.

Sie können die Antworten unter Error java.lang.OutOfMemoryError: GC overhead limit exceeded für einige andere Vorschläge zur Vermeidung dieses Fehlers lesen. Es scheint, dass es für einige Leute ausgelöst wird, wenn Sie fast, aber nicht ganz, aus dem Speicher sind. Eine Erhöhung der für Java verfügbaren Speicherkapazität kann (oder auch nicht) helfen.

+0

Danke für Ihre Antwort. Der StringBuilder-Tipp hat mir geholfen. Auch auf der DB-Seite.Abgesehen davon, dass die Anweisung und das ResultSet nach jeder Anweisung geschlossen werden, ist es eine gute Übung, die Verbindung auch einmal zu schließen? Würde das Speicher sparen? – hragber

+0

Möglicherweise wird eine kleine Menge Speicher gespart. Wenn Sie jedoch keine wichtige Verarbeitung durchführen oder auf Benutzereingaben zwischen Datenbankaufrufen warten, lohnt es sich möglicherweise nicht. Wenn Sie weiterhin Verbindungen schließen und neue Verbindungen erstellen, bedeutet das nur mehr Garbage Collection. –

Verwandte Themen