# Java Programm sauber beenden (Mac OS)



## TheFlash90 (13. Jul 2015)

Ich entwickle für meine Bachelorarbeit ein kleines Simulationsprogramm, welches unter anderem auch auf dem Simulationsframework MASON basiert. Als OS kommt Mac Yosemite zum Einsatz und als IDE IntelliJ Ultimate.
Die Simulation läuft mehrmals durch und ich kann das Programm auch mit IntelliJ ohne Probleme stoppen.
Je öfter jedoch die Simulationsschleife durchlaufen wird, umso langsamer und ruckeliger wird das ganze System. Am Ende stoppt das Programm auch, jedoch bleibt in meinem Dock immer noch ein Java Prozess hängen, den man nicht beenden kann, dadurch kann ich zum Beispiel auch den PC nicht mehr herunterfahren.
Ich hab schon alles mögliche ausprobiert, auch ein 
Runtime.getRuntime().halt(0); am Ende der Simulationsschleife schafft es nicht das Programm sauber zu beenden. In der Konsole bei IntelliJ wird zwar eine Beendigungsmeldung ausgegeben und auch das Programm an sich stoppt, aber es bleibt immer dieses "unsichtbare" Fenster zurück. Hat jemand eine Idee, wie ich das ganze komplett beenden kann?


----------



## Flown (13. Jul 2015)

Wie beendest du dein Programm? Arbeitest du mit Swing? Wie sieht dein Code aus beim Beenden deines Programms?


----------



## TheFlash90 (13. Jul 2015)

Die Struktur sieht so aus.
In meiner Main Methode starte ich die GUI

```
MainGui coevolutionGui = new MainGui();
```
Im Konstruktor von MainGui werden anschließend alle Swing/AWT Komponenten initialisiert und es gibt einen Button, welcher bei einem Click den Simulationsprozess startet:

```
Thread threadCoevolutionProject = new Thread(coevolutionProject);
            threadCoevolutionProject.start();
```
in coevolutionProject gibt es dann in der run() eine Schleife, die 10 mal ausgeführt wird.
Mein Ziel ist nun, am Ende der Schleife alles sauber zu beenden.

Das Problem ist auch, dass die Simulation mit jedem Durchlauf langsamer wird, ab dem 6. Lauf ruckelt es nur noch. Ich denke, dass die Ressourcen nicht richtig freigegeben werden, da nach jedem Lauf der Speicherbedarf enorm wächst, am Ende werden über 10GB belegt...


----------



## Flown (13. Jul 2015)

Nja ohne Code kann man dazu nichts sagen, warum was langsamer wird.


----------



## TheFlash90 (13. Jul 2015)

Mir geht es hauptsächlich um das saubere Beenden.
Naja das ist ein relativ großes Projekt mit einigen Klassen; ich kann ja schlecht den ganzen Code hier reinstellen.
Ich verstehe nur nicht, wieso sich das Programm nicht mehr beenden lässt wenn es oft durchgelaufen ist.
Habe es gerade noch einmal getestet : 5 Durchläufe, anschließend bei IntelliJ mit dem roten Viereck beendet. Kein Problem und alles beendet sich komplett.
10 Durchläufe, IntelliJ sagt mir alles wurde beendet, aber dieses "unsichtbare" Fenster, welches man nur im Dock sieht bleibt zurück.


----------



## Flown (13. Jul 2015)

Das könnte so ziemlich alles sein. Von einem Thread der immer weiterläuft, bis hin zu einem offenen Swingfenster mit falschen JFrame#setDefaultCloseOperation.
Der Debugger würde dir in deinem Fall helfen, was noch läuft uws. Aber Remote ist von unserer Seite nichts zu machen.


----------



## Thallius (13. Jul 2015)

Wenn Du CMD-alt-ESC drückjst erhälst du einen Task-Manager. Mit diesem kannst Du die laufenden Tasks killen wie in Windows auch.

Anscheinen werden die laufenden Thread nichts korrekt beendet. Wer dafür verantwortlich ist kann man ohne Code natürlich nicht sagen.

Gruß

Claus

P.S. Auch wenn das noch so ein großes Projekt ist, so muss dieser Fehler ja irgendwann reingekommen sein. In dem Moment must du ja wissen was du anders gemacht hast. Wenn das von Anfang an so war und Du es einfach ignoriert hast, dann würde ich sagen, dass machst du nächstes mal besser


----------



## TheFlash90 (13. Jul 2015)

Ja soweit war ich auch schon mit dem TaskManager, und dort sehe ich auch zweimal "AppMain", ein click auf "Sofort Beenden" bringt aber nichts...

Mein Projekt basiert auf einem anderen Projekt, sprich ich erweitere die Funktionalität. Ich habe davor das Projekt nie komplett durchlaufen lassen, da es zu lange gedauert hat, sondern es immer vorher beendet. Darum hab ich momentan gar keine Ahnung wo der Fehler stecken könnte.


----------

