Gibt es eine Moeglichkeit die Runtime Ausführung zu analysieren..?

sirbender

Top Contributor
Hallo,

ich suche gerade (wissenschaftliche Zwecke) eine Möglichkeit die Ausführung von Programmen "zu verfolgen" und somit zu analysieren. Die Ausführung started in einer Klasse mit einer main-Methode. Diese Methode erzeugt z.B. ein Objekt: Map map = new LinkedMap(); und fügt dann Elemente der map hinzu via put(). Alles sehr simpel.

Nun würde ich gerne in der Runtime gewisse "hooks" haben die mir erlauben Daten zu sammeln welche Methoden in der Ausführung tatsächlich aufgerufen werden. Die JVM hat solche "Api-hooks" nicht soweit ich weiss? Vielleicht gibt es ja neuere Entwicklungen von denen ich nichts weiss? Eventuell kann GraalVM das?

Eventuell gibt es ja einen Java Interpreter, der ebenfalls Code (vielleicht sogar ohne Kompilierung) ausführen kann und der solche "hooks" zur Analyse bereitstellt?

Ansonsten wäre ich dankbar für weitere Ideen wie ich wie beschrieben eine Ausführungsanalyse durchführen kann? Lieber wäre mir eine saubere Lösung, d.h. z.B. ein Interpreter, der mir erlaubt alle seine Aktionen während der Ausführung zu sammeln anstatt eine "hacky" Lösung wo ich source-code oder bytecode modifiziere.
 
Ich kenne jvisualvm. Aber kann ich da auch alle Daten sammeln die ich brauche. Gibt es da Apis und Tutorials die mir zeigen wie ich erreichen kann was ich will?

Übrigens, falls jemand einen anderen Interpreter kennt, der solche Api-hooks bietet, der sollte schon alle Programme ausführen können, die auch die JVM ausführt. Also nicht nur Code-Snippets sondern Code der aus einem Mix aus Source-code und Abhaengigkeiten in .jars besteht.
 
Das ganze dürfte sich unter dem Stichwort Java Profiler zusammenfassen lassen. Was genau es da gibt, welche Tools welche Möglichkeiten bereitstellen, weiß ich aber auch nicht. Eventuell hilft dir das aber schon mal weiter.
 
Aber kann ich da auch alle Daten sammeln die ich brauche.
Welche Daten brauchst Du denn?

Du kannst halt CPU-Zeiten (wie viel Zeit wurde in welcher Methode verbraten und wie oft wurde die Methode aufgerufen) und Speicherbedarf der Objekte ermitteln, außerdem Dir Informationen über die Threads anzeigen lassen.

Der Sampler tastet ab, bekommt ggf. nicht alles mit. Der Profiler verwendet Instrumentation und dauert ggf. ewig.

Die Ausführung started in einer Klasse mit einer main-Methode. Diese Methode erzeugt z.B. ein Objekt: Map map = new LinkedMap(); und fügt dann Elemente der map hinzu via put(). Alles sehr simpel.
Genau so etwas sieht man in JVisualVM. Probiers einfach mal aus: Sampler -> CPU. Dann siehst Du im Baum die Ausführungsbäume der Threads. Bei den Zeitangaben wird sogar die self-time angegeben, also die Zeit, die innerhalb der Methode selbst verbraucht wird.

Eine andere Möglichkeit bestünde ggf. darin, Code-Coverage-Tools zu verwenden.
 
Mit einem Agent müsste es möglich sein deine Klassen zu instrumentieren. Da wirst du aber viel erarbeiten müssen. Kann aber ein spannendes Projekt sein.
 
Ich hatte vor ein paar Jahren mal mit Instrumentualisierung gearbeitet. War recht schrecklich, vor allem weil man auch viel Bytecode modifizieren musste fuer die Analyse.

Es geht mir nicht um klassische Profiler-Aufgaben. Zeit interessiert mich zum Beispiel ueberhaupt nicht. Es geht mehr darum einen generellen Zugang zu haben was während der Runtime passiert. Die simpelste Version davon ist, dass ich die JVM (oder wen auch immer) während der Laufzeit "befragen" und Daten sammeln kann - z.B. die Kette der Methodenaufrufe.
 

Zurück
Oben