Как отслеживать вызовы методов в 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), для выполнения некоторых легко доступных диагностик.

  • jstack трассировка стека
  • jmap карта памяти
  • jstat выводить        мониторинг статистики JVM
  • jhat инструмент анализа кучи
  • jdb отладчик
  • jinfo java process или core file config info

$ 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