2012-03-30 13 views
0

Ich muss Speicherplatz zu einem Array je nach den Konfigurationsparameter Höhe und Breite zuweisen.Fehler beim Initialisieren von Array: OutOfMemoryError

int input[]=new int[height * width]; //this is line no 538 

Eine der Konfigurationen hat Parameter height=8192 und width=8192. Die Größe des Arrays wird also 67108864. Aber wenn ich das mache, bekomme ich OutOfMemoryError.

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
     at Test.main(Test.java:538) 

Ich habe dieses Programm auf Eclipse lief sowie auf Cygwin, aber ich bin vor dem gleichen Problem. Ich denke, das ist kein Fehler und keine Ausnahme. Wie kann ich das korrigieren?

+0

Wie läuft Ihre Java-Konfiguration? Die Zeile, in der ein OutOfMemoryError auftritt, ist nicht wichtig. – Markus

+1

Siehe meinen Kommentar zu diesem [Antwort] (http://stackoverflow.com/a/9937250/1251613) – Markus

Antwort

1

Sie haben wahrscheinlich zu wenig Heap-Speicher, um ein Array mit der gewünschten Größe aufzunehmen. Sie können die Größe Ihres Heaps mit Befehlszeilenoptionen erhöhen. Zum Beispiel ist es zu 256 MB zu setzen, um diesen Schalter:

-Xmx256m

Wenn Sie multiplizieren height * width * 4 (4 sind die Speicherung in Bytes für einen int) Sie ein grobes Maß für das bekommen Menge an Heap, die Sie benötigen, vorausgesetzt, der Rest des Programms benötigt keine signifikante Menge. Sie werden sicherlich mehr Haufen brauchen, als die schnelle Berechnung vermuten lässt. Fügen Sie vielleicht 20% hinzu und probieren Sie es aus.

Um eine bessere Anzahl als eine Faustregel-Berechnung zu erhalten, können Sie in Heap-Profiler suchen. Es gibt mehrere Open-Source-Optionen:

http://java-source.net/open-source/profilers

Siehe http://javarevisited.blogspot.com/2011/05/java-heap-space-memory-size-jvm.html für eine gute Diskussion des Haufens in Java.

1

Erhöhen Sie Ihre Speicherargumente für Ihren Java-Prozess, indem Sie dieses Flag hinzufügen, um den Heap zu erhöhen. Sie müssen möglicherweise herumspielen, um die optimale Größe für den Heap zu erhalten. Dies wird die "maximale" Heap-Größe festlegen. Der Standardwert ist wahrscheinlich sehr klein. 64M ist eine gemeinsame maximale Größe für viele Java EE-Container.

* Hinweis Ich sage nicht, dass dies genau die Größe ist, die Sie benötigen. Ihr einzigartiger Fall bestimmt die Größe, die Sie zum Experimentieren benötigen.

-Xmx256M 
+1

Er würde ein wenig mehr als das brauchen. Die 67108864' Int's nehmen 256M alleine auf. – trutheality

+0

Ich klärte meine Antwort mit einem Schnitt. Eine "definitive" Antwort kann nicht gegeben werden, weil wir nur ein Array kennen, für das er Speicher benötigt. Wenn sein Programm nur dieses eine Array verwendet, muss er selbst herausfinden, welche Größe er benötigt. – DavidB

5

Seit 8192 * 8192 * 4 = 256 M (ganze Zahlen sind jeweils 4 Bytes), Ihre Matrix wird mit 256 MB Heap-Speicher von selbst aus.

Sie können der JVM mitteilen, wie viel Heap-Speicherplatz für Ihre Anwendung verfügbar sein soll. Von Laufen man java und auf der Suche durch die Nicht-Standard-Optionen:

-Xmxn

  Specify the maximum size, in bytes, of the memory allocation 
      pool. This value must a multiple of 1024 greater than 2MB. 
      Append the letter k or K to indicate kilobytes, or m or M to 
      indicate megabytes. The default value is chosen at runtime 
      based on system configuration. For more information, see 
      HotSpot Ergonomics 
      Examples: 

        -Xmx83886080 
        -Xmx81920k 
        -Xmx80m 

     On Solaris 7 and Solaris 8 SPARC platforms, the upper limit for 
     this value is approximately 4000m minus overhead amounts. On 
     Solaris 2.6 and x86 platforms, the upper limit is approximately 
     2000m minus overhead amounts. On Linux platforms, the upper limit 
     is approximately 2000m minus overhead amounts. 

Um diese Option zu verwenden, würden Sie Ihre Anwendung mit einem Befehl wie

java -Xmxn1024m -jar foo.jar 

in Eclipse starten Sie können auch Befehlszeilenoptionen hinzufügen. This page auf eclipse.org beschreibt, wie Befehlszeilenargumente zu einem Java-Programm hinzugefügt werden.Sie sollten die -Xmxn1024m (oder eine andere ausreichend große Heap-Spezifikation) zum Abschnitt "VM-Argumente" des Dialogfelds hinzufügen, das auf dieser Site angezeigt wird.

+0

Vielleicht ein anderer hilfreicher [Antwort] (http://stackoverflow.com/questions/37335/how-to-deal-with-java-lang-outofmemoryerror-java-heap-space-error-64mb-heap) – Markus

1

Speicher ist nicht genug für Ihr Programm, kann Speicherleck dort sein.

können Sie versuchen, unten, wenn nicht lösen versuchen, jmx Wert zu erhöhen.

java -xmx1g -xms512m 
1

Hängt davon ab, wie viel Heap die JVM hat. Wenn Sie es in der Befehlszeile ausführen, versuchen Sie das Hinzufügen von -Xmx512m. Wenn Sie in einer IDE arbeiten, fügen Sie sie zu den Eigenschaften "Ausführen" hinzu.

1

Ein int ist 32 Bits (d.h. 4 Bytes). Ihr Array benötigt also 8192 * 8192 * 4 Bytes. Dies kommt bei 256 MB heraus.

Java mit Standardargumenten aufgerufen hat nur 64 MB Heap-Speicher.

Um einen größeren Heap zu erhalten, rufen Sie Java mit dem Argument -Xmx (Maximale Speichergröße) auf.

z.B. java -Xmx300M

Verwandte Themen