Ich überlege, ein Skript nach
zu peitschenAber ich habe keine Ahnung, wie teuer oder invasiv jstack auf einer laufenden JVM ist. Wie teuer ist es, jstack auf einer laufenden JVM auszuführen? Richte ich mich für eine Welt der Verletzung aus?
Messen. Eine der time
Varianten (/ usr / bin / time Ich glaube) hat eine -p Option, mit der Sie die verwendeten CPU-Ressourcen sehen können:
Das bedeutet, dass es 0,32 Sekunden Wandzeit benötigte, wobei 0.00 Sekunden CPU-Zeit im Benutzerbereich und 0.00 Sekunden im Kernel-Bereich verwendet wurden.
Erstellen Sie ein Testszenario, in dem Sie ein Programm ausführen, aber nichts tun, und versuchen Sie, mit der Verwendung WITH und OHNE einen Jstack zu vergleichen, der z. jede Sekunde. Dann haben Sie harte Zahlen und können experimentieren, um zu sehen, was einen angemessenen Overhead ergeben würde.
Mein Vorgefühl wäre, dass alle fünf Minuten vernachlässigbar sind.
Ich weiß, dass diese Antwort für die Party zu spät ist, aber der teure Teil von jstack kommt von der Anfügung an die Debugger-Schnittstelle, die Stack-Traces generell nicht mit einer wichtigen Ausnahme erzeugt (und die Heap-Größe spielt keine Rolle):
Beliebige Stack-Traces können nur an einem sicheren Punkt oder während der Thread wartet (d. h. außerhalb des Java-Bereichs) generiert werden. Wenn der Thread auf / außerhalb des Java-Bereichs wartet, wird der stapelanfordernde Thread die Aufgabe übernehmen, indem er selbst den Stack-Walk ausführt. Allerdings möchten Sie möglicherweise einen Thread nicht "unterbrechen", um seinen eigenen Stack zu durchlaufen, insbesondere wenn er eine Sperre hält (oder etwas beschäftigt ist). Da es keine Möglichkeit gibt, die sicheren Punkte zu kontrollieren, muss ein Risiko in Betracht gezogen werden.
Eine weitere Option im Vergleich zu jstack, die das Anhängen an die Debugging-Schnittstelle vermeidet: Thread.getAllStackTraces () oder ThreadMXBean verwenden, dabei ausführen, in einer Datei speichern und ein externes Tool verwenden, um diese Datei abzufragen.
Letzte Anmerkung: Ich liebe jstack, es ist immens auf Produktionssystem.
Abhängig von der Anzahl der Threads und der Größe Ihres Heaps kann jstack möglicherweise ziemlich teuer sein. JStack ist für die Fehlersuche gedacht und wurde nicht für das Sammeln von Statistiken entwickelt. Es könnte besser sein, ein Formular für die Instrumentierung zu verwenden oder eine JMX-Schnittstelle verfügbar zu machen, um die gewünschten Informationen direkt zu erhalten, anstatt Stack-Traces analysieren zu müssen.