Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
Ich kann nicht laufen, mein Prozess. Es gibt folgende exception: "Exception in thread "main" java.lang.OutOfMemoryError: Java heap space"
java -Xms32m -Xmx516m FilteringSNP_genus
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
bei java.util.Arrays.copyOf(Arrays.java:2882)
bei java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
bei java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:515)
bei java.lang.StringBuffer.append(StringBuffer.java:306)
bei java.io.BufferedReader.readLine(BufferedReader.java:345)
bei java.io.BufferedReader.readLine(BufferedReader.java:362)
bei FilteringSNP_genus.main(FilteringSNP_genus.java:65)
Ich habe versucht, verschiedene memory-Verwendung Konfiguration wie:
java -Xms32m -Xmx1024m FilteringSNP_genus
aber es hat nicht funktioniert, und die Erhöhung der -XmxVALUE gegeben hat, ein GC overheadlimit überschritten Ausnahme:
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
bei java.lang.String.substring(String.java:1940)
bei java.util.StringTokenizer.nextToken(StringTokenizer.java:335)
bei FilteringSNP_genus.main(FilteringSNP_genus.java:77)
Könnte jemand einige Ahnung, dieses Problem zu beheben?
Dank
- Ein paar mehr Infos würden zu schätzen wissen: vor allem, was gibt es in Ihrem Prozess zu tun (es ist ein "Hallo Welt" gegangen, schlecht oder ist es wirklich ein Komplexes system, das möglicherweise brauchen die alle Speicher)
- Können Sie PLZ, um FilteringSNP_genus.java:65
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde raten, dass Sie Lesen aus einer Datei oder ein socket und mit readLine() für Bequemlichkeit ohne Rücksicht auf die Konsequenzen. Versuchen das Lesen in ein char[] buffer statt.
Abwechselnd, Sie Lesen die Zeilen und Speicherung der harten Verweise auf die Bilder in Erinnerung, so dass Sie offensichtlich läuft aus dem Zimmer, sobald Sie genug zu Lesen.
Als für die GC-overhead-Fehler nach einer Oracle-JVM Artikel:
"Die parallelen Kollektor wirft einen OutOfMemoryError, 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."
GC overhead error
!Ich fand die GC aufgeben wird, wenn es zu lange dauert, bis der Speicher, selbst wenn der Speicher wirklich da ist. Das einfachste problem ist, wenn der Speicher ist meist virtuelle, die ist erheblich langsamer als echter Speicher. Auch wenn der Speicher zu fragmentiert ist, die GC nehmen können, Zeit zu finden, die Platz braucht. Und wenn Sie die Zuweisung großen Brocken von Speicher, dass kann die situation noch viel schlimmer. Ein problem wie dieses kann intermittierend sein, gut, wenn der GC nicht Zeit gehabt hat, das Haus zu säubern und zu halten alles organisiert und Versagen, wenn es überlastet ist. Meine Vermutung ist, dass in Ihrem Fall haben Sie entweder ein paging-problem, oder Sie sind mit zu viel freier Speicher in Brocken, die zu groß sind.
Lösungen: Holen Sie mehr echten Speicher (wenn die Auslagerung ist das problem). Verwenden Sie weniger Speicher. Verwenden Sie kleinere Stücke der Erinnerung. Arrays sind der Schnellste Weg, um zahlen berechnet werden, aber Datenstrukturen mit Zeigern machen das Leben leichter für den GC. Wenn Sie kann herausfinden, einen Weg, um kleinere arrays (oder arrays), die das tun.
Es sollte möglich sein, um eine richtige 64-bit-system (computer-und JVM) mit 8GB oder mehr Speicher, so können Sie ignorieren und vergessen dieses problem, aber ich habe noch zu hören, niemand tut, dass. (Und memory die Nutzung erweitert und füllen Sie den verfügbaren Arbeitsspeicher,...)