Как отслеживать вызовы методов в Java?
рассмотрим два простых класса Java ниже:
Первый Пример
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();
}
}
Второй Пример
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...");
}
}
после запуска программы, как проследить (1), Какой объект вызывает какой метод (2) и сколько раз?
немного точности, у меня может быть 100 классов и 1000 объектов, каждый из которых вызывает 100 методов. Я хочу иметь возможность отслеживать (после запуска программы), какой объект называется каким методом и сколько раз.
Спасибо за любые предложения.
2 ответов
это печатает строку для каждого вызова метода всех объектов во всех потоках:
Runtime.traceMethodCalls() (deprecated / no-op in Java 9)
и
Runtime.traceInstructions (deprecated / no-op in Java 9)
вы можете использовать трассировщик вызовов, как housemd или btrace или inTrace
для более активного анализа вы можете использовать утилиту Call graph, такую как одна из эти:
(здесь статьи по теме)
устаревшие методы выше запланированы для удаления, потому что теперь есть альтернативы, специфичные для JVM:
- Java Flight Recorder часть JDK 7 по состоянию на сборку 56. Требует рекламы лицензия на использование в производства
- , который VisualVM бесплатная / популярная 3-я партия
оба этих инструмента довольно просты в настройке и начале сбора информации и имеют хорошие интерфейсы GUI. Они присоединяются к запущенному процессу JVM и позволяют делать снимки потоков и различные другие виды диагностики (Visual VM имеет много доступных плагинов, но это может занять некоторое время, чтобы отсортировать настройте и поймите, если вы хотите выйти за рамки поведения по умолчанию, в то время как JFR по умолчанию используется больше).
кроме того, не стоит недооценивать полезность распределенных утилит командной строки JVM ($JAVA_HOME/bin
), для выполнения некоторых легко доступных диагностик.
$ jdb -classpath ... -sourcepath ... my.App
jdb> stop on my.App.main
jdb> run
jdb> step <... repeat until get to interesting line...>
jdb> threads
jdb> trace go methods 0x1 <... 0x1 is our main thread ID ...>
jdb> step
<...HERE you get full methods calls trace...>
jdb> quit