Ich habe eine Frage zu GC-Wurzeln. Ich habe gelesen, dass eine von GC-Wurzeln "Live-Thread" ist. Was bedeutet das? Ich hatte immer den Eindruck, dass jeder Thread seinen eigenen Stack hat und lokale Variablen eines Stacks GC-Wurzeln für Threads sind und jetzt bin ich verwirrt. Welche anderen Arten von Objektreferenzen, die nicht auf Frame-Stack oder nativem Stack liegen, hat die Thread-Repräsentation?
Eine andere Frage ist, ob die Sammlung junger Generation GC-Wurzeln verwendet oder nur für wichtige Algorithmen?
Danke
Aktualisierung: Ok, sorry, um es einfach zu halten: Ich habe diesen kurzen Artikel gelesen: yourkit.com/docs/java/help/gc_roots.jsp und es gibt eine "Thread" -Option als GC root, was genau bedeutet das, dass thread a ist GC-Wurzel? Auf welche Art von Objekten wird von Thread GC root verwiesen, auf die der Stack nicht verweist? Warum sind diese beiden Kategorien unterschiedlich?
Ich habe gelesen, dass einer der GC-Wurzeln "Live-Thread" ist. Was bedeutet das?
Ein Live-Thread ist ein Thread, der gestartet wurde und noch nicht beendet wurde.
Welche anderen Arten von Objektreferenzen, die nicht auf Frame-Stack oder nativem Stack liegen, hat die Thread-Repräsentation?
Keine.
Wenn sie sagen, dass ein (Live-) Thread ein GC-Root ist, meinen sie (effektiv) all der Werte in den Stack-Frames des Threads.
(Der "frame stack" und der "native stack" sind dasselbe.)
... was genau bedeutet das, dass Thread eine GC-Wurzel ist?
Dies bedeutet, dass der Stack des Threads ein GC-Root ist und der Inhalt aller Live-Variablen in allen Stack-Frames des Threads erreichbar ist.
Diese Dinge sagen alle effektiv dasselbe .
Stellen Sie sich eine Methode vor, bei der ein Java-Thread-Objekt lokal neu ist. Wenn die Methode das Objekt verlässt, ist sie verschwunden (die Referenz verlässt den Gültigkeitsbereich und alle Heap-Speicher, die für GC verfügbar sind). Wenn Sie in der gleichen Methode den Thread starten, ist die Live-Zeit dieses Thread-Objekts und alles, auf das es verweist, ebenfalls an die Lebensdauer des laufenden Threads gebunden. Bis der Thread beendet wird, ist noch Speicher, auf den vom laufenden Thread verwiesen wird, für GC nicht geeignet und der Thread wird als GC-Root bezeichnet.
Threads können Speicher auf zwei verschiedene Arten über den Stack oder den Heapspeicher zuweisen. Stack-Speicher wird nicht gecodiert, sondern zurückgewonnen, wenn der aktuelle Stack-Frame abgewickelt wird. Der Heap-Speicher wird normalerweise zugeordnet, wenn Sie in Ihrem Code "neu" verwenden (new bedeutet nicht immer Heapspeicher, siehe Escape-Analyse). Der Heap wird GC'ed.
Eine gute Möglichkeit, mehr über GC-Roots zu lernen, ist, einen Heap-Dump Ihrer laufenden Java-Anwendung zu machen und sie in Visual VM oder Eclipse MAT zu laden, von wo aus Sie die GC-Roots untersuchen können.
Die Sammlung junger Generationen würde GC-Wurzeln verwenden, da Objekte mit GC-Wurzeln nicht für GC infrage kommen, aber es wäre besser, in einem gegebenen Algorithmus zu sprechen.
Die JVM partitioniert ihre Threads, einige werden ausschließlich für die Garbage Collection verwendet, einige sind für andere interne JVM-Aufgaben vorgesehen und einige führen den vom Benutzer bereitgestellten Teil der ausführbaren Datei aus.
In diesem Kontext bedeutet erreichbar, dass der Benutzer die Ausführungsthreads erreicht. Dies umfasst den ersten Thread, der von public static void main(String[] args)
ausgeführt werden muss, und alle Threads, die von diesem Thread gestartet wurden, abzüglich derer, die nicht erreichbar oder vollständig sind.
Tags und Links java multithreading garbage-collection gc-roots