Out of Memory Problem

TimoTH

Mitglied
Hallo zusammen!
Ich habe ein recht merkwürdiges Problem. Und zwar wird aus irgendeinem Grund eine Methode undendlich oft ausgeführt, was dann letztendlich zu einem Speicherproblem führt.
Diese Methode wird aufgerufen:
Code:
public void objectMoved(Point p, String caller){
        this.point = p;
        System.out.println("objectMoved was called from:= "+caller);
        //dosomeCalculations
}

Die einzige Methode, welche die obengeannte aufruft ist diese:
Code:
private synchronized void editorMouseDragged(Point p,String caller){
        System.out.println("MouseDragged 1, caller = "+caller);
        if(selectedObj == null) return;
        System.out.println("MouseDragged 2, item:= "+selectedObj);
        
        if((oldxPos != -1)&&(oldyPos!= -1)){
            int dx = oldxPos - p.x;
            int dy = oldyPos - p.y;
            xPos -= dx;
            yPos -= dy;
        }
        System.out.println("MouseDragged 3");
        
        oldxPos = p.x;
        oldyPos = p.y;
        System.out.println("MouseDragged 4");
        
        selectItem.objectMoved(new Point(xPos,yPos),"editorMouseDragged");
        System.out.println("MouseDragged 5");
        }
        repaint();
    }

Die Ausgabe, welche dieses Programm nun liefert bringt mich echt zum Grübeln:
MouseDragged 1, caller = mouseListener
MouseDragged 2, item:= point1
MouseDragged 3
MouseDragged 4
objectMoved was called from:= editorMouseDragged
objectMoved was called from:= editorMouseDragged
... unzählige aufrufe
...
objectMoved was called from:= editorMouseDragged
MouseDragged 5
Irgendwann sprengen diese aufrufe aber den Heap. Es bringt auch nichts, diesen hochzusetzen. Und selbst wenn, würde dies das Problem ja auch nur umgehen...

Kann sich das also jemand erklären?

*gruß*
Timo

PS: ich arbeite mit java 1.4.2
 
Hallo,

es gibt 2 Möglichkeiten die ich kenne um den Speicher voll zu kriegen. Das ist einmal eine Rekursion die nie endet und eine oder mehrere Methoden die ewigviele Objecte in den Speicher lädt. In den Methoden die du gepostet hast, erkenne ich aber nichts von beidem.

Bist du sicher, dass es an diesen Methoden liegt?
Gibt einen StackTrace?
MFG

zEriX
 
Hallo!
Stacktrace gibt es keinen.. Nur die Meldung
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

Wenn ich die Methode editorMouseDragged auskommentiere, gibts es auch keine Probleme..
Ich kanns mir einfach net erklären, wieso editorMouseDragged so oft objMoved aufruft.. obwohl es keinerlei Schleifen o.ä. hat..
Die Anzahl dieser Aufrufe ist übrigens auch unterschiedlich.. manchmal wird der Heap gesprengt, manchmal auch nicht dann läuft das Programm minutenlang oder Probleme...

*gruß*
Timo
 
MouseDragged ist eine Eventhandler methode. dies ist der einzige Ort wo editorMouseDragged aufgerufen wird...
Code:
 addMouseMotionListener(new MouseMotionAdapter(){
            public void mouseDragged(MouseEvent e){
                editorMouseDragged(e.getPoint(),"mouseListener");
            }
        });
Der mouseListener wird übrigens einem JPanel hinzugefügt..

*gruß*
Timo
 
Also, wenn ich jetzt richtig denke, wird die mouseDragged immer aufgerufen, sobald man klickt und die Maus zieht und jedes mal wenn die maus dann bewegt wird.
Das einzige was ich mir mal vorstellen könnte, wäre das new Point().
selectItem.objectMoved(new Point(xPos,yPos),"editorMouseDragged");

Kommentier mal diese Zeile aus und versuch es nochmal.
 
Zuletzt bearbeitet:
Moin!
Nun wenn die Zeile auskommentiere, wird objectMoved() auch nicht mehr aufgerufen..., Ergo kein Speicherproblem mehr..
Aber was meinst du damit, es könnte an dem new Point() liegen? xPos und yPos sind (das hab ich bereits überprüft), völlig korrekte Werte..
Die Punkte, mit denen das Problem entsteht sind völlig unterschiedlich jedesmal.. aber während der unzähligen aufrufe ändert sich der Punkt nicht...

*gruß*
Timo
 
Ich hab es jetzt nicht überprüft, aber soweit ich weiß wird mouseDragged auch während der Mausbewegung aufgerufen. Das heißt dass dann auch jedes mal objectMoved aufgerufen wird, also auch jedes mal ein neues Point-Object angelegt wird, welches im Heap landet. Dadurch läuft der Speicher irgendwann voll.

Versuch es mal so
Java:
p.x = xPos;
p.y = yPos;
selectItem.objectMoved(p,"editorMouseDragged");

oder so

Java:
public void objectMoved(int x, int y, String caller){
        this.point.x = x;
        this.point.y = y;
        System.out.println("objectMoved was called from:= "+caller);
        //dosomeCalculations
}

Java:
selectItem.objectMoved(p.x, p.y,"editorMouseDragged");


MFG

zEriX
 
Ja so ein mist aber auch, ...das funktioniert :)
Da hätt ich noch ewig davorsitzen können, das wäre mir nie aufgefallen!

Besten Dank!
 
Hm, aber wenn editorMouseDragged immer wieder aufgerufen wird, müssten doch auch die Debugmeldungen (z.B. System.out.println("MouseDragged 4")) mehrmals ausgegeben werden... mysteriös.
 
Zurück