Wie kann ich trace Aufrufe von Methoden in Java?
Betrachten die zwei einfachen Java-Klassen unten:
Ersten Beispiel
class Computer {
Computer() {
System.out.println("Constructor of Computer class.");
}
void On() {
System.out.println("PC turning on...");
}
void working() {
System.out.println("PC working...");
}
void Off() {
System.out.println("PC shuting down...");
}
public static void main(String[] args) {
Computer my = new Computer();
Laptop your = new Laptop();
my.On();
my.working();
your.On();
your.working();
my.Off();
your.Off();
}
}
Zweiten Beispiel
class Laptop {
Laptop() {
System.out.println("Constructor of Laptop class.");
}
void On() {
System.out.println("Laptop turning on...");
}
void working() {
System.out.println("Laptop working...");
}
void Off() {
System.out.println("Laptop shuting down...");
}
}
Nachdem das Programm laufen, wie kann ich trace (1) die Objekt-Aufrufs, die Methode (2) und wie oft?
Nur ein wenig Präzision, ich hätte 100 Klassen und 1000de von Objekten jeder ruft Sie 100s von Methoden. Ich möchte in der Lage sein zu verfolgen (nachdem ich das Programm ausführen), was Objekt genannt wird, welche Methode und wie oft.
Vielen Dank für jede Anregung.
Bitten Sie um mehr komplexe oder Allgemeine Beispiele? Aus diesem Beispiel, wäre es offensichtlich, da Sie nur eine Instanz von jeder Klasse und es gibt keine erbschaft.
Ich bin auf der Suche nach einer Antwort für den Einsatz in jeder situation. Ich habe vielleicht 100 Klassen und 1000de von Objekten, indem Sie jedes 100s von Methoden. Ich möchte in der Lage sein zu verfolgen (nachdem ich das Programm ausführen), was Objekt genannt wird, welche Methode und wie oft. Danke - George
Danke, ich bin neu hier. Vielleicht habe ich nicht gut verstehen, die code-Formatierung.
Ich habe gerade die Formatierung, nun scheint es ok. Danke für den Tipp verlassen, 4 Räume.
Ich bin auf der Suche nach einer Antwort für den Einsatz in jeder situation. Ich habe vielleicht 100 Klassen und 1000de von Objekten, indem Sie jedes 100s von Methoden. Ich möchte in der Lage sein zu verfolgen (nachdem ich das Programm ausführen), was Objekt genannt wird, welche Methode und wie oft. Danke - George
Danke, ich bin neu hier. Vielleicht habe ich nicht gut verstehen, die code-Formatierung.
Ich habe gerade die Formatierung, nun scheint es ok. Danke für den Tipp verlassen, 4 Räume.
InformationsquelleAutor george24 | 2015-04-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser druckt eine Zeile für jeden Methodenaufruf, der alle Objekte in allen threads:
Und
Können Sie einen Aufruf tracer wie housemd oder btrace oder inTrace
Weitere Analyse einbezogen, Sie können eine call-graph-Programm wie eins von diesen:
javashot
java-callgraph
(hier ist eine Artikel auf das Thema)
Den veralteten Methoden, die oben sind geplant, für die Entfernung, weil es nun JVM-spezifische alternativen:
Diese beiden tools Recht einfach zu setup und starten Sie das sammeln von Informationen und eine nette GUI-Schnittstelle. Sie legen auf eine laufende JVM-Prozess und damit für thread-snapshots und verschiedene andere Arten von Diagnose (Visual VM hat eine Menge der verfügbaren plugins, aber das kann eine Weile dauern, zu Sortieren, zu konfigurieren und zu verstehen, wenn Sie wollen, gehen über die Standard-Verhalten, während JFR instrumentiert ist, mit mehr standardmäßig).
Auch, unterschätzen Sie nicht die Nützlichkeit von JVM distributed command line utilities (
$JAVA_HOME/bin
), für die Durchführung einige leicht zugängliche Diagnose.traceInstructions()
veraltet beginnend mit Java-9.Beachten Sie auch, dass diese Methoden sind nicht nur veraltet, sondern verwandelte sich in eine no-op sowie, so dass die Nutzer sollten nach alternativen suchen, wenn die migration auf JDK 9.
Beachten Sie, es scheint
traceInstructions()
selten gearbeitet, auch mit alten JVMs. Ich habe versucht, mit mehreren (6, 7, 8), ohne Erfolg. Dies passt zu vielen anderen berichten, zum Beispiel: stackoverflow.com/a/1025685/7256341InformationsquelleAutor clearlight
InformationsquelleAutor gavenkoa