tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
759
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    jorgeHX jorgeHX ist offline Mitglied Brokat
    Registriert seit
    Jun 2004
    Beiträge
    253
    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
     

  2. #2
    Avatar von teppi
    teppi teppi ist offline Mitglied Platin
    Registriert seit
    May 2004
    Ort
    Berlin
    Beiträge
    537
    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

  3. #3
    Registriert seit
    Oct 2003
    Beiträge
    1.706
     
    "I'm not deaf, I'm ignoring you"
    ----

  4. #4
    jorgeHX jorgeHX ist offline Mitglied Brokat
    Registriert seit
    Jun 2004
    Beiträge
    253
    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
    Geändert von jorgeHX (01.12.04 um 00:05 Uhr)
     

  5. #5
    Avatar von teppi
    teppi teppi ist offline Mitglied Platin
    Registriert seit
    May 2004
    Ort
    Berlin
    Beiträge
    537
    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

  6. #6
    jorgeHX jorgeHX ist offline Mitglied Brokat
    Registriert seit
    Jun 2004
    Beiträge
    253
    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

  1. dyn. Speicherverwaltung free
    Von cappi im Forum C/C++
    Antworten: 5
    Letzter Beitrag: 07.11.09, 16:40
  2. Dynamische Speicherverwaltung
    Von rainer82 im Forum C/C++
    Antworten: 8
    Letzter Beitrag: 21.10.09, 08:00
  3. Speicherverwaltung
    Von brucebra im Forum 3D Studio Max
    Antworten: 5
    Letzter Beitrag: 05.11.05, 11:18
  4. Speicherverwaltung bei c#
    Von kimpel007 im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 03.02.05, 15:11
  5. [C] Speicherverwaltung
    Von abcd_hallo im Forum C/C++
    Antworten: 16
    Letzter Beitrag: 29.06.04, 13:59