Speicherverwaltung in Java

jorgeHX

Erfahrenes Mitglied
Hallo,

ich habe ein Problem mit der Speicherverwaltung in Java.
Bei mir erscheint die Fehlermeldung:

Code:
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 ..
 
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,
danke
 
Zuletzt bearbeitet:
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 :D

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 ...
 
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:
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);

        }
 
Zurück