отслеживать выполнение Java-программы - PullRequest
0 голосов
/ 29 декабря 2018

Мне трудно найти какую-нибудь программу, которая отслеживала бы выполнение Java-программы.

Для начала просто что-то, что давало бы мне все вызовы методов и время, затрачиваемое на выполнение каждого вызова, было бы неплохо.

У вас есть предложения?Заранее спасибо

РЕДАКТИРОВАТЬ: я хотел бы получить все дерево вызовов или иерархию, как бы она ни называлась, при запуске, с затраченным временем, и я не мог получить его с VisualVM.Я нашел скриншот некоторых инструментов, которые якобы могли бы сделать это, но я не прошел с этим, и я хотел бы начать с чего-то более простого: enter image description here

Это было быдовольно близко к тому, что я имею в виду: оно дает след некоторого дерева вызовов методов, времени, потраченного на каждый метод, даже представление о нем.

Какие проблемы я пытался решить изначально?Вот почти вся история: во-первых, я работаю над некоторым инструментом, который должен заполнить некоторую базу знаний.Недавно я понял, что это было довольно медленно (какой-то конкретный запрос, то есть добавление ~ 30 сущностей к базе заняло бы более 20 секунд), поэтому я хотел бы знать, тратится ли время на мой код в сети (REST)позвоните, чтобы обновить эту базу знаний), в самой базе знаний или в моем коде.И если мой код работает медленно, я хочу знать, что именно он делает, что отнимает так много времени.

Другая причина в том, что я читал «Эффективное Java 3-е издание», кстати, отличная книга.В пункте 6 «Избегайте создания ненужных объектов»

есть фрагмент кода:

// Hideously slow! Can you spot the object creation?
private static long sum() {
  Long sum = 0L;
  for (long i = 0; i <= Integer.MAX_VALUE; i++)
    sum += i;
  return sum;
}

по сравнению с этим:

private static long sum() {
  long sum = 0L;
  for (long i = 0; i <= Integer.MAX_VALUE; i++)
    sum += i;
  return sum;
}

Я вижу, что онвторая версия займёт меньше времени, я понимаю, почему нет экземпляров объекта Long и т. д., но я хотел бы увидеть, с фактическими мерами, сколько именно времени занимает создание экземпляров, посмотреть с мерами количество экземпляров Long,и другие объекты создаются, какой процент памяти занимают объекты Long в этом случае и т. д.

И некоторые другие события на работе, когда мы слепо проводим большой рефакторинг, некоторые горячие споры о том,реализация X была «более эффективной», чем реализация Y, но на самом деле у нас никогда не было данных для ее резервного копирования.

В общем, я понимаю, что мне нужен инструмент для получения реальных и надежных данных о том, что делает кодчто происходит в JVM, сколько памяти выделяется, на какой объект, сколько времени тратитсячто делать и т. д.

Это содержит ОЧЕНЬ много конкретных вопросов, и мой первый был таким: «Как я могу отследить выполнение даже простой программы».

Спасибои извините за то, что я не слишком специфичен для начала.

И другой пост, который был предложен, ЭТО мало чем помог, используя VisualVM с плагином Profile Startup, на игрушечном примере из Effective Java, я могу получитьчто-то, когда я считаю до Integer.MAX_VALUE,

enter image description here

, но если я, например, считаю до 1.000.000, похоже, VisualVM неесть время, чтобы начать (хотя я думал, что запуск моей программы с параметром -agentpath: /home/joseph/dev/visualvm_142/profiler/lib/deployed/jdk16/linux-amd64/libprofilerinterface.so=/home/joseph/dev/visualvm_142 / profiler / lib, 5140 позволит запустить VisualVM, но все, что я получаю, это пустой экран с «Статус: профилирование неактивно», но это все равно, что выполнение, где я рассчитывал на Integer.MAX_VALUE, я просто делаюне понимаю):

enter image description here

...