Ich wurde in einem Interview folgende Frage gestellt: "Wie lautet die Standardpriorität des Garbage Collection-Threads?" Ich weiß, dass wir einen GC nicht erzwingen oder seine Priorität ändern können, obwohl ich nie von seiner Standardpriorität gehört habe. Weiß jemand?
Wahrscheinlich war die Antwort, die der Interviewer suchte, dass der GC in einem Hintergrundprozess mit niedriger Priorität ist. Der Grund dafür ist, dass das Ausführen des GC teuer ist, aber es ist (normalerweise) kein kritischer Prozess, also sollte es nur durchgeführt werden, wenn das System Zeit hat, dies zu tun, anstatt kritische Aufgaben zu unterbrechen. (Eine ähnliche Idee existiert in Echtzeitsystemen - machen Sie die unwichtigen Prozesse in der Hintergrundaufgabe und alle kritischen Prozesse im Vordergrund - alle haben eine höhere Priorität als die Hintergrundaufgabe.)
Wenn Sie Sun-Literatur zur Garbage Collection lesen, ist GC als Thread mit niedriger Priorität nicht richtig richtig. In Wirklichkeit ist der GC möglicherweise nicht nur ein einzelner Thread. Stattdessen wird der GC ausgeführt, wenn die Speicherkapazität niedrig ist (obwohl das Bestimmen, wann der Speicher niedrig ist, wahrscheinlich immer noch in einem Hintergrundthread erfolgt - möglicherweise kann dies jemand anders klären).
Hier sind einige gute Links zum Lesen auf GC:
Ich würde sagen, die richtige Antwort auf diese Frage lautet: "Wenn Sie denken, dass Sie sich um die Thread-Priorität des Garbage Collectors kümmern müssen, tun Sie wahrscheinlich etwas falsches".
Denken Sie daran, dass die Threadpriorität nicht unbedingt direkt damit zusammenhängt, wie viel CPU-Zeit ein Prozess erhält. Es variiert von System zu System, aber unter Windows wird die Threadpriorität im Wesentlichen verwendet, um den ORDER zu ermitteln, in dem auf die verfügbaren CPUs wartende Threads geplant werden, sodass Threads mit hoher Priorität Threads mit niedriger Priorität vorgreifen können unter der Annahme, dass beide Threads tatsächlich um die CPU konkurrieren. Es gibt keine echte Regel, CPUs mit niedrigerer Priorität weniger CPU-Zeit zu geben. (Für Linux lohnt sich ein direkter Zusammenhang zwischen den Threadprioritäten (nice values) und der zugewiesenen CPU-Zeit.)
Wenn Thread-Prioritäten wie in Windows verwendet werden, kann für einen Hintergrund-Thread wie einen Garbage Collector eine geeignetere Lösung - vielleicht paradoxerweise - eine HIGH-Priorität erhalten und dann den Anteil der CPU-Auslastung durch andere steuern bedeutet (im Wesentlichen absichtlich für angemessene Zeitanteile schlafen oder auf entsprechende Signale warten). Insbesondere ist die hohe Priorität für einen Hintergrund-Thread geeignet, der die meiste Zeit nichts tun muss, aber wenn es etwas tun muss, muss es dies so schnell wie möglich tun.
Ich habe tatsächlich nicht untersucht, welche Thread-Prioritäten, wenn überhaupt, durch bestimmte Speicherbereinigungsalgorithmen verwendet werden. Aber mein Punkt ist, dass die Situation etwas komplex ist und es seltsam erscheint, Annahmen über das Verhalten des Garbage Collectors auf Thread-Prioritäten zu basieren.
Wer sich mehr für Thread-Prioritäten interessiert, kann sich einige Messungen der Auswirkungen von Thread-Prioritäten ansehen das ich - zugegebenermaßen vor ein paar Jahren jetzt und dieses Material könnte mit aktualisiert werden.
Update: Durch Zufall wurde ein Vortrag von Cliff Click auf YouTube gepostet gestern. Ungefähr 35 Minuten später erwähnt er genau diesen Punkt, dass bestimmte JIT- und GC-Threads hohe Priorität haben müssen, damit sie nicht ausgehungert werden.
Vielleicht ging es bei der Frage um die tatsächliche Umsetzung der JVM. Wie Sie in Online-Referenzen lesen können, gibt es mehrere Möglichkeiten, einen Garbage Collector zu implementieren und es kann von Version zu Version wechseln. Deshalb sagt Ihnen jeder, dass Sie sich nicht auf das Verhalten des GC verlassen sollten. Es könnte auf einer anderen JVM anders funktionieren.
Zumindest in Java RTS kann die Priorität der Garbage Collection-Threads je nach Bedarf angepasst werden. Die Prioritätsanpassung (und die Thread-Planung im Allgemeinen) ist bei mehreren CPUs auch etwas anders als bei nur einer.
Im Moment nehme ich eine Konfiguration mit mehreren CPUs an, da dies (bei weitem) am häufigsten ist. Ich spreche auch nur über den Standard-Scheduler - andere Scheduler können Dinge ganz anders machen. Ihre Threads fallen grundsätzlich in zwei Klassen: kritische und nicht-kritische Priorität (Sie können auch "No-Heap-Echtzeit" -Threads haben, die höher als beide sind, aber da sie den Heap nicht verwenden können / können) haben wenig Relevanz für GC). Die Garbage-Collection-Threads laufen normalerweise mit einer niedrigeren Priorität als diese, aber kann bei Bedarf auf eine höhere Priorität als Ihre nicht-kritischen Threads angehoben werden. Die GC-Thread-Priorität bleibt jedoch immer niedriger als die Ihrer kritischen Echtzeit-Threads.
Ich habe aus einem bestimmten Grund ein wenig vage über die Abgrenzung zwischen "kritischen" und "nicht kritischen" Prioritäten gesprochen: das ist für das Tuning offen. Sie können auswählen, welche Prioritäten Ihrer Threads vom GC ausgeschlossen werden können und welche nicht. Die Absicht ist, dass kritische Threads eine harte Echtzeitantwort erhalten und nicht kritische Threads eine weiche Echtzeitantwort erhalten. Es liegt an Ihnen zu entscheiden, welche Threads in welche Kategorie fallen.
Tags und Links java multithreading garbage-collection thread-priority