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.
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie im wesentlichen ausgeführt, aus dem Speicher führen Sie den Prozess reibungslos. Optionen, die in den Sinn kommen:
-Xmx512m
erstenHashMap
Objekte zu verarbeiten, wenn möglich- String.intern()
auf Sie, bevor er Sie in dieHashMap
HashMap(int initialCapacity, float loadFactor)
Konstruktor Melodie für Ihren FallWenn es funktioniert, mit mehr Speicher gibt es einen Grund, nicht zu gehen? Es wird eigentlich nur wachsen so groß wie nötig, bis zu Ihrem maximum, wenn Sie so etwas wie
-Xms128m -Xmx1024m
. Scheint die einfachste option.Ja, und ich Schätze, die Schnellste. Ich verwendet intern() für einige wahrscheinlich wiederholte Werte und das problem ging Weg, zu.
Verwenden von string -
intern
Methode hat immer eine sehr schlechte Idee. Da String-pool hat eine Feste Größe und kann nicht wachsen, zur Laufzeit, wenn es erforderlich ist. JVM-enginner, Aleksey Shipilev hat auch einen Vortrag zu diesem Thema ("Java.lang.String Katechismus").InformationsquelleAutor WhiteFang34
Folgende für mich gearbeitet. Fügen Sie einfach die folgenden snippet:
Ihrem
build.gradle
:Ich Tat dies, und ich bin noch immer running out of heap space. Android Studio 2.2.3.
was ist Ihre gradle-version ?
Dies ist keine android-Frage, also warum wurde das hier gepostet?
InformationsquelleAutor Mina Fawzy
@takrl: Die Standardeinstellung für diese option ist:
was bedeutet, dass diese option standardmäßig nicht aktiv ist. Also, wenn Sie sagen, Sie verwendet die option
"
+XX:UseConcMarkSweepGC
"Ich nehme an, Sie konnten mit dieser syntax:
was bedeutet, dass Sie ausdrücklich, diese option zu aktivieren.
Für die korrekte syntax und Standard-Einstellungen von
Java HotSpot VM Options
@ dieseDokument
InformationsquelleAutor qupera
Für die Aufnahme, wir hatten das gleiche problem heute. Haben wir festen, durch die Verwendung dieser option:
Anscheinend geändert, die Strategie für die garbage collection, die das Problem verschwinden.
InformationsquelleAutor takrl
Ähmm... Sie müssen:
Komplett überdenken Ihre algorithmen & Datenstrukturen, so dass es nicht ' T brauchen alle diese kleinen HashMaps.
Erstellen Sie eine Fassade, die ermöglicht es Ihnen Seite diese HashMaps in-und-out-Speicher erforderlich. Eine einfache LRU-cache vielleicht genau das richtige sein.
Bis der verfügbare Speicher der JVM. Wenn nötig, sogar den Kauf mehr RAM könnte der Schnellste, BILLIGSTE Lösung, wenn Sie die Führung der Maschine, dass die Gastgeber dieses Tier. Having said that: ich bin generell kein fan von "throw hardware at it" - Lösungen, vor allem, wenn eine alternative Algorithmische Lösung gedacht werden kann, in einem angemessenen Zeitrahmen. Wenn Sie halten werfen mehr hardware jedes eins von diesen Probleme Sie bald in das Gesetz des abnehmenden Ertrags.
Was Sie tatsächlich versuchen zu tun, eh? Ich vermute, es gibt einen besseren Ansatz, um Ihre eigentliche problem sein.
InformationsquelleAutor corlettk
Alternative HashMap-Implementierung (Fundgrube). Standard-Java-HashMap hat >12x Speicher-overhead.
Eine können Lesen details hier.
InformationsquelleAutor dir
Speichern nicht die gesamte Struktur im Speicher, während des Wartens auf das Ende.
Schreiben Sie die vorläufigen Ergebnisse in eine temporäre Tabelle in der Datenbank anstelle von hashmaps - funktional, eine Datenbank-Tabelle ist das äquivalent einer hashmap, d.h. beide unterstützen den verschlüsselten Zugriff auf Daten, aber die Tabelle ist nicht Speicher gebunden werden, so dass die Verwendung einer indizierten Tabelle hier eher als die hashmaps.
Wenn es richtig gemacht, Ihr Algorithmus sollte nicht einmal bemerken die Veränderung - korrekt bedeutet hier, verwenden Sie eine Klasse zum darstellen der Tabelle, auch gibt es eine put(key, value) und get(key) Methode genauso wie eine hashmap.
Wenn das intermediate-Tabelle abgeschlossen ist, generiert die erforderlichen sql-Anweisung(en) aus, anstatt aus dem Arbeitsspeicher.
InformationsquelleAutor Rodney P. Barbati
Den parallelen Kollektor wirft einen
OutOfMemoryError
wenn zu viel Zeit ist seiend ausgegeben für garbage collection. Insbesondere, wenn mehr als 98% der gesamten Zeit in der garbage collection und weniger als 2% der heap wiederhergestellt wird, wirdOutOfMemoryError
geworfen werden. Dieses feature wurde entwickelt, um zu verhindern, dass Anwendungen aus, die für einen längeren Zeitraum während der Herstellung wenig oder gar keine Fortschritte, weil der heap zu klein ist. Wenn erforderlich, kann diese Funktion deaktiviert werden, indem die option-XX:-UseGCOverheadLimit
auf der Kommandozeile.InformationsquelleAutor user3405305
Wenn Sie Hunderte von tausenden von hash-maps, verwenden Sie wahrscheinlich weit mehr, als Sie eigentlich benötigen; es sei denn Sie arbeiten mit großen Dateien oder Grafiken, die Speicherung von einfachen Daten-sollte nicht überlaufen-das Java-memory-limit.
Sollten Sie versuchen, und überdenken Sie Ihren Algorithmus. In diesem Fall würde ich bieten mehr Hilfe zu diesem Thema, aber ich kann nicht geben keine Informationen, bis Sie mehr über den Kontext des Problems.
InformationsquelleAutor RétroX
Wenn Sie java8, und Sie können die G1 Garbage Collector, dann führen Sie Ihre Anwendung mit:
Dieser erzählt die G1 zu finden, die ähnliche Zeichenfolgen und zu halten nur einer von Ihnen in Erinnerung, und die anderen sind nur ein Zeiger auf die Zeichenkette im Speicher.
Dies ist nützlich, wenn Sie eine Menge von wiederholten Zeichenfolgen. Diese Lösung kann oder nicht arbeiten und hängt von der jeweiligen Anwendung.
Mehr info auf:
https://blog.codecentric.de/en/2014/08/string-deduplication-new-feature-java-8-update-20-2/
http://java-performance.info/java-string-deduplication/
Ihre willkommen, halten Sie ein Auge auf die CPU-Nutzung, da die G1-GC ist ein wenig anspruchsvoller.
InformationsquelleAutor George C
Behebung von Speicher-Lecks in Ihrer Anwendung mit Hilfe von Profil-tools wie eclipse MAT oder VisualVM
Mit
JDK 1.7.x
oder höher, verwenden SieG1GC
, die verbringt 10% auf die garbage collection im Gegensatz zu 2% in andere GC-algorithmen.Abgesehen von der Einstellung der heap-Speicher mit
-Xms1g -Xmx2g
, versuchen Sie `Haben Sie einen Blick auf oracle Artikel für die Feinabstimmung dieser Parameter.
Einige Fragen zu G1GC in SE:
Java 7 (JDK 7) Müll-Sammlung und Dokumentation auf dem G1
Java G1 garbage collection in der Produktion
Agressive garbage collector Strategie
InformationsquelleAutor Ravindra babu
Im Falle des Fehlers:
erhöhen des java-heap-Speicher bis zu 2 GB, d.h.,
-Xmx2g.
InformationsquelleAutor bpb
Müssen Sie erhöhen Sie die Größe des Arbeitsspeichers in Jdeveloper gehen setDomainEnv.cmd.
InformationsquelleAutor shashi
Nutzen Sie HIERFÜR folgenden code in Ihrer app gradle-Datei unter android-Verschluss.
dexOptions {
javaMaxHeapSize "4g"
}
InformationsquelleAutor Abhinandan Chada
Für meinen Fall die Erhöhung der Speicher mit
-Xmx
option war die Lösung.Hatte ich einen 10g-Datei Lesen im java-und jedes mal bekam ich die gleiche Fehlermeldung. Dies passierte, wenn der Wert in der
RES
Spalte intop
Befehl erreicht den eingestellten Wert -Xmx option. Dann durch eine Erhöhung der Speicher mit-Xmx
option alles ging gut.Gab es einen weiteren Punkt. Wenn ich
JAVA_OPTS
oderCATALINA_OPTS
in meinem Benutzer-Konto und erhöht die Menge der Speicher wieder bekam ich die gleiche Fehlermeldung. Dann druckte ich den Wert dieser environment-Variablen in meinem code, die mir andere Werte, als was ich gesetzt. Der Grund war, dass Tomcat war die Wurzel für die Prozess-und dann, wie ich war nicht eine su-Macher, fragte ich den admin zu erhöhen, die Speicher incatalina.sh
im Tomcat.InformationsquelleAutor M. Mashaye
Dies hat mir geholfen, um loszuwerden, diese Fehler.Diese option deaktiviert
-XX:+DisableExplicitGC
InformationsquelleAutor kanaparthikiran