ERLEDIGT
NEIN
NEIN
ANTWORTEN
5
5
ZUGRIFFE
759
759
EMPFEHLEN
-
Hallo,
ich habe ein Problem mit der Speicherverwaltung in Java.
Bei mir erscheint die Fehlermeldung:
Code :1 2
Exception occurred during event dispatching: java.lang.OutOfMemoryError
nachdem ich mein Programm für eine Weile laufen ließ...
Im Windows-Task-Manager habe ich gesehen, dass die Speicherauslastung immer bei knapp 100.000k steht, wenn dieser Fehler auftritt...
Kann mir einer sagen, wie ich dies in den Griff bekomme und woran das liegt?
Was mache ich denn falsch?
Danke
-
Es sieht so aus als ob du immer mehr Objekte erstellst und die Referenzen dazu bei behältst , wahrscheinlich durch ein Vector ? oder so .. Sonst würde der Garbage Collector den Speicher nach und nach aufräumen .. Ich denke, da wird ein Programmierfehler in deinem Programm vorliegen .. Falls du wirklich so viel Speicher brauchst, was ich nicht glaube, kannst du, glaube ich, den reservierten Speicher für die VM über einen Parameter erhöhen .. Wie der heisst, weiss ich nich ..
:-) möp
-
"I'm not deaf, I'm ignoring you"
----
-
Hi,
also ich arbeite 1. mit vielen BufferedImages und 2. mitGraphics2D-Objekten. Dazu habe ich noch 4 Images die geladen werden.
Wie gebe ich denn diese wieder frei
Zum besseren Verständniss sollte gesagt werden, dass ich an einer Stelle im Programm einen Editor lade, der diesen extra Speicher in Anspruch nimmt. Nach Beenden des Editors sollte der Speicher aber wieder freigegeben werden....
Ich hoffe ihr könnt mir sagen, wie ich Referenzen auf die oben genannten Objekte löschen kann,
dankeGeändert von jorgeHX (01.12.04 um 00:05 Uhr)
-
einObjekt = altesObjekt
Referenzen werden gelöscht in dem du :
einObjekt = null setzt bzw.
einObjekt = neuesObjekt setzt ..
Dann werden bspw. auch gleich alle Referenzen die das "alte" Objekt auf irgendetwas hatte gelöscht .. Es sei denn ein anderes Objekt hatte noch eine Referenz auf "altesObjekt" .. So und jetzt sind wir komplett verwirrt
Objekte, auf welche nicht referenziert wird, können von deinem Programm nicht mehr genutzt werden, weil keine Klasse ja mehr auf sie zeigt .. Daher können sie auch bedenkenlos vom Garbage Collector gelöscht werden .. Wann "er" dies macht ist jedoch Sache der VM ...:-) möp
-
Hallo,
also ich habe alles versucht, aber nichts war erfolgreich. Schon komisch aber vielleicht hat jemand eine Minute Zeit und liest sich mal das folgende Gestrüpp durch....
Die einzelnen Objekte benötige ich in der Tat in der Anzahl.
Die zu ladenden Images sind immer 500kb groß.... Aber der Windows-Task-Manager zeigt immer 5-6MB an, die jedesmal neu geladen werden, wenn ich diese Klasse aufrufe...
WARUM Ich verzweifle hier schon
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
public class GrafikBild2D extends JComponent implements MyGraphicDisplay { protected BufferedImage scrImage = null; protected BufferedImage scrWhiteImage = null; protected Graphics2D scrGraphic = null; protected Graphics2D scrWhiteGraphics = null; protected Graphics2D scrBackgroundGraphic = null; protected Graphics2D scrBackgroundWhiteGraphics = null; protected Image image = null; protected Image whiteImage = null; protected BufferedImage backgroundImage = null; protected BufferedImage backgroundWhiteImage = null; public GrafikBild2D(UebungDAO uebungDAO) { System.out.println("GrafikBild2D"); this.uebungDAO = uebungDAO; } // overwrites the paint-Method public void paintComponent(Graphics g){ super.paintComponent(g); Graphics g2d = (Graphics2D)g; Rectangle bounds = getBounds(); // the offScreenImage has to be created to begin if((width <=0) || (height <=0) || (width != bounds.width) || (height != bounds.height)){ createScreenImage(bounds.width, bounds.height); width = bounds.width; // unbedingt nötig, sonst wird nicht gezeichnet height = bounds.height; g2d.drawImage(scrImage, 0, 0, imageWidth, imageHeight, this); } else{ // draws the shape depending on the new position of the mouse g2d.drawImage(scrImage, 0, 0, imageWidth, imageHeight, this); } } } catch(Exception e){ } } // creats a new BufferedImage with RGB color public void createScreenImage(int wid, int ht){ try{ if (uebungDAO.getGrafik() != null ) { // determine thumbnail size from WIDTH and HEIGHT //thumbWidth = width; //thumbHeight = height; //double thumbRatio = (double) thumbWidth / (double) thumbHeight; image = Toolkit.getDefaultToolkit().getImage(uebungDAO.getDefaultGrafik()); whiteImage = Toolkit.getDefaultToolkit().getImage(uebungDAO.getDefaultWeisseGrafik()); // MediaTracker damit das Bild erst geladen wird MediaTracker mt = new MediaTracker(this); mt.addImage(image, 0); mt.addImage(whiteImage, 1); try { // Warte bis das Image geladen ist mt.waitForAll(); } catch (InterruptedException ee) { // tue nichts } mt = null; imageWidth = image.getWidth(null); imageHeight = image.getHeight(null); scrImage = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_BGR); scrGraphic = scrImage.createGraphics(); scrGraphic.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); scrGraphic.setColor(drawingColor); scrGraphic.drawImage(image, 0, 0, imageWidth, imageHeight, null); scrWhiteImage = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB); scrWhiteGraphics = scrWhiteImage.createGraphics(); scrWhiteGraphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints. VALUE_INTERPOLATION_BILINEAR); scrWhiteGraphics.setColor(drawingColor); scrWhiteGraphics.drawImage(whiteImage, 0, 0, imageWidth, imageHeight, null); //*****same for the BackroundGraphic***** backgroundImage = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_BGR); scrBackgroundGraphic = backgroundImage.createGraphics(); scrBackgroundGraphic.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); scrBackgroundGraphic.setColor(drawingColor); scrBackgroundGraphic.drawImage(image, 0, 0, imageWidth, imageHeight, null); backgroundWhiteImage = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB); scrBackgroundWhiteGraphics = backgroundWhiteImage.createGraphics(); scrBackgroundWhiteGraphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints. VALUE_INTERPOLATION_BILINEAR); scrBackgroundWhiteGraphics.setColor(drawingColor); scrBackgroundWhiteGraphics.drawImage(whiteImage, 0, 0, imageWidth, imageHeight, null); }
Ähnliche Themen
-
dyn. Speicherverwaltung free
Von cappi im Forum C/C++Antworten: 5Letzter Beitrag: 07.11.09, 16:40 -
Dynamische Speicherverwaltung
Von rainer82 im Forum C/C++Antworten: 8Letzter Beitrag: 21.10.09, 08:00 -
Speicherverwaltung
Von brucebra im Forum 3D Studio MaxAntworten: 5Letzter Beitrag: 05.11.05, 11:18 -
Speicherverwaltung bei c#
Von kimpel007 im Forum .NET ArchivAntworten: 1Letzter Beitrag: 03.02.05, 15:11 -
[C] Speicherverwaltung
Von abcd_hallo im Forum C/C++Antworten: 16Letzter Beitrag: 29.06.04, 13:59





Zitieren
Login





