Out of Memory error

MiRaMC

Erfahrenes Mitglied
Hallo zusammen hoffentlich kann mir jemand helfen!

Ich hab ein großes Problem:

Ich hab ein Programm geschrieben, dass sehr viele ImageIcons enthält. Jetzt gibt es immer bein Programmstart einen Out if Memory Error. Wie kann man das Vermeiden ohne dass man ImageIcons weglassen muss?

Danke an alle die helfen könne schon mal im voraus!
 
Re: ! Out of Memory error !

Hallo!

Du könntest die Maximale Größe des Heaps für die VM erhöhen:

Die übersicht über die dafür notwendigen Befehle erhälst du über:
Code:
java -X
Ausgabe:
C:\>java -X
-Xmixed mixed mode execution (default)
-Xint interpreted mode execution only
-Xbootclasspath:<directories and zip/jar files separated by ;>
set search path for bootstrap classes and resources
-Xbootclasspath/a:<directories and zip/jar files separated by ;>
append to end of bootstrap class path
-Xbootclasspath/p:<directories and zip/jar files separated by ;>
prepend in front of bootstrap class path
-Xnoclassgc disable class garbage collection
-Xincgc enable incremental garbage collection
-Xloggc:<file> log GC status to a file with time stamps
-Xbatch disable background compilation
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
-Xss<size> set java thread stack size
-Xprof output cpu profiling data
-Xfuture enable strictest checks, anticipating future default
-Xrs reduce use of OS signals by Java/VM (see documentation)
-Xcheck:jni perform additional checks for JNI functions
-Xshare:eek:ff do not attempt to use shared class data
-Xshare:auto use shared class data if possible (default)
-Xshare:eek:n require using shared class data, otherwise fail.

The -X options are non-standard and subject to change without notice.

Der Parameter den wir brauchen ist -Xmx<size> wobei <size> eben die größe des maximalen Heaps angibt.
Mögliche Parameter wären:
-Xmx64M -> 64 MB Maximale Heaps Größe (Standard: 64MB)
-Xmx81920k -> 81920kbytes
-Xmx83886080 -> 83886080bytes
Versuchs beispielsweise mal mit:

Code:
java -Xmx256M MainKlasse

Jedoch ist das nicht die Lösung für dein Problem sondern zögert diese nur hinaus.
Schau lieber mal noch ob du noch irgendwo Referenzen auf nicht mehr benötigte ImageIcon Instanzen. Wenn das der Fall ist kann der Garbage Collector die Objekte nicht aus dem Speicher räumen. Es ist immer besser seine Anwendung erstmal dahingehend zu Optimieren als "die Umgebung" zu ändern.

Gruß Tom
 
Hallo,

ein OutOfMemory Error tritt oft bei Endlosschleifen auf. Initialisierst Du die ImageIcons in einer Schleife? Du musst Deinen Code genauer untersuchen, am besten in Debug-Modus.
 
Kann es sein, dass du häufig Objekte creierst und sofort wieder verwirfst? Wenn du das schnell machst kommt die Garbage-Collection nicht nach. Da hilft dann ein gezielter aufruf der gc (oder ein anderes Design mit einem Objekt-Pool).
 
Falls sich Deine Objekt-Erstellungen im Rahmen halten und auch die Schleife fehlerfrei ist, könnte es vielleicht sein, daß Deine Bilder mit Anzahl und Größe zu viele Bytes "fressen". Vielleicht solltest Du die Bildgrößen reduzieren. Positiver Nebeneffekt währe dann auch sinkende Ladezeit.

CU schnuffie
 
Danke ihr habt mir alle sehr geholfen!

Ich hab jetzt erst mal die Größe der Bilder reduziert und jetzt gehts wieder. Fragt sich bloß wie lang? ;-)
 
Besorg dir mal eine Profiler-Software. Die kann aufdecken, wo der Speicher gebraucht wird und du kannst dann damit geziehlt dagegen vorgehen.
 
Hallo,
ich habe ein ganz ähnliches Problem:
Ich habe auf der rechten Seite einen Baum, wenn auf ein Blatt geklickt wird erscheint auf der linken Seite der Anwendung ein Panel mit einem Bild. Das ganze liegt natürlich in einem SplitPane.

Ich habe alle Vorschläge hier ausprobiert aber es führte nicht zum Erfolg. Wenn ich einige Male im Baum klicke bekomme ich die Java Out of Memory Fehlermeldung.
Beim Klick wird nur dieser Code durchlaufen:

ResultSet res = Frame.db.query(
"SELECT PersonID FROM Person WHERE ( Name ='" + name +
"' AND"
+ " Vorname='" + vorname + "')");
res.next();
personId = res.getLong("PersonID");

Register reg = new Register(personId);

splitPane.setRightComponent(reg);
splitPane.setDividerLocation(dividerLocation);
res.getStatement().close();


Woran kann das noch liegen?
Wo gibt es so eine Profiler Software am besten noch umsonst?

Gruß SIMON
 
Zurück