2015-12-23 3 views
5

Beim Profiling meiner Anwendung stieß ich auf ein seltsames Verhalten - der DestroyJavaVM-Thread läuft IMMER - 100% der Zeit.DestroyJavaVM Thread läuft IMMER

enter image description here Nach einer wenig Forschung über das Thema zu tun, auf denen gibt es kaum wertvolle Informationen online, alles, was ich verstand, dass dieser Thread zu unload the JVM upon exit soll.

Wenn das der Fall ist, warum ist dieser Thread im RUNNING-Zustand 100% der Zeit vom ersten Moment an, an dem ich meine Anwendung starte? Verbraucht es nicht wertvolle Ressourcen und kann daher eine OutOfMemoryError verursachen (wie ich manchmal bekomme)?

Gibt es einen offiziellen Verweis darauf, was dieser Thread eigentlich macht und was seine Initialisierung auslöst?

Dank

+0

Es ist wahrscheinlicher, dass andere Threads das 'OOME' verursachen. Ich würde nicht mit dem am wenigsten offensichtlichen Verdächtigen beginnen. Haben Sie Ihre Anwendungsthreads für die Speicherbenutzung profiliert? Das wäre der direkte Weg, deine mysteriösen 'OOME's zu debuggen. – Kayaman

+0

10x für die Antwort. Natürlich habe ich andere Maßnahmen verwendet, um herauszufinden, warum ich das OOME bekomme (was BTW ein "GC Overhead Limit Exceeded" -Fehler ist, der durch eine hohe CPU-Auslastung verursacht wird), aber ohne Erfolg. Das ist meine letzte Zuflucht. Dieser Thread ist sehr verdächtig und ich möchte wissen, welches Geschäft er zu 100% ausgeführt hat. – KidCrippler

Antwort

31

Dies geschieht, weil die meisten Anwendungen in Threads ausgeführt werden. Alle POJO Apps beginnen mit dem Aufruf der main Methode. Im einfachsten Fall erledigt diese Methode die gesamte Arbeit, erstellt Objekte, ruft Methoden usw. an. Sobald die main abgeschlossen ist, wird die JVM angewiesen, mit einem Thread DestroyJavaVM zu beenden, der darauf wartet, dass alle Nicht-Daemon-Threads abgeschlossen sind . Dadurch wird sichergestellt, dass alle von Ihnen erstellten Threads vor dem Abbruch der JVM vollständig ausgeführt werden.

Eine App mit einer GUI läuft jedoch normalerweise als eine Anzahl von Threads. Eine für die Überwachung von Systemereignissen wie Tastatur- oder Mausereignissen. Eine für die Wartung der Fenster und Display etc. Die main Methode dieser Art von App wird wahrscheinlich nur alle erforderlichen Threads starten und beenden. Es erstellt immer noch den Thread DestroyJavaVM, aber jetzt wartet er nur darauf, dass alle erstellten Threads beendet werden, bevor die VM heruntergerissen wird.

Als Ergebnis wird jede App, die Threads erstellt und nur auf ihre Funktionalität beruht immer einen DestroyJavaVM Thread warten, bis es fertig ist. Da es nur join läuft, verbraucht es keine anderen Ressourcen.

+0

10x für die Antwort. Meine App hat keine GUI. Ich instanziiere jedoch viele Threads und verlasse mich auf deren Funktionalität. Hat es etwas mit dem DestroyJavaVM-Thread zu tun? Was löst eigentlich seine Initialisierung aus? Wenn ich Sie richtig verstehe, sagen Sie, dass obwohl der Thread als RUNNING angezeigt wird, es eigentlich WAITING ist? – KidCrippler

+3

@KidCrippler - Es wird erstellt und gestartet, nachdem 'main' beendet wurde. Siehe [Thread.join()] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Thread.java#Thread.join%28long % 29) warum es in einem 'Running' Zustand ist - es benutzt' wait (0) 'in einer engen Schleife. – OldCurmudgeon

+0

Das ist einfach eine tolle Antwort. Danke, dass du es geschrieben hast. Ich bin gerade hierher gekommen, um zufällig zu surfen, habe keine Lösung gesucht, aber deine Antwort hat mich dazu verleitet, darüber abzustimmen. :) –