Veröffentlicht 8. Februar 200520 j Ich hab ein Programm geschrieben das mit vielen großen Bildern arbeitet. (5MB Bilder)Wenn ich das Programm öfters ausgeführt habe kommt dieses Problem. Ich glaub wenn ich vor dem Schießen den Speicher manuel leere geht dieser Fehler weg. Aber wie mach ich das????
8. Februar 200520 j Dazu kann man nur was sagen, wenn man Dein Programm kennt. Kannst Du das eindampfen und hier zeigen, so dass nur das drinsteht, was die Symptome zeigt? Setzt Du Referenzen von Objekten, die du nicht mehr brauchst, auch schön auf null? Was heisst mehrmals ausführen? Hast Du mal einen Profiler drüberlassen? (google nach Java Profiler) Hast Du - wenn Du mehr Speicher brauchst - die VM-Argumente für minimalen und maximalen Speicher probiert? Hab sie grad nicht im Kopf, javabuch sollte helfen. Peter
8. Februar 200520 j import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.applet.*; import java.io.*; import java.net.*; class Bilder extends JPanel { private Image kampfhintergrund,granate,kampf,defensiv,flucht,auswahl,heiltrank,seabeach; private Image drache, dracheani, kampfb,kampfani,gewonnen, verloren; private Image heldrechtslaufen,heldrechtsstehen,hintergrund,hintergrund2,hintergrund3; private Image heldlinkslaufen,heldlinksstehen,heldobenstehen,heldobenlaufen; private Image helduntenlaufen,helduntenstehen,granate1,granate2,granate3,granate4,granate5,granate6,granate7,granate8,granate9,granate10,granate11,granate12,granate13,granate14,granate15; public Bilder() { // Bilder laden MediaTracker tracker = new MediaTracker(this); kampfhintergrund = Toolkit.getDefaultToolkit().getImage("Kampfhintergrund.jpg"); granate = Toolkit.getDefaultToolkit().getImage("Granate.gif"); heiltrank = Toolkit.getDefaultToolkit().getImage("Heiltrank.gif"); kampf = Toolkit.getDefaultToolkit().getImage("Heldkämpfen.gif"); defensiv = Toolkit.getDefaultToolkit().getImage("Defensiv.gif"); flucht = Toolkit.getDefaultToolkit().getImage("Flucht.gif"); auswahl = Toolkit.getDefaultToolkit().getImage("Auswahl.gif"); seabeach = Toolkit.getDefaultToolkit().getImage("SeaBeach.png"); drache = Toolkit.getDefaultToolkit().getImage("Drache.gif"); hintergrund = Toolkit.getDefaultToolkit().getImage("Hintergrundbilder/Strand1.jpg"); hintergrund2 = Toolkit.getDefaultToolkit().getImage("strand2.jpg"); hintergrund3 = Toolkit.getDefaultToolkit().getImage("Stadt.jpg"); dracheani = Toolkit.getDefaultToolkit().getImage("Dracheani.gif"); kampfani = Toolkit.getDefaultToolkit().getImage("Stichani.gif"); verloren = Toolkit.getDefaultToolkit().getImage("Verloren.jpg"); gewonnen = Toolkit.getDefaultToolkit().getImage("Gewonnen.jpg"); heldrechtslaufen = Toolkit.getDefaultToolkit().getImage("Heldrechtslaufen.gif"); heldrechtsstehen = Toolkit.getDefaultToolkit().getImage("Heldrechtsstehen.gif"); heldlinkslaufen = Toolkit.getDefaultToolkit().getImage("Heldlinkslaufen.gif"); heldlinksstehen = Toolkit.getDefaultToolkit().getImage("Heldlinksstehen.gif"); heldobenstehen = Toolkit.getDefaultToolkit().getImage("Heldobenstehen.gif"); heldobenlaufen = Toolkit.getDefaultToolkit().getImage("Heldobenlaufen.gif"); helduntenlaufen = Toolkit.getDefaultToolkit().getImage("Helduntenlaufen.gif"); helduntenstehen = Toolkit.getDefaultToolkit().getImage("Helduntenstehen.gif"); granate1 = Toolkit.getDefaultToolkit().getImage("/Granate/Granate01.gif"); granate2 = Toolkit.getDefaultToolkit().getImage("/Granate/Granate02.gif"); granate3 = Toolkit.getDefaultToolkit().getImage("/Granate/Granate03.gif"); granate4 = Toolkit.getDefaultToolkit().getImage("/Granate/Granate04.gif"); granate5 = Toolkit.getDefaultToolkit().getImage("/Granate/Granate05.gif"); granate6 = Toolkit.getDefaultToolkit().getImage("/Granate/Granate06.gif"); granate7 = Toolkit.getDefaultToolkit().getImage("/Granate/Granate07.gif"); granate8 = Toolkit.getDefaultToolkit().getImage("/Granate/Granate08.gif"); granate9 = Toolkit.getDefaultToolkit().getImage("/Granate/Granate09.gif"); granate10 = Toolkit.getDefaultToolkit().getImage("/Granate/Granate10.gif"); granate11 = Toolkit.getDefaultToolkit().getImage("/Granate/Granate11.gif"); granate12 = Toolkit.getDefaultToolkit().getImage("/Granate/Granate12.gif"); granate13 = Toolkit.getDefaultToolkit().getImage("/Granate/Granate13.gif"); granate14 = Toolkit.getDefaultToolkit().getImage("/Granate/Granate14.gif"); granate15 = Toolkit.getDefaultToolkit().getImage("/Granate/Granate15.gif"); int id = 1; int id1 = 1; int id2 = 1; int id3 = 1; int id4 = 1; int id5 = 1; int id6 = 1; int id7=1;int id8=1;int id9=1;int id11=1;int id12=1;int id13=1; int id14 = 1; int id15 = 1; int id16 = 1; int id17 = 1; int id18 = 1; int id19 = 1; int id20 = 1; int id21=1;int id22=1;int id23=1;int id24=1;int id25=1;int id26=1; // ID zum Verfolgen des Bildladevorgangs tracker.addImage(kampfhintergrund, id); tracker.addImage(heiltrank, id1); tracker.addImage(kampf, id2); tracker.addImage(defensiv, id3); tracker.addImage(flucht, id4); tracker.addImage(auswahl, id5); tracker.addImage(granate, id6); tracker.addImage(seabeach, id7); tracker.addImage(drache, id8); tracker.addImage(dracheani, id9); tracker.addImage(kampfani, id11); tracker.addImage(gewonnen, id12); tracker.addImage(verloren, id13); tracker.addImage(hintergrund, id14); tracker.addImage(hintergrund2, id15); tracker.addImage(hintergrund3, id16); tracker.addImage(heldrechtslaufen, id17); tracker.addImage(heldrechtsstehen, id18); tracker.addImage(heldlinkslaufen, id19); tracker.addImage(heldlinksstehen, id20); tracker.addImage(heldobenstehen, id21); tracker.addImage(heldobenlaufen, id22); tracker.addImage(helduntenlaufen, id23); tracker.addImage(helduntenstehen, id24); try { tracker.waitForID(id); tracker.waitForID(id1); tracker.waitForID(id2); tracker.waitForID(id3); tracker.waitForID(id4); tracker.waitForID(id5); tracker.waitForID(id6); tracker.waitForID(id7); tracker.waitForID(id8); tracker.waitForID(id9); tracker.waitForID(id11); tracker.waitForID(id12); tracker.waitForID(id13); tracker.waitForID(id14); tracker.waitForID(id15); tracker.waitForID(id16); tracker.waitForID(id17); tracker.waitForID(id18); tracker.waitForID(id19); tracker.waitForID(id20); tracker.waitForID(id21); tracker.waitForID(id22); tracker.waitForID(id23); tracker.waitForID(id24); } catch (InterruptedException e) { } } public Image[] getKampfbilder() { //die Bilder für den Kampfmodus Image kampfbilder[]=new Image[12]; kampfbilder[0]= kampfhintergrund; kampfbilder[1]= heiltrank ; kampfbilder[2]= kampf ; kampfbilder[3]= defensiv ; kampfbilder[4]= verloren ; kampfbilder[5]= auswahl ; kampfbilder[6]= granate ; kampfbilder[7]= seabeach ; kampfbilder[8]= drache ; kampfbilder[9]= dracheani ; kampfbilder[10]= kampfani ; kampfbilder[11]= gewonnen ; return kampfbilder; } public Image[] getOberbilder() { //die Bilder für die Oberfläche Image oberbilder[]=new Image[11]; oberbilder[0]= heldrechtslaufen; oberbilder[1]= heldrechtsstehen; oberbilder[2]= heldlinkslaufen ; oberbilder[3]= heldlinksstehen ; oberbilder[4]= heldobenlaufen ; oberbilder[5]= heldobenstehen ; oberbilder[6]= helduntenlaufen ; oberbilder[7]= helduntenstehen ; oberbilder[8]= hintergrund; oberbilder[9]= hintergrund2 ; oberbilder[10]= hintergrund3 ; return oberbilder; } } Das ist der bildladevorgang meines programmes dort passiert mir es immer ein bild ist auch ca.834kb groß. Ich hab schon danach gesucht aber ich bin zu blöd um das zu finden ^^
8. Februar 200520 j Oha... Du lädst ja alle Bilder auf einmal... Das ist zu viel für die VM. Große Bilder (wobei "groß" schon bei mehr als 200kb anfängt) erst dann laden wenn sie gebraucht werden und dann auch wieder frei geben und nicht die ganze Zeit im Speicher halten. Ansonsten mit den VM-Optionen "-Xms128m -Xmx256m" der VM mindestens 128 MB und maximal 256MB Speicher zuweisen. Das wäre das einzige was auf die schnelle hilft.
8. Februar 200520 j Oha... Du lädst ja alle Bilder auf einmal... Das ist zu viel für die VM. Große Bilder (wobei "groß" schon bei mehr als 200kb anfängt) erst dann laden wenn sie gebraucht werden und dann auch wieder frei geben und nicht die ganze Zeit im Speicher halten. Ansonsten mit den VM-Optionen "-Xms128m -Xmx256m" der VM mindestens 128 MB und maximal 256MB Speicher zuweisen. Das wäre das einzige was auf die schnelle hilft. Wo genau kann ich das einstellen ^^
8. Februar 200520 j Einfach mit an den Kommandozeilen-Aufruf anhängen... "java -Xms128m -Xmx256M -classpath .... .... ... Class"
8. Februar 200520 j Jo thx für den tip :uli hat super funktioniert das mehr ressorssen gebraucht werden ist nicht schlimm, ist ja sowieso ein Rollenspiel und man hat keine zeit was nebenher zu machen ^^
9. Februar 200520 j Aber nicht jeder hat 256MB Ram... Also ich würde es eher "ressourceschonender" programmieren. Und dazu gehärt nunmal den RAM-Verbrauch etwas zu minimieren... Du könntest die (größeren) Bilder wirklich erst zu der Zeit laden, wenn du sie wirklich brauchst.
18. Februar 200520 j Hi manwhofindnoname, Aber nicht jeder hat 256MB Ram... in dem Falle könnte der Garbage Collector helfen: mit Runtime.getRuntime().gc(); aufgerufen, löscht er alle Objekte die nicht gebraucht werden.
18. Februar 200520 j Wobei das auch nix bringt, wenn die Bild-Objecte nicht freigegeben worden sind. Der GC gibt ja nur Speicher der Objecte frei, die wirklich nicht mehr gebraucht werden (null).
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.