PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Speicherfresser



Jor
27-12-2005, 13:19
Hallo zusammen,

wenn ich in meine Anwendungen kompiliere und test, so bleibt stets ein mehr oder weniger grosses Stück vom Arbeitsspeicher belegt (bei jedem Aufruf). Der GC soll doch so etwas bereinigen, tut er auch, aber erst nach dem ich Eclipse geschlossen habe. In der Anwendung wird per "System.Exit(0)" bzw. dem WindowListener geschlossen (JFrame).
kann dem mit einem DeKonstruktor abhelfen, oder wie gehe ich die Sache an?

McFraggle
28-12-2005, 12:52
Hallöchen!

Erstens:
Anwendung wird per "System.Exit(0)" bzw. dem WindowListener geschlossen (JFrame).Was heißt das "bzw." genau? Wird immer mit System.Exit(0) beendet? Zeigt Eclipse an, dass das Programm terminiert ist?

Zweitens:
Ich bin mir recht sicher, dass es bei Java keine Destruktoren gibt. Ein solches Konzept sollte bei Java nicht notwendig sein.

mwanaheri
28-12-2005, 18:57
probier es mal mit dispose() bzw. DISPOSE_ON_CLOSE, das kommt dem Destruktor schon sehr nahe. Das Problem dürfte aber auch daran liegen, dass eclipse ja eine Verbindung zu dem Programm hält, die auch erst abgebaut werden muss. Der verbrauchte Speicher dürfte nach einer Weile vom Garbage-Collector wieder frei gegeben werden. Läuft das Programm eigenständig, wird die virtuelle Maschine beendet und somit aller Speicher freigegeben. Alles andere wäre ein bug im Java-Interpreter.

Lin728
29-12-2005, 15:36
Ich frag mich wie du herausfindest, dass java arbeitsspeicher nicht freigiebt.

Java verwaltet speicher selbst, d.h. es fragt das Betriebsystem nach einem großen, zusammenhängenden Stück Speichers und fuhrwerkt dann da drinnen herum.

Dass der Speicher den Eclipse belegt immer ein wenig größer wird ist normal:
* Muss oft der GC laufen wird der Heap wenn schon eng ist vergrößert
* Maschinencode vom JIT

Dass der heap hingegen wieder kleiner wird, passiert selten um mögilche negative einflüsse der JVM auf programme mit ungewöhnlichen speicherbedürftnissen zu haben.

Jor
03-01-2006, 07:22
Hallo zusammen,
danke für die Antworten! Warum ist der Taskmanager nicht geeignet? Ich kann doch da sehen, wieviele Prozesse, gebunden an meine Entwicklungsumgebung, laufen und wieviel Speicher belegt wird...
Bei jedem Kompilieren wird ein Prozess erzeugt, der wird aber nach dem Beenden der gestarteten Anwendung nicht freigegeben, sondern erst, wenn ich Eclipse schliesse. Men Rechner wurde doch schon arg langsam. Das Schliessen erfolgt immer per System.Exit(0) mittels einer Schaltfläche, oder über die Eigenschaft des kleinen Kreuzchen oben rechts in einem JFrame. Das JFrame hat diese Methode doch direkt implementiert, was dabei genau augerufen wird weiss ich aber nicht.
Die Anwendung ausserhalb von Eclipse laufen lassen, wird noch einwenig dauern, sie ist noch nicht so weit.
Nochmal Danke.:)

McFraggle
03-01-2006, 16:46
Hi Jor!
Nö nö, auf Kreuchen klicken beendet die Anwendung nicht! :) Das Fenster wird nur unsichtbar. Bei der Console-View etwa ist ein kleiner Kasten. Dieser ist rot, wenn die Anwendung noch läuft und der dahinter liegende Button dient dem Terminieren der Anwendung.
Um das Fenster auf Kreuz-Klick hin zu schließen gibt es zwei Möglichkeiten:
1. Melde einen Window-Listener bei dem JFrame an und mache Dein System.exit in der Methode windowClosing.
2. Sage dem Fenster direkt, dass es sich bei Kreuz-Klick schließen soll. das geht so:

deinJFrame.setDefaultCloseOperation(JFrame.EXIT_ON _CLOSE);

Jor
06-01-2006, 11:24
Hallo McFraggle,

jep, bisschen spät, aber ich habe deinen Eintrag erst grade entdeckt, danke!
Ich werde den Tipp und vor allem den Code umsetzen, auf das meine
Fensterchen, natürlich nur bei Wunsch, verschwinden. ;)

Have a nice weekend!