Java-Programm richtig neustarten?

Status
Nicht offen für weitere Antworten.

Verjigorm

Top Contributor
Und zwar habe ich folgendes Problem:

Als Idee zum Neustarten einer Applikation gibts nen Neustart-Button, welcher auf dem aktuellen Fenster ein dispose aufruft und dann die main(...) aufruft.

Klappt soweit auch. Nur ist mir dann im profiler aufgefallen, dass die zuvor geladenen Daten (~20mb) weiterhin im Speicher verharren. Wenn ich also "neustarte" und wieder die Daten lade, sinds dann 40mb Heapspace, nochmal neustarten und laden 60mb usw.

Ist zwar an sich nicht wirklich schlimm, da ich mal nicht davon ausgehe, dass das jemand 20mal hintereinander macht, aber mich interessiert nun doch die Frage:

Wie startet man eine Applikation denn aus sich heraus am saubersten neu und gibt nichtmehr benötigte Ressourcen frei??
Ein System.gc() an verschiedensten Stellen hat leider kein Erfolg gezeigt.

(Bitte fragt jetzt nicht nach einem lauffähigem Testprogramm :autsch:)

mfg Verjigorm
 
S

SlaterB

Gast
wenn du schon keins posten willst, dann mach ich mir den Spaß ;)

Code:
public class TestGUI
    extends JFrame
{
    static int count = 0;
    private int[] a = new int[5000000];

    public TestGUI()
        throws Exception
    {
        super("Nummer: " + count++);
        setSize(100, 100);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args)
        throws Exception
    {
        Runtime r = Runtime.getRuntime();
        for (int i = 10; i < 40; i++)
        {
            TestGUI g = new TestGUI();
            Thread.sleep(500);
            System.out.println(i+" mit : "+(r.totalMemory()-r.freeMemory()));
            g.dispose();
            g = null;
            System.gc();
            Thread.sleep(500);
            System.out.println(i+" ohne: "+(r.totalMemory()-r.freeMemory()));
        }
    }
}
ein Fenster braucht um die 20 MB,
mit System.gc ist die Ausgabe beispielsweise
Code:
10 mit : 20504528
10 ohne: 20560888
11 mit : 20557896
11 ohne: 20520304
12 mit : 40547472
12 ohne: 20496304
13 mit : 40607456
13 ohne: 20570112
14 mit : 40607664
14 ohne: 40508744
15 mit : 60635736
15 ohne: 20506544
16 mit : 40633536
16 ohne: 20506520
17 mit : 40633512
17 ohne: 20507328
18 mit : 40634320
18 ohne: 20507280
19 mit : 40634272
19 ohne: 20507280
ohne gc() bei mir beispielsweise
Code:
10 mit : 20504528
10 ohne: 20515040
11 mit : 40622512
11 ohne: 40622512
12 mit : 60668208
12 ohne: 60668208
13 mit : 60638480
13 ohne: 60638480
14 mit : 60641160
14 ohne: 60641160
15 mit : 60644456
15 ohne: 60644456
16 mit : 60647136
16 ohne: 60647136
17 mit : 60640048
17 ohne: 60640048
18 mit : 60642728
18 ohne: 60642728
19 mit : 60642728
19 ohne: 60642728
20 mit : 60645408
20 ohne: 60645408
21 mit : 60640048
21 ohne: 60640048
22 mit : 60640048
22 ohne: 60640048
23 mit : 60640048
23 ohne: 60640048
24 mit : 60640048
24 ohne: 60640048
25 mit : 60640832
25 ohne: 60640832
26 mit : 60640832
26 ohne: 60640832
27 mit : 60640832
27 ohne: 60640832
28 mit : 60643512
da wird also weniger aufgeräumt, trotzdem kommt es nicht (unbedingt) zur Exception,

vergrößere ich allerdings das Array z.B. auf 7000000,
so bekomme ich auch mit gc ne Exception:
Code:
10 mit : 28504528
10 ohne: 28657856
11 mit : 56629368
11 ohne: 28590008
12 mit : 56632912
12 ohne: 56509936
13 mit : 28631856
13 ohne: 28590160
14 mit : 56633064
14 ohne: 56508512
15 mit : 28632664
15 ohne: 28506672
16 mit : 56633664
16 ohne: 56510432
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
es sollte also mindestens Speicher für drei Kopien da sein, vielleicht auch 10,

das ist jetzt keine wissenschaftliche Aussage ;),
aber zumindest erhöht sich der Bedarf nicht beliebig, es wird auch freigeräumt


> Wenn ich also "neustarte" und wieder die Daten lade, sinds dann 40mb Heapspace, nochmal neustarten und laden 60mb

wenn du nur den angeforderten Speicher des Programms meinst, dann kann das ja gut sein,
neuen freien Speicher zu belegen ist immer leichter als alten aufzuräumen,
begrenze den Speicher des Programmes,
so viel wie ihm zusteht, wird es doch wohl auch voll nutzen dürfen
 

Ladi

Mitglied
Hallo Verjigorm,

erstens, es fällt mir für die Idee eine laufende Anwendung aus ihr selbst neuzustarten kein Grund ein. Es schaut mir nach einem Workaround für ein richtiges Problem, welches man nicht finden kann. Hast du ein Problem mit einem Mamory Leak, dann schau nach einem Profiler.

Folgede Info für dich:

Du beendest ja nicht die virtuelle Machine, d.h. alles was die sich geladen hat bleibt im Speicher. Hierzu gehört folgendes:
- Klassen
- Alle statischen Daten - verwendest Du z.B. statische Caches, bleiben diese im Speicher geladen solange JVM läuft.

Diese werden (wenn nicht entsprechend programmiert) auch nicht vom Garbage Collector beseitigt.

Vielleicht wäre es sinnvoll, wenn Du hier schreibst, warum du diese Aktion überhaupt machen willst.

Gruß
Ladi
 

Ark

Top Contributor
Ein Aufruf von main() ist nur ein weiterer Aufruf von main() und daher einem Neustart nicht einmal im Ansatz ähnlich. Initialisierungen in static-Blöcken werden beispielsweise nicht mehr vorgenommen. Und selbst, wenn dein Programm beim "Neustart" keine weiteren Ressourcen benötigen würde: der Call-Stack wächst trotzdem an. Gekürzt sieht deine Situation also wie folgt aus:
Code:
public static void main(String[] args){
    main(args);
}
Ich erinnere mich, dass man irgendwie/irgendwo festlegen konnte, was als allerletzter Befehl (quasi direkt nach Beenden von java) ausgeführt werden soll. Dort müsstest du dann den Start deiner Anwendung als Befehl angeben. Wie aber schon gesagt wurde, sollte man versuchen, solche Probleme grundsätzlich zu vermeiden.

Ark
 

Verjigorm

Top Contributor
Jo, das Memory Leak ist ja das Problem:

Die Applikation lädt Firmendaten (~20mb).
Lädt man nun 5-6 Firmen nacheinander ein, braucht das Ding gut 200MB Heapspace.
Das war bisher kein Problem, aber nun wurde ein Webservice hinzugefügt, der diese geladenen Daten (nur jeweils dieses eine letzte 20mb-file) in ein byte-Array umwandelt und verschickt.

Was an sich auch funktioniert, SOLANGE man VORHER nicht zuviel HeapSpace angestaut hat. Lädt man erst 6-7mal irgendwelche Daten ein (was bei normalem Arbeitsbetrieb ständig ist) dann kommt irgendwann HeapSpace-Exception

Da ich das Grundprogramm nicht kenne, sondern nur den Webservice eingefügt habe, habe ich extrem wenig Plan von dem Laden/Speichern und so.
Dachte ich könnte das Problem einfach übergehen, indem die Applikation vorm Laden neugestartet wird, war aber nicht der Fall.

Edit: meinen verbrauchte Heapspace beim konvertieren und verschicken der Daten kann ich nach dem Senden auf ein Minimum wieder reduzieren.
Setze alle Referenzen auf null und ruf den GC auf.
Auf den Speicherverbrauch vorher hab ich halt wenig Kontrolle.
 

Ladi

Mitglied
Hallo Verjigorm,

falls Du die fehlerhafte Anwendung im Griff hast, würde ich mir auf jeden Fall überlegen die zu profilieren. Memory leaks sind in Java mit den richtigen Tools sehr schnell und einfach zu finden. Meistens handelt es sich um zyklische Referenzen, oder falsch programmierte Caches.

Falls Du ihn nicht im Griff hast und auf dem Neustarten bestehst, würde ich es wahrscheinlich vom aussen mit Betriebssystemmitteln stricken.

Oder probiere den Tipp vom Ark zu verfolgen.

Gruß
Ladi
 

Ark

Top Contributor
Mit
Code:
java.lang.Runtime.addShutdownHook(Thread hook)
kannst du sowohl bei "normalem" Beenden als auch bei Abstürzen (Errors/Exceptions) garantieren, dass ein Befehl ausgeführt wird. Dazu musst du nur für hook einen Code programmieren, der beispielsweise mit
Code:
exec(String[] cmdarray)
dein Programm wieder startet. Probiert habe ich das allerdings noch nicht, die Dokumentation dazu habe ich auch nur überflogen.

Ark
 

Campino

Top Contributor
Ark: Ich hab mal in einem Programm, das auf eine Datenbank zugriff die DB- Connection in so einem Hook geschlossen um ganz sicher sein zu können, das ich das auch nicht vergesse, dass klappte eigentlich ganz gut.
 

FArt

Top Contributor
Ark hat es schon gesagt: der "Neustart" über main() ist Käse. Vom GC wird alles abgeräumt, was nicht mehr referenziert wird. Vermutlich hast du irgendwelche static-Felder, die die alten Daten noch refernzieren.
Kümmer dich um das Problem, und du kannst ohne "Neustart" beliebig oft neue Firmendaten einlesen.
 
D

dev/null

Gast
Was Du auch machen könntest wäre z.B. eine 2te Jar, die nur den Zweck hat Dein Hauptprogramm neu
zu starten.

Dann könntest Du so was machen wie

Code:
Runtime.getRuntime().exec("java -jar " + Pfad);
System.exit(1);

Und in deinem Jar fürs neu starten dann halt das gleiche nur mit dem Pfad zu deiner eigentlichen Anwendung.
Damit wird die VM beendet, also wenn vorher noch etwas gespeichert oder geschlossen werden soll, dann besser
vorher machen.

Nur so auf die schnelle ne Idee, gibt bestimmt elegantere Lösungen, aber sollte klappen.

mfg
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Wie liefere ich mein Java-Programm richtig aus? Allgemeine Java-Themen 10
E Output Fehler (Java-Programm Kuchen) Allgemeine Java-Themen 11
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
A Java Programm erstellen hilfe Allgemeine Java-Themen 10
B Java Programm auf virutellem Desktop laufen lassen? Allgemeine Java-Themen 1
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
J c Programm läuft nicht in compilierter Version des Java Projektes Allgemeine Java-Themen 7
Dann07 Java-Programm findet DLLs nicht! Allgemeine Java-Themen 20
P USER Management in SQL übergreifend auf JAVA Programm Allgemeine Java-Themen 41
D Verkauf von einem Programm welches ich in Java geschrieben habe Allgemeine Java-Themen 4
D Boolean von ein anderem Java Programm während der Laufzeit ändern Allgemeine Java-Themen 23
L Excel Datei löscht sich selbst im Programm - Java Allgemeine Java-Themen 3
ralfb1105 Starten Java App(s) (.jar) aus einem Java Programm Allgemeine Java-Themen 18
temi Java Programm aus einer DB laden und starten Allgemeine Java-Themen 2
E Java Programm mit Clients erweitern - Möglichkeiten? Allgemeine Java-Themen 2
J Java "Bank Programm" Brauche eure Hilfe Allgemeine Java-Themen 3
S Java Programm (Spiel mit den Boxen) Allgemeine Java-Themen 1
A Java Programm verbessern/vereinfachen Allgemeine Java-Themen 20
E Mit Java ein Python Programm starten Allgemeine Java-Themen 20
Q-bert Daten von Java Programm speichern Allgemeine Java-Themen 4
P Schnittstelle java Programm zu Webserver / Browser Allgemeine Java-Themen 2
Blender3D Java Swing Programm Windows 10 Autostart Problem Allgemeine Java-Themen 2
F Java-Programm lizensieren Allgemeine Java-Themen 21
T Java Programm in Internetseite? Allgemeine Java-Themen 4
T Java Programm frisst RAM Allgemeine Java-Themen 6
H Alter Java-Programm läuft nicht mehr. Laut strace fehlt libpthread.so.0 Allgemeine Java-Themen 3
L Java-Programm Zahlenkombinationen ausgeben Allgemeine Java-Themen 10
T Java Programm sauber beenden (Mac OS) Allgemeine Java-Themen 7
F In OSX: Java-Programm über URI-Scheme aufrufen mit Parameter? Allgemeine Java-Themen 0
itwestnet Mein Java-Programm läuft nicht in China Allgemeine Java-Themen 4
B SMS von Vodafone Mobile Connest mit JAVA-Programm lesen Allgemeine Java-Themen 0
J Java Auf anderes Programm warten Allgemeine Java-Themen 9
R Java .class-File-Konstrunkt mit Programm visualisieren Allgemeine Java-Themen 18
Developer_X OpenStreetMap in Java Programm einbinden Allgemeine Java-Themen 10
Developer_X Java Programm Beenden Allgemeine Java-Themen 3
T Dateien zur Laufzeit in Java-Programm packen? Allgemeine Java-Themen 3
S Java-Programm verbraucht zu viel RAM Allgemeine Java-Themen 8
S Java-Programm für "Börsenanalyse" schreiben Allgemeine Java-Themen 4
U Eclipse Java Programm beschädigt .tar.gz dateien beim Entpacken Allgemeine Java-Themen 7
M Problem mit (etwas komplizierterem) Java Programm Allgemeine Java-Themen 14
L Prüfen, ob Programm über 32bit oder 64bit Java ausgeführt wird Allgemeine Java-Themen 4
J Java Programm - ausführbare Jar Datei erstellen Allgemeine Java-Themen 2
C Programm von C++ auf Java umschreiben Allgemeine Java-Themen 27
J Java-Programm Allgemeine Java-Themen 13
I Java-Programm: Zahlen in Worte Allgemeine Java-Themen 22
P Check, welche Java Version installiert bevor ein Programm ausgeführt wird. Allgemeine Java-Themen 12
Java-Insel Wie kann ich ein Java-Programm zum "automatischen Öffner" einer Dateisorte machen? Allgemeine Java-Themen 13
O Java-Programm lastet CPU aus Allgemeine Java-Themen 8
C Registration im Web mit Java-Programm durchführen Allgemeine Java-Themen 6
R Java Programm beenden mit SIGTERM Allgemeine Java-Themen 9
T Java Programm als Batch Befehl Allgemeine Java-Themen 6
G Runtime.exec beendet Programm unter Linux, wenn Java Programm beendet wird Allgemeine Java-Themen 3
H Java-Programm nur mit SDK ausführbar? Allgemeine Java-Themen 5
C Java Programm über SSH starten Allgemeine Java-Themen 16
S jar Datei mit Java Programm öffnen Allgemeine Java-Themen 3
J Java-Programm im Hintergrund Allgemeine Java-Themen 3
Jackii Java Programm aus anderen Java Programm starten Allgemeine Java-Themen 20
Madlip Erste Schritte Java speichert Daten im Programm?!? Allgemeine Java-Themen 9
G Java Programm aus Java Programm starten Allgemeine Java-Themen 6
M Wie Java Programm mit grafischen Oberfläche versehen Allgemeine Java-Themen 2
JAVATUX Java Programm mit ATI Stream Unterstützung Allgemeine Java-Themen 3
J Java programm lässt sich in win7 nach linux install nicht mehr ausführen Allgemeine Java-Themen 18
C Mit Java in einem anderes Programm eingreifen Allgemeine Java-Themen 21
S C++/C KeyListener zusammen mit Java Programm Allgemeine Java-Themen 4
S Java Programm -System Neustart überleben? Allgemeine Java-Themen 3
S Brauche Hilfe bei Planung für JAVA-Programm Allgemeine Java-Themen 3
T Java Programm aus anderem Java Programm starten Allgemeine Java-Themen 13
J Eclipse Java Programm aus anderem Java Programm starten Allgemeine Java-Themen 14
F Anderes Java-Programm aufrufen Allgemeine Java-Themen 2
B Excel Datei in einem Java Programm mit GUI darstellen Allgemeine Java-Themen 9
M Java Programm als Dienst starten... Allgemeine Java-Themen 4
A Installation von Java ME Programm auf Sony Ericsson Handy Allgemeine Java-Themen 3
M Rein informativ - Daten aus Excel-Tabelle in Java-Programm importieren Allgemeine Java-Themen 3
J Installer für Java-Programm Allgemeine Java-Themen 5
N Programm starter in Java? Allgemeine Java-Themen 12
X Aus Java Applikation externes Programm starten Allgemeine Java-Themen 3
T Mit JNI von C++ auf ein laufendes Java-Programm zugreifen Allgemeine Java-Themen 10
H aus Java-Programm Dateien öffnen Allgemeine Java-Themen 5
Z Java Programm - xxxxx auf der Konsole ausgeben Allgemeine Java-Themen 4
T cpp Programm via jna in java nutzen Allgemeine Java-Themen 3
M Variablen an Java-Programm übergeben Allgemeine Java-Themen 3
G Java Programm mit Freischalt code entwickeln Allgemeine Java-Themen 30
clupus Meldung an laufendes Java-Programm schicken - Wie? Allgemeine Java-Themen 6
E Zweites Java Programm sichtbar starten Allgemeine Java-Themen 4
T Mit Java Programm auf Firefox zugreifen Allgemeine Java-Themen 2
Airwolf89 *.exe mit java programm ausführen Allgemeine Java-Themen 1
V Java-Programm automatisch starten Allgemeine Java-Themen 2
MQue aktuelle Wetterdaten für Java- Programm Allgemeine Java-Themen 9
O Programm mittels Java installieren Allgemeine Java-Themen 15
K Java Chat Programm Allgemeine Java-Themen 2
M Java programm über cmd öffnen Allgemeine Java-Themen 2
Schandro Datei öffnen mit... Bestimmten Dateityp mit einen Java-Programm öffnen lassen Allgemeine Java-Themen 5
N Per Java-Programm onClick ausführen Allgemeine Java-Themen 5
D mit Java das Programm "Editor" öffnen Allgemeine Java-Themen 7
M Wie Java-Programm über Batch-file starten? Allgemeine Java-Themen 8
G Logikhindernisse im Java- Programm Allgemeine Java-Themen 6
V Java-Programm nur "mit halber Kraft" arbeiten lass Allgemeine Java-Themen 11
_SeiA_ Hilfe Kleines Java Programm schreiben. Summen. Allgemeine Java-Themen 3
G Java- Programm mit bat- Datei starten Allgemeine Java-Themen 16
G JDBC Programm und niedrige Java-Versionen Allgemeine Java-Themen 14

Ähnliche Java Themen

Neue Themen


Oben