Ich erhalte diese Fehlermeldung, wenn ich meine JUnit-Tests ausführe:
java.lang.OutOfMemoryError: GC overhead limit exceeded
Ich weiß, was ein OutOfMemoryError
ist, aber was bedeutet GC-Overhead-Limit? Wie kann ich das lösen?
java
garbage-collection
out-of-memory
heap-memory
Mnementh
quelle
quelle
OutOfMemoryError
Szenarien gibt, für die das Erhöhen des Heapspeichers keine gültige Lösung ist: Es gibt zwei Beispiele dafür, dass keine nativen Threads mehr vorhanden sind und keine Perm-Gene mehr vorhanden sind (die vom Heap getrennt sind). Seien Sie vorsichtig, wenn Sie zu breite Aussagen über machenOutOfMemoryErrors
; Es gibt eine unerwartet vielfältige Reihe von Dingen, die sie verursachen können.Antworten:
Diese Meldung bedeutet, dass der Garbage Collector aus irgendeinem Grund übermäßig viel Zeit in Anspruch nimmt (standardmäßig 98% der gesamten CPU-Zeit des Prozesses) und bei jedem Lauf nur sehr wenig Speicher wiederherstellt (standardmäßig 2% des Heapspeichers).
Dies bedeutet effektiv, dass Ihr Programm keine Fortschritte mehr macht und immer nur die Garbage Collection ausführt.
Um zu verhindern, dass Ihre Anwendung die CPU-Zeit aufnimmt, ohne dass etwas erledigt wird, löst die JVM dies aus,
Error
damit Sie die Möglichkeit haben, das Problem zu diagnostizieren.Die seltenen Fälle, in denen ich dies gesehen habe, sind Fälle, in denen Code Tonnen von temporären Objekten und Tonnen von Objekten mit schwachen Referenzen in einer bereits sehr speicherbeschränkten Umgebung erstellt hat.
Lesen Sie den Java GC-Optimierungsleitfaden, der für verschiedene Java-Versionen verfügbar ist und Abschnitte zu diesem speziellen Problem enthält:
quelle
Zitat aus dem Oracle-Artikel "Java SE 6 HotSpot [tm] Optimierung der Garbage Collection für virtuelle Maschinen" :
EDIT: sieht so aus, als könnte jemand schneller tippen als ich :)
quelle
-XX:
Anfang mehrerer Befehlszeilenoptionen steht eine Art Flag, das angibt, dass diese Option sehr VM-spezifisch und instabil ist (Änderungen vorbehalten in zukünftigen Versionen). In jedem Fall weist das-XX:-UseGCOverheadLimit
Flag die VM an, die Überprüfung des GC-Overhead-Limits zu deaktivieren (tatsächlich "ausschaltet"), während Ihr-Xmx
Befehl lediglich den Heap vergrößert. Im letzteren Fall wurde die GC-Overhead-Überprüfung noch ausgeführt . Es klingt nur so, als hätte ein größerer Haufen die GC-Thrashing-Probleme in Ihrem Fall gelöst (dies hilft nicht immer).Wenn Sie sicher sind, dass Ihr Programm keine Speicherlecks enthält , versuchen Sie Folgendes:
-Xmx1g
.-XX:+UseConcMarkSweepGC
.Bei Bedarf kann die Grenzwertprüfung deaktiviert werden, indem die Option
-XX:-UseGCOverheadLimit
zur Befehlszeile hinzugefügt wird.quelle
List
Objekts innerhalb der Schleife wurde GC 39-mal statt 22-mal aufgerufen.Es ist normalerweise der Code. Hier ist ein einfaches Beispiel:
Verwenden von Java 1.6.0_24-b07 unter Windows 7 32 Bit.
Dann schau mal
gc.log
Dies ist zwar nicht der beste Test oder das beste Design, aber wenn Sie in einer Situation sind, in der Sie keine andere Wahl haben, als eine solche Schleife zu implementieren, oder wenn Sie mit vorhandenem Code arbeiten, der sich schlecht verhält, kann sich die Entscheidung, Objekte wiederzuverwenden, anstatt neue zu erstellen, verringern wie oft der Müllsammler im Weg ist ...
quelle
gc.log
Datei. Meine Tests zeigen insgesamt viel weniger Zeiten, aber die wenigsten "Trigger" -Zeiten für BESSER, und jetzt ist BAD "schlechter" als WORST. Meine Zählungen: SCHLECHT: 26, SCHLECHTER: 22, BESSER 21.List<Double> list
in der äußeren Schleife anstelle vor der äußeren Schleife definiere und 39 Garbage Collections ausgelöst habe.Fehlerursache gemäß Java [8] Platform, Standard Edition - Fehlerbehebungshandbuch : (Hervorhebung und Zeilenumbrüche hinzugefügt)
Xms1g -Xmx2g
Versuchen Sie es mit dem Einstellen des Heapspeichers mit -Schauen Sie sich einige weitere verwandte Fragen zu G1GC an
Garbage Collection und Dokumentation zu Java 7 (JDK 7) auf G1
Java G1 Garbage Collection in der Produktion
Oracle Technetwork-Artikel zur GC-Feinabstimmung
quelle
Erhöhen Sie einfach die Heap-Größe ein wenig, indem Sie diese Option aktivieren
Ausführen → Konfigurationen ausführen → Argumente → VM-Argumente
Xms - für Mindestgrenze
Xmx - für maximale Grenze
quelle
arguments
Registerkarte ... was sollen wir tun, um dies zu erreichen?Bei mir haben folgende Schritte funktioniert:
eclipse.ini
DateiVeränderung
zu
Starten Sie Eclipse neu
Siehe hier
quelle
Versuche dies
Öffnen Sie die
build.gradle
Dateiquelle
Folgendes hat bei mir funktioniert. Fügen Sie einfach den folgenden Ausschnitt hinzu:
quelle
Erhöhen Sie javaMaxHeapsize in Ihrer build.gradle-Datei (Modul: App)
zu (Fügen Sie diese Zeile in Gradle hinzu)
quelle
Beschreibungen der Java-Heap-Größe (xms, xmx, xmn)
Legt die Anfangsgröße des Java-Heaps fest. Die Standardgröße ist 2097152 (2 MB). Die Werte müssen ein Vielfaches von und größer als 1024 Byte (1 KB) sein. (Das Flag -server erhöht die Standardgröße auf 32 MB.)
Legt die anfängliche Java-Heap-Größe für die Eden-Generation fest. Der Standardwert ist 640K. (Das Flag -server erhöht die Standardgröße auf 2 MB.)
Legt die maximale Größe fest, bis zu der der Java-Heap wachsen kann. Die Standardgröße ist 64M. (Das Flag -server erhöht die Standardgröße auf 128 MB.) Das maximale Heap-Limit beträgt ca. 2 GB (2048 MB).
Formatierung von Java-Speicherargumenten (xms, xmx, xmn)
Wenn Sie die Größe des Java-Heapspeichers festlegen, sollten Sie Ihr Speicherargument mit einem der Buchstaben "m" oder "M" für MB oder "g" oder "G" für GB angeben. Ihre Einstellung funktioniert nicht, wenn Sie "MB" oder "GB" angeben. Gültige Argumente sehen folgendermaßen aus:
-Xms64m oder -Xms64M -Xmx1g oder -Xmx1G Kann auch 2048 MB verwenden, um 2 GB anzugeben. Stellen Sie außerdem sicher, dass Sie bei der Angabe Ihrer Argumente nur ganze Zahlen verwenden. Die Verwendung von -Xmx512m ist eine gültige Option, aber -Xmx0.5g verursacht einen Fehler.
Diese Referenz kann für jemanden hilfreich sein.
quelle
Sie können auch die Speicherzuordnung und die Heap-Größe erhöhen, indem Sie dies Ihrer
gradle.properties
Datei hinzufügen :org.gradle.jvmargs=-Xmx2048M -XX\:MaxHeapSize\=32g
Es muss nicht 2048M und 32g sein, machen Sie es so groß wie Sie wollen.
quelle
Gelöst:
Fügen Sie einfach
org.gradle.jvmargs=-Xmx1024m
in
gradle.properties
und wenn es nicht vorhanden ist , erstellen Sie es.
quelle
Ich arbeite in Android Studio und bin auf diesen Fehler gestoßen, als ich versucht habe, ein signiertes APK für die Veröffentlichung zu generieren. Ich konnte ein Debug-APK problemlos erstellen und testen, aber sobald ich ein Release-APK erstellen wollte, lief der Erstellungsprozess minutenlang und endete schließlich mit dem "Fehler java.lang.OutOfMemoryError: GC" Overhead-Limit überschritten ". Ich habe die Heap-Größe sowohl für die VM als auch für den Android DEX-Compiler erhöht, aber das Problem blieb bestehen. Nach vielen Stunden und einer Tasse Kaffee stellte sich schließlich heraus, dass das Problem in meiner 'build.gradle'-Datei auf App-Ebene lag. Ich hatte den Parameter' minifyEnabled 'für den Release-Build-Typ auf' false 'gesetzt und folglich Proguard-Inhalte ausgeführt auf Code, der den Code-Shrinking-Prozess nicht durchlaufen hat (siehe https://developer.android.). Ich habe den Parameter 'minifyEnabled' in 'true' geändert und der Release-Build wie ein Traum ausgeführt :)
Kurz gesagt, ich musste meine 'build.gradle'-Datei auf App-Ebene ändern von: // ...
zu
quelle
Befolgen Sie die folgenden Anweisungen, um die Heap-Größe in IntelliJ IDEA zu erhöhen. Es hat bei mir funktioniert.
Für Windows-Benutzer
Gehen Sie zu dem Speicherort, an dem IDE installiert ist, und suchen Sie nach Folgendem.
Bearbeiten Sie die Datei und fügen Sie Folgendes hinzu.
Das ist es !!
quelle
Sie können versuchen, Änderungen an der Servereinstellung vorzunehmen, indem Sie sich auf dieses Bild beziehen und die Speichergröße für gelb hervorgehobene Verarbeitungsprozessänderungen erhöhen
Sie können auch Änderungen am Java-Heap vornehmen, indem
set _java_opts -Xmx2g
Sie je nach Komplexität Ihres Programms cmd-> 2g (2gigabyte) öffnen
Versuchen Sie, weniger konstante Variablen und temporäre Variablen zu verwenden
quelle
Sie müssen die Speichergröße in Jdeveloper erhöhen . Gehen Sie zu setDomainEnv.cmd .
und
quelle
In Netbeans kann es hilfreich sein, eine maximale Heap-Größe zu entwerfen. Gehen Sie zu Ausführen => Projektkonfiguration festlegen => Anpassen . Im Laufe seiner tauchte Fenster, gehen Sie zu VM Option , füllen Sie bitte
-Xms2048m -Xmx2048m
. Es könnte das Problem der Heap-Größe lösen.quelle
Durch einen Neustart meines MacBook wurde dieses Problem für mich behoben.
quelle
Ich weiß nicht, ob dies noch relevant ist oder nicht, sondern möchte nur mitteilen, was für mich funktioniert hat.
Aktualisieren Sie die Kotlin-Version auf die neueste verfügbare Version. https://blog.jetbrains.com/kotlin/category/releases/
und es ist geschafft.
quelle