java.lang.OutOfMemoryError: GC overhead limit exceeded

Ich bin immer diese Fehler in einem Programm erstellt mehrere (Hunderte, Tausende) HashMap-Objekte mit ein paar (15-20) text-Einträge jeder. Diese Saiten haben alle gesammelt werden (ohne zu brechen in kleinere Mengen), bevor die übergabe an eine Datenbank.

Laut Sun, der Fehler passiert ", wenn zu viel Zeit aufgewendet wird für garbage collection: wenn mehr als 98% der gesamten Zeit in der garbage collection und weniger als 2% der heap wiederhergestellt wird, wird ein OutOfMemoryError geworfen wird.".

Offenbar, man könnte die Befehlszeile verwenden, um Argumente an die JVM für

  • Erhöhung der heap-Größe über "-Xmx1024m" (oder mehr), oder
  • Deaktivieren Sie den Fehler überprüfen insgesamt, über die "-XX:-UseGCOverheadLimit".

Den ersten Ansatz funktioniert gut, die zweite landet in einem anderen java.lang.Fehler wegen ungenügenden Speicherplatzes, dieses mal über den Haufen.

So, Frage: gibt es eine programmatische alternative zu dieser, für den jeweiligen Anwendungsfall (D. H., mehrere kleine HashMap-Objekte)? Wenn ich die HashMap clear () - Methode, zum Beispiel, das problem geht Weg, aber so zu tun, die gespeicherten Daten in der HashMap! 🙂

Stellt sich auch die Frage diskutiert, in einem Verwandtes Thema in StackOverflow.

Möglicherweise müssen Sie ändern Ihren Algorithmus und verwenden Sie einige weitere effiziente Datenstruktur. Können Sie uns sagen, welchen Algorithmus Ihr versuchen zu implementieren, die erfordert, dass ein großer Betrag von HashMaps?
Ich bin gerade beim Lesen sehr große Dateien (Hunderte von tausenden von Zeilen), über die ich keine Kontrolle haben, D. H. Sie können nicht abgebaut werden. Für jede Zeile text, eine HashMap aufgebaut ist, enthält ein paar (eigentlich um 10) kleine String-Werte, unter Verwendung der gleichen Datenbank-Feld-Namen, wieder und wieder. Im Idealfall würde ich mag in der Lage sein, um die gesamte Datei zu Lesen vor dem senden der Daten an die Datenbank.
Es klingt wie das Lesen der gesamten Datei vor dem senden der Daten an die Datenbank ist wirklich schlechte Lösung... in der Tat, es funktioniert überhaupt nicht, innerhalb der sehr wirklich Constraints auf den verfügbaren Speicher. Warum willst du das überhaupt? Was meinst du mit "mit der gleichen Datenbank-Feldnamen wieder und wieder"? Feld-Namen als Schlüssel oder Werte? Wenn Sie die Felder Schlüssel, dann nutzen Sie einfach die arrays, in denen das Feld ist IMPLIZIERT, indem es die position... und ob die Werte dann intern, bevor Sie Sie hinzufügen, um die Karten. Es würde helfen zu wissen, was die Daten sind. Cheers. Keith.
Sie sind die Schlüssel mit einem Konstanten Wert. Intern scheint zu helfen, danke.

InformationsquelleAutor PNS | 2011-04-30

Schreibe einen Kommentar