Ich habe eine Frage bezüglich der Threads, die meine Anwendung während der Ausführung und ihres Status erzeugt.
Ich habe eine Swing-Anwendung und in einigen Testszenarien habe ich ein paar seltsame Verhaltensweisen festgestellt, die Java VisualVM verwenden. Wenn ich mein Programm für 30 Minuten laufen lasse und nichts tue (gerade gestartet und es laufen lassen), fällt mir folgendes auf:
Zuallererst, in der Registerkarte "Threads" sehe ich viele lebendige Threads.
Lesen (unter anderem)
Standardthreads wie, DestroyJavaVM, Referenzhandler, Signal Dispatcher und Was sind diese Threads? welche werden aktiviert, wenn eine Java-Anwendung ihre Ausführung beginnt? Ich verstehe, dass die meisten dieser Threads einen sehr guten Grund haben, dort zu sein. (Ich versuche immer noch, die "RMI TCP" zu finden)
Ich habe jedoch Zweifel an ihrem Zustand. Ist es normal, dass die ersten sechs von ihnen zu 100% im Running-Zustand waren?
Könnte einer dieser Threads auch einen Haufenverbrauch wie den folgenden erklären?
Ich habe bemerkt, dass viele Instanzen von HashMap $ Entry und TreeMap $ Entry von Bibliotheken referenziert und erstellt werden, die von sun.rmi. * stammen, und ich dachte, dass sie mit den "RMI TCP" -Threads zusammenhängen könnten ...
Last but not least, wenn ich versuche, meinen Haupt-JFrame zu entfernen (), wird der Rahmen selbst verschwinden, aber die Anwendung läuft noch ... könnten diese Threads der Grund (oder ein Teil davon) sein?
Danke euch allen.
Ich versuche immer noch, die "RMI TCP" -Einheiten herauszufinden
Diese Threads werden verwendet, um JMX-Verbindungen über RMI zu akzeptieren und zu verarbeiten. Sie verwenden gerade einen, wenn Sie sich JVisualVM ansehen. Haben Sie Ihre IP im Namen des Worker-Threads bemerkt?
Ich habe jedoch Zweifel an ihrem Zustand. Ist es normal, dass die ersten sechs von ihnen zu 100% im Running-Zustand waren?
Nur weil der Thread runnable ist, heißt das nicht, dass läuft und CPU-Zeit verbraucht. Zitieren Thread.State
:
NEU - Ein Thread, der noch nicht gestartet wurde, befindet sich in diesem Status.
RUNNABLE - Ein Thread, der in der Java Virtual Machine ausgeführt wird, befindet sich in diesem Status.
BLOCKED - In diesem Status befindet sich ein Thread, der blockiert ist und auf eine Monitorsperre wartet.
WARTEN - In diesem Status befindet sich ein Thread, der unbegrenzt auf die Ausführung einer bestimmten Aktion durch einen anderen Thread wartet.
TIMED_WAITING - In diesem Status befindet sich ein Thread, der darauf wartet, dass ein anderer Thread eine Aktion für eine bestimmte Wartezeit ausführt.
TERMINATED - Ein Thread, der beendet wurde, befindet sich in diesem Status.
Wie Sie sehen können, erwähnt diese Liste nicht das Warten auf I / O-ähnliche Sockets. Threads, die diese Aufgabe ausführen, sind weiterhin als runnable markiert. Ein klares Warten auf Daten verbraucht keine CPU. Auch die Thread akzeptierenden Verbindungen sind runnable , während es nichts tut. Es wird aufgeweckt, wenn der Client versucht, eine neue Verbindung herzustellen.
Könnte einer dieser Threads auch einen Haufenverbrauch wie den folgenden erklären?
Ihr Haufenverbrauch ist normal und gesund. Die Sägezahnform wird durch die Müllsammlung verursacht, die nicht mehr benötigte Objekte entfernt. JVM stellt außerdem fest, dass der Verbrauch Ihres Heapspeichers ziemlich konstant ist, so dass die maximale Größe des Heapspeichers immer kleiner wird, da er denkt, dass Sie nicht so viel benötigen (orangefarbenes Diagramm).
Last but not least, wenn ich versuche, meinen Haupt-JFrame zu entfernen (), wird der Rahmen selbst verschwinden, aber die Anwendung läuft immer noch .... könnten diese Threads der Grund (oder ein Teil davon) sein?
Das liegt daran, dass Sie nur ein JFrame
schließen, aber nicht die gesamte Anwendung. Der Swing-EDT ( Event-Dispatching-Thread ) wird noch ausgeführt. Das hat aber nichts damit zu tun. Verwenden Sie einfach:
auf Ihrem Hauptrahmen.
Ihre Anwendung ist völlig in Ordnung , wenn Threads und Speicherverbrauch berücksichtigt werden. Mach dir keine Sorgen!
Tags und Links java multithreading memory-management