Thread: was passiert nach run()?

Status
Nicht offen für weitere Antworten.

maseru

Mitglied
Hallo liebe Javagemeinde,

ich hab eine grundlegende Frage. Was passiert eigentlich mit einer Klasse, die von Thread abgeleitet ist und deren run() Methode endet :?:. Stirbt dann diese Klasse und der Garbage Collector gibt die Ressourcen frei. Es ist mir schon öfter aufgefallen, das trotz interrupt und finalize Aufruf, sowie System.gc() der Speicher den die Klasse benötigt nicht immer freigegeben wird.
Kann mir jemand darauf eine Erklärung geben?

mfg
maseru
 

André Uhres

Top Contributor
Der Thread stirbt und der Garbage Collector kann die Ressourcen freigeben.
Wann das geschieht ist weder definiert noch kann man es beeinflussen.
 

Oskar

Aktives Mitglied
André Uhres hat gesagt.:
Der Thread stirbt und der Garbage Collector kann die Ressourcen freigeben.
Wann das geschieht ist weder definiert noch kann man es beeinflussen.
Ist meines Erachtens nicht ganz korrekt. Nach run() stirbt der Thread. Ich kann allerdings weiterhin in meinem Program eine Referenz auf das Objekt haben auf dem die run() aufgerufen wurde. Dann existiert das Objekt so lange im Speicher bis ich diese Referenz wegräume.
maseru hat gesagt.:
Es ist mir schon öfter aufgefallen, das trotz interrupt und finalize Aufruf, sowie System.gc() der Speicher den die Klasse benötigt nicht immer freigegeben wird.
Dadurch kommt es dann auch dazu, dass der GC das Objekt nicht wegräumt.
 

maseru

Mitglied
okay
ich habe ein Server Client Anwendung geschrieben.
Der Client sendet ein Kommando an den Server, bsp Dekompression eines Bildes und sendet das Bild an den Client.
Dies geschieht durch Threads, damit mehrere Anfragen "gleichzeitig" bearbeitet werden können.
Sende ich nun n Anfragen an den Server, so belegen nun die Threads mit den dekomprimierten Bildern auf dem Server Speicher, obwohl die run Methode beendet und die Referenz auf null gesetzt wird (die Threads liegen in einer verketteten Liste und tragen sich kurz vor Ende der run Methode aus der Liste aus). Nun das Kuriose, sende ich danach einen Anderen Befehl , bsp. der Server soll n Bytes an den Client senden, wird der Speicher für die Threads derdekomprimierten Bilder freigegeben.
Obwohl die Threads für die unterschiedlichen Befehle identisch aufgebaut sind.
???:L
 

Oskar

Aktives Mitglied
maseru hat gesagt.:
Sende ich nun n Anfragen an den Server, so belegen nun die Threads mit den dekomprimierten Bildern auf dem Server Speicher, obwohl die run Methode beendet und die Referenz auf null gesetzt wird (die Threads liegen in einer verketteten Liste und tragen sich kurz vor Ende der run Methode aus der Liste aus). Nun das Kuriose, sende ich danach einen Anderen Befehl , bsp. der Server soll n Bytes an den Client senden, wird der Speicher für die Threads derdekomprimierten Bilder freigegeben.
Du willst damit sagen, dass der Speicher der zur Dekomprimierung der Bilder belegt wird in dem Moment wieder freigegeben wird, in dem du die andere Anfrage (n Bytes zu senden) an den Server stellst?

maseru hat gesagt.:
Sende ich nun n Anfragen an den Server, so belegen nun die Threads mit den dekomprimierten Bildern auf dem Server Speicher, obwohl die run Methode beendet und die Referenz auf null gesetzt wird
Nur das eine Referenz auf null gesetzt ist heist noch lange nicht, dass der GC das Objekt auch wegräumt. Dies geschieht automatisch nur dann wenn ein bestimmter Speicherbereich "vollgelaufen" ist. Der Aufruf System.gc() ist hier auch nicht verbinlich sondern nur eine Bitte an die JVM, dass der GC mal laufen sollte (such mal nach System.gc() im Forum, wurde schon häufiger behandelt).

Wenn du ein akutes Speicherproblem auf dem Server hast würde ich mal die Heapsize der JVM mittels eines der vielen -XParam Start-Parameter (kenne den genauen nicht --> Forumsuche) mal hochzusetzen.
 

Leroy42

Top Contributor
maseru hat gesagt.:
Nun das Kuriose, sende ich danach einen Anderen Befehl , bsp. der Server soll n Bytes an den Client senden, wird der Speicher für die Threads derdekomprimierten Bilder freigegeben.

Genau das ist ja auch Sinn der Sache: Wird neuer Speicher benötigt, räumt der GC vorher auf.
Ansonsten ist er faul genug sich zu denken: "Wieso überhaupt".

Fast wie im richtigen Leben: Ich kenne da ein Pärchen, daß seine Bude auch nur dann
richtig aufräumt, wenn Schwiegerteil-Besuch ansteht... :cool:

Ansonsten siehe Oskars Erklärung.
 

maseru

Mitglied
Danke Jungs :toll:
Allerdings dekomprimiere ich große Bilder (Jpeg2000), da wäre eine dynamische Speicherfreigabe nicht schlecht.
 

maseru

Mitglied
ja in diesem Beispiel sehe ich das auch ein. Nur nach dem Senden des Bildes exisitert beim Server keine Referenz mehr darauf .
 

Oskar

Aktives Mitglied
So um jetzt mal zu zeigen, dass ich hin und wieder Beiträge lese sei hier auch dieser Link zum Thema Weak-References angefügt. :roll:

Zwar bin ich noch nicht zur Lektüre des Inhaltes gekommen, aber vielleicht hilft es dir. Ich vermute es könnte deinem Speicherproblem abhilfe schaffen.

[edit] siehe auch diesen Eintrag im Forum
 

maseru

Mitglied
Hey ich hab ne Beobachtung gemacht, die mich in Erstaunen versetzt.
ich sende mehrere Anfragen an meinen Server.
ich überprüfe die Speicherbelegung mit Netbeans Profiler ->Speicherauslastung ca. 80MB
nach Abarbeitung der Anfragen Netbeans Profiler ->Speicherauslastung ca. 15MB
Windows TaskManager ->Speicherauslastung ca. 80MB
Wenn ich mein JFrame(Server-GUI) Minimiere und wieder Maximiere zeigt auch der TaskManager 15 MB an.
kurios oder?
 

Leroy42

Top Contributor
Ich vermute mal, daß dein Profiler dir jeweils den aktuell genutzten Speicherverbrauch
anzeigt, während der Taskmanager den insgesamt angeforderten Speicher anzeigt.

Ich weiß nämlich nicht, ob die JVM nicht mehr benötigten Speicher an das BS zurückgibt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
smarterToby Wie stoppe ich diesen Thread Allgemeine Java-Themen 4
A Thread.sleep Problem Allgemeine Java-Themen 2
J Thread started nur einmal Allgemeine Java-Themen 19
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
OnDemand Logfile pro User / Thread Allgemeine Java-Themen 7
OnDemand Thread / Service abbrechen Allgemeine Java-Themen 3
Thallius Ist meine static Helper Class Thread save? Allgemeine Java-Themen 9
P Swing Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: npoints > xpoints.length || npoints > ypoints.length Allgemeine Java-Themen 5
B Thread.sleep() in EJB Container wie lösen? Allgemeine Java-Themen 11
S Ist das Neuzuweisen von Feldern atomic und damit Thread-Safe? Allgemeine Java-Themen 2
S Exception in thread "main" java.lang.NullPointerException at FamilienApp.main(FamilienApp.java:15) Allgemeine Java-Themen 1
J Einen Thread in einer Schleife Allgemeine Java-Themen 2
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
Flynn Thread-Problem... Allgemeine Java-Themen 2
G Thread-Programmierung Allgemeine Java-Themen 5
S Datei wird nicht gefunden Thread.currentThread().getContextClassLoader().getResourceAsStream() Allgemeine Java-Themen 1
G Beendet sich der Thread selbst?! Allgemeine Java-Themen 3
mrbig2017 Sleep wird ignoriert und der Thread wartet nicht Allgemeine Java-Themen 1
S Thread beenden Allgemeine Java-Themen 9
M Array aus Thread Objekten erstellen Allgemeine Java-Themen 2
Aruetiise Swing JOptionPane ohne denn Thread zu pausieren Allgemeine Java-Themen 1
M Nanosekunden-Pause innerhalb einen Thread-Loops Allgemeine Java-Themen 3
E Thread Exception Allgemeine Java-Themen 6
javaerd Binomialkoeffizient ausrechnen, Exception in thread "main" java.lang.StackOverflowError Allgemeine Java-Themen 6
T Merkwürdiges Thread-Verhalten Allgemeine Java-Themen 6
K Thread Problem Allgemeine Java-Themen 6
W Thread sleep 30 sekunden - wenn keine Antwort bis dahin neu senden Allgemeine Java-Themen 2
H Thread bleibt stehen bei jar in jar Allgemeine Java-Themen 1
J Threads HTTP Request (Thread) dauert lange - in Android Allgemeine Java-Themen 3
F CPU Last eines Thread ausfindig machen Allgemeine Java-Themen 0
V Compiler-Fehler Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 125, Size: 125 Allgemeine Java-Themen 11
Tausendsassa Threads Einen Thread sich selbst schließen lassen Allgemeine Java-Themen 17
P Threads BufferedImage, Thread Concurrency Allgemeine Java-Themen 1
M Klasse in separaten Thread ausführen.Wie genau? Allgemeine Java-Themen 2
llabusch Thread blockiert Dialog Allgemeine Java-Themen 1
J Thread wait() Allgemeine Java-Themen 2
V Thread.sleep und InterruptedException? Allgemeine Java-Themen 1
G Thread nicht von GC zerstört Allgemeine Java-Themen 6
J Wie erschaffe ich einen sicheren Datenaustausch zwischen Thread und Nicht-Threads Allgemeine Java-Themen 8
Sogomn Thread blocken bis Taste gedrückt Allgemeine Java-Themen 5
T Starten vom Thread Allgemeine Java-Themen 3
T Wait/Notify() bei Thread Allgemeine Java-Themen 6
J Exception in thread "main" java.lang.NoClassDefFoundError Allgemeine Java-Themen 4
M Exception in thread "AWT-EventQueue-0" Allgemeine Java-Themen 6
Q Thread wacht nicht auf Allgemeine Java-Themen 7
T Fragen zum Thread-Thema Allgemeine Java-Themen 4
T Threads Input/Output im Thread - Datei ohne Inhalt Allgemeine Java-Themen 1
T Fragen zum Thread-Thema Allgemeine Java-Themen 9
C Threads Variablen in einem Thread Aktualisieren Allgemeine Java-Themen 17
U Thread beenden Allgemeine Java-Themen 3
W Threads Mit Thread und Runtime externe Programme öffnen Allgemeine Java-Themen 0
N Thread interrupt Status debuggen Allgemeine Java-Themen 6
A Thread: Code paralell ausführen in mehreren Instanzen Allgemeine Java-Themen 1
E Threads linkedlist/multi-thread problem Allgemeine Java-Themen 3
B Erkennen, wann Prozess beendet ist, dann Thread beenden. Allgemeine Java-Themen 6
A Thread Fehler absichtlich provozieren Allgemeine Java-Themen 3
B Threads Java Thread kommunizieren Allgemeine Java-Themen 12
N Thread Sicherheit im komplexen Datenmodell Allgemeine Java-Themen 7
K Thread richtig benutzen Allgemeine Java-Themen 3
K Exception in thread "AWT-EventQueue-1" Allgemeine Java-Themen 2
vandread Problem bei kleiner Thread-Übung Allgemeine Java-Themen 2
G Thread erzeugt nicht plausible NullPointerException Allgemeine Java-Themen 7
H Netbeans Warning bei Thread.sleep in Schleife Allgemeine Java-Themen 4
P [Thread] Scheint nicht Sequenziell zu Arbeiten Allgemeine Java-Themen 9
A eine test thread.join() frage Allgemeine Java-Themen 2
tuttle64 Verständnisprobleme mit Thread Locks Allgemeine Java-Themen 4
G Threads Thread bei Datenabfrage Allgemeine Java-Themen 3
S Thread anhalten per Button ? Allgemeine Java-Themen 3
E Thread Programmierung Allgemeine Java-Themen 2
S Threads ServerSocket-Thread soll schlafen, bis er gebraucht wird Allgemeine Java-Themen 2
V Thread schneller stoppen Allgemeine Java-Themen 2
V anstatt thread.join() einfach while schleife? Allgemeine Java-Themen 8
B Mausbewegung im Thread erkennen (hoch/runter) Allgemeine Java-Themen 6
G Linux/C++/Pthreads auf JVM zugreifen, thread safe? Allgemeine Java-Themen 10
K Threads Probleme mit Thread Allgemeine Java-Themen 13
K Threads Thread überprüfen Allgemeine Java-Themen 3
Z Threads Thread für einen Client Allgemeine Java-Themen 9
M Thread JavaFish Allgemeine Java-Themen 10
G Thread.sleep Allgemeine Java-Themen 12
M Threads Viele Aufrufe aus Thread, komisches Verhalten Allgemeine Java-Themen 8
B Threads Main Thread warten auf abgebrochen Task warten lassen Allgemeine Java-Themen 25
K Timer Thread Allgemeine Java-Themen 8
M Methoden Static Methoden und Thread??? Allgemeine Java-Themen 4
N java.lang.IllegalMonitorStateException: object not locked by thread before notify() Allgemeine Java-Themen 2
C Mehothode in anderenm Thread aufrufen Allgemeine Java-Themen 10
R Thread läuft nicht?! Allgemeine Java-Themen 7
R ThreadPool - vorhandene thread liste überprüfen bzw. aufräumen Allgemeine Java-Themen 3
J Anderem Thread Variable mitgeben Allgemeine Java-Themen 2
C Argument an einen Thread übergeben Allgemeine Java-Themen 4
S java.util.ConcurrentModificationException - aber nur ein Thread Allgemeine Java-Themen 3
G JUnit Test Methoden in anderen Thread verlagern Allgemeine Java-Themen 4
P Java Probleme - java.lang.Thread.run(Unkown Source) Allgemeine Java-Themen 10
L Im Thread auf Eingaben warten Allgemeine Java-Themen 3
P aus Thread auf Form zugreifen Allgemeine Java-Themen 9
C Threads Thread blockieren Allgemeine Java-Themen 4
K Threads Thread für Sleep Allgemeine Java-Themen 6
H Threads Thread stirbt aber Objekte in ihm leben weiter?! Allgemeine Java-Themen 9
K Threads Thread aktualisiert Progressbar nicht Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben