Es gibt mehrere Möglichkeiten, Thread-Dumps in Java zu generieren.
Ich möchte JVMTI (die C-API) verwenden Generieren Sie es, um seine Auswirkungen auf eine laufende JVM zu bewerten. (Ich kenne jstack und JMX; diese Frage bezieht sich im Allgemeinen nicht auf Thread-Dumps, sondern auf die Verwendung der JVMTI-API).
Ich stütze meinen Code von diesem Blogpost . Dort hängt der Java-Agent an das SIGQUIT-Signal an. Ich möchte das vermeiden, denn das ist das gleiche Signal, das die JVM verwendet, um einen Thread-Dump in stdout zu schreiben. Ich möchte diese Doppelzüngigkeit vermeiden.
Mit anderen Worten, ich möchte entweder an ein anderes Signal anhängen oder einen Weg finden, wie der Agent in regelmäßigen Abständen einen Thread-Dump erstellen kann.
Dort hängt der Java-Agent an das SIGQUIT-Signal an. Ich möchte das vermeiden, denn das ist das gleiche Signal, das die JVM verwendet, um einen Thread-Dump in stdout zu schreiben. Ich möchte diese Doppelzüngigkeit vermeiden.
Entfernen Sie einfach das folgende Snippet aus Ihrem Code
%Vor%Ich möchte entweder an ein anderes Signal anhängen
Hier ist das Papier, das ein bisschen alt ist, aber die Information sollte immer noch relevant sein.
Nur ein Beispiel, wie man eine Signalbehandlung durchführt
%Vor%Natürlich können Sie komplett nativen Signal-Handler schreiben (bitte beachten Sie, dass ich es nicht getestet habe, dies ist nur eine Idee, die funktionieren sollte)
%Vor%oder finden Sie einen Weg für den Agenten, einen Thread-Dump in regelmäßigen Abständen zu generieren.
In Ihrem Beispiel gibt es globale * gdata strong>
%Vor%... also, erhalten Sie jvmtiEnv von dort jederzeit (Timer-Callbacks, etc.)
Wenn Sie regelmäßig Thread-Dumps sammeln möchten, können Sie den Java Flight Recorder verwenden, der Teil von Java Mission Controller
Ab der Veröffentlichung von Oracle JDK 7 Update 40 (7u40) wird Java Mission Control mit der HotSpot JVM gebündelt.
Der von Ihnen zitierte Blog-Eintrag enthält fast alles, was Sie für JVMTI-Installationen benötigen. Sie können JVMTIenv aus gdata verwenden. Das ist legal. Stellen Sie sicher, wenn Sie JNI-Aufrufe ausführen, um einen richtigen JNIenv für Ihren aktuellen Thread zu haben.
Sie müssen jetzt einen Weg hinzufügen, um benachrichtigt zu werden, um Ihre Aktion auszuführen (zB: Thread Dump). Spin up einen Thread, der auf einem Sockel hört, inotify , benannte Semaphore, etc .. - etwas, das Sie können von draußen stochern.
Sie können dann dumpThreadInfo () von Ihrer Event-Handler-Schleife aufrufen, wie Sie es für richtig halten.
Keines der Ereignisse in jvmtiEventCallbacks sieht geeignet aus (außer Sie möchten DataDumpRequestion verwenden, aber wenn Sie das täten, würden Sie hier nicht nachfragen: ok, das ist also so, wie ich es bisher an den jvm angehängt habe Ich denke, das bringt mich zur nächsten Frage: Wie bekomme ich einen Zeiger auf ein jvmtiEnv, um GetStackTrace aufzurufen, wenn nicht von einem Callback aus? Der Punkt ist, t
aufzurufenTags und Links java thread-dump jvmti