Hallo,
gegeben eine Objekt einer Klasse ServiceManager. Diese Klasse kann auf verschiedenen JVMs verteilt sein und lädt dynamisch Dienste, welche in einem eigenen Thread laufen.
Frage: Wie kann man am Besten die DIENSTE (also die Threads) profilen? Natürlich hat man keine Möglichkeit, den Quellcode der Dienste selbst zu verändern. Gesucht ist die Ausführungszeit und der Speicherverbrauch.
Ausführungszeit: Das ist eigentlich kein Problem, da gibts ja mehrere gute Möglichkeiten.
Speicherverbrauch: Hier beginnt der Spass. Das Problem ist natürlich, dass Java von so etwas abstrahiert. Zu betrachten sind also sowohl Heapgröße, als auch die Stackgröße.
Folgende Möglichkeiten habe ich in Betracht gezogen:
MXBeans:
Eine schöne Java-API, die es einen erlaubt einige Infos über die JVM zu bekommen. Leider bekommt man es nicht hin, Speicherverbrauch FÜR THREADS herauszufinden (oder ich habs nicht in der API entdeckt).
JVMPI:
Wird nicht mehr unterstützt.
JVMTI:
Leider in C. Und ich habs mir noch nicht so genau angeschaut als dass ich weiss, wie viele Informationen ich bekomme. Vielleicht weiss ja jemand, ob ich damit auch Speicherverbrauch von Threads erfahren kann. Ich weiss dass es Events für die Objekterzeugung gibt (obwohl anscheinend nicht mehr für eigene Klassen). Die Frage ist, ob man erfahren kann wie viel Speicher das Objekt auf den Heap braucht und von welchem Thread es erzeugt wurde.
Bytecode-Instrumentierung:
Man kann die Java-Klassen ja beim Laden verändern (z.B. mit BCEL). Was man also erhält ist die Möglichkeit, die Klassen so zu verändern als ob man sie selbst schreiben würde. Hier kann man z.B. die Konstruktoren verändern und ein Thread.currentThread() einfügen. Leider geht das nicht für ALLE Klassen, nämlich nicht für die Java-eigenen Klassen. Somit erfährt man auch nicht alles. Und das Abschätzen der Größe der Klassen muss man wohl auch anhand der Felder der Klasse machen.
Weiss jemand mehr als ich? Wie machen es denn Profiling-Tools, oder können die auch nicht den Speicherverbrauch FÜR THREADS ermitteln?
Vielen Dank
gegeben eine Objekt einer Klasse ServiceManager. Diese Klasse kann auf verschiedenen JVMs verteilt sein und lädt dynamisch Dienste, welche in einem eigenen Thread laufen.
Frage: Wie kann man am Besten die DIENSTE (also die Threads) profilen? Natürlich hat man keine Möglichkeit, den Quellcode der Dienste selbst zu verändern. Gesucht ist die Ausführungszeit und der Speicherverbrauch.
Ausführungszeit: Das ist eigentlich kein Problem, da gibts ja mehrere gute Möglichkeiten.
Speicherverbrauch: Hier beginnt der Spass. Das Problem ist natürlich, dass Java von so etwas abstrahiert. Zu betrachten sind also sowohl Heapgröße, als auch die Stackgröße.
Folgende Möglichkeiten habe ich in Betracht gezogen:
MXBeans:
Eine schöne Java-API, die es einen erlaubt einige Infos über die JVM zu bekommen. Leider bekommt man es nicht hin, Speicherverbrauch FÜR THREADS herauszufinden (oder ich habs nicht in der API entdeckt).
JVMPI:
Wird nicht mehr unterstützt.
JVMTI:
Leider in C. Und ich habs mir noch nicht so genau angeschaut als dass ich weiss, wie viele Informationen ich bekomme. Vielleicht weiss ja jemand, ob ich damit auch Speicherverbrauch von Threads erfahren kann. Ich weiss dass es Events für die Objekterzeugung gibt (obwohl anscheinend nicht mehr für eigene Klassen). Die Frage ist, ob man erfahren kann wie viel Speicher das Objekt auf den Heap braucht und von welchem Thread es erzeugt wurde.
Bytecode-Instrumentierung:
Man kann die Java-Klassen ja beim Laden verändern (z.B. mit BCEL). Was man also erhält ist die Möglichkeit, die Klassen so zu verändern als ob man sie selbst schreiben würde. Hier kann man z.B. die Konstruktoren verändern und ein Thread.currentThread() einfügen. Leider geht das nicht für ALLE Klassen, nämlich nicht für die Java-eigenen Klassen. Somit erfährt man auch nicht alles. Und das Abschätzen der Größe der Klassen muss man wohl auch anhand der Felder der Klasse machen.
Weiss jemand mehr als ich? Wie machen es denn Profiling-Tools, oder können die auch nicht den Speicherverbrauch FÜR THREADS ermitteln?
Vielen Dank