# Problem mit Speicherverbrauch



## TimoH. (21. Jun 2011)

Hey,

ich hab da nen ganz blödes Problem mit meinem Programm und zwar folgendes:

Ich möchte eine Spielwelt (jedeglich der Untergrund) zeichnen. Es funktioniert auch alles, bloß habe
ich bemerkt, dass der Speicherverbrauch stetig um ca. ~3Mb die Sekunde ansteigt, das ist natürlich nicht gerade optimal.

Hat eventuell jemand eine Idee woran es eventuell liegt.

Hier mal der Code auf den ich es runter gebracht habe.

Die paintComponent() Methode meines JPanels:

```
@Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        actualWorld.drawWorld(g);
        /*
         * Sollen Informationen überhaupt gezeigt werden?
         */
        if(showInfo){
            actualWorld.drawGrid(g);
            g.setColor(Color.CYAN);
            g.drawString("FPS: "+Long.toString(FPS), getSize().width - 75, 25);
            g.drawString("Delta: "+Long.toString(delta / 1000000)+" ms", getSize().width - 75, 40);
        }
        g.dispose();
    }
```


Und hier die beiden Methoden meiner Welt-Klasse drawWorld und drawGrid:


```
@Override
    public void drawGrid(Graphics g){
        for(int x = 0; x <= (panel.getSize().width / Tile.TILE_WIDTH) && x < max_X_Grid;x++){
            for (int y = 0; y <= (panel.getSize().height / Tile.TILE_HEIGHT) && y < max_Y_Grid; y++) {               
                g.setColor(Color.yellow);
                g.drawRect(x*Tile.TILE_WIDTH, y*Tile.TILE_HEIGHT, Tile.TILE_WIDTH, Tile.TILE_HEIGHT);
            }
        }
    }

    /*
     * Es wird berechnet welcher Abschnitt der Welt zu sehen ist!
     * 
     * Scrollen ist zur Zeit nur gridweise möglich.
     */
    
    @Override
    public void drawWorld(Graphics g) {
        if (initialized) {
            int draw_min_x = draw_min_x = actualPoint.x - (panel.getSize().width / 2);
            int draw_min_y = draw_min_y = actualPoint.y - (panel.getSize().height / 2);
            int x_grid = x_grid = draw_min_x / Tile.TILE_WIDTH;
            int y_grid = y_grid = draw_min_y / Tile.TILE_HEIGHT;
            for (int x = 0; x <= (panel.getSize().width / Tile.TILE_WIDTH) && x < max_X_Grid; x++) {
                for (int y = 0; y <= (panel.getSize().height / Tile.TILE_HEIGHT) && y < max_Y_Grid; y++) {
                    if ((x + x_grid >= 0 && y + y_grid >= 0) && (x + x_grid < max_X_Grid && y + y_grid < max_Y_Grid)) {
                        tileArray[x + x_grid][y + y_grid].drawTile(g, x, y);
                    } else {
                        g.setColor(Color.black);
                        g.fillRect(x * Tile.TILE_WIDTH, y * Tile.TILE_HEIGHT, Tile.TILE_WIDTH, Tile.TILE_HEIGHT);
                    }
                }
            }
        }
    }
```

Würde mich über jede Hilfe freuen 

mfg Timo


----------



## Fu3L (21. Jun 2011)

```
g.dispose();
```

Das solltest du am Ende der Methode nicht aufrufen, wenn mich nicht alles täuscht^^


```
tileArray[x + x_grid][y + y_grid].drawTile(g, x, y);
```

Die Methode könnte auch interessant sein. Sonst finde ich nichts verdächtiges^^


----------



## Marco13 (21. Jun 2011)

Misst du das mit dem TaskManager? Was der anzeigt hat mit dem "realen" Speicherverbrauch nur bedingt zu tun. Schau mal in deinem JDK-Verzeichnis unter /bin/jvisualvm.exe , damit kann man solche Sachen meist ganz gut analysieren...


----------



## TimoH. (21. Jun 2011)

@Fu3L
hier für dich die Methode 

```
public void drawTile(Graphics g,int x,int y){       
        if(img != null){
            g.drawImage(img, x*TILE_WIDTH, y*TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT, null);
        }else{
            g.setColor(c);
            g.fillRect(x*TILE_WIDTH, y*TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT);
        }
    }
```

@Marco13
Ja habe mit TaskManager gemessen... Ich schaul mir das mal an mit dem jvisualvm.exe an 

So hab das mal mit jvisualvm angeschaut. Auch da scheint der Heap langsam aber beständig zuwachsen. Wenn ich dann jedoch dort manuel den GC starte gehts sofort ziemlich runter... scheint als ob der GC bei mir nicht aktiv wird?


----------



## fastjack (21. Jun 2011)

Na irgendwann, wenn er möchte, wird er schon angehen. Messe doch mal den Speicher an bestimmten Punkten in deiner Anwendung, vielleicht bringt es etwas.


----------



## TimoH. (21. Jun 2011)

ach ich bin ein trop... hatte der anwendung über -xms und -xmx 4gb zugewiesen (um etwas zu testen) dann ist ja kein wunder dass der GC nicht anspringt


----------

