Как я могу сделать трассировку выделения Java-объекта с помощью кода - PullRequest
0 голосов
/ 25 октября 2018

Я использую профилировщики Java для проверки производительности GC - но это очень удачно.То, что я действительно хотел бы сделать, это вставить некоторые профилирование реального мира в мое приложение.Это очень легко для профилирования времени - то есть, отмечая время и вычитая, но я не могу найти какой-либо способ сделать это из памяти.

По сути - я хочу создать такую ​​функцию:

 ProfileResult  profile( Runnable function)

, который возвращает мне информацию о распределении памяти - то есть, сколько объектов, сколько байтов было выделено - и сколько из этого может быть собрано мусором.

Что я хочу закончить, так это тесты в нашемСистема CI, которая в основном расстраивается из-за таких вещей, как функция, увеличивает нагрузку на память ... и это абсолютно правильно - они на самом деле знают, что эта новая функция выделяет на 200 байт больше, чем старая - это не просто случайный момент времени, когда всев других потоках может происходить что-то другое, или может происходить сборка мусора или что-то в этом роде.

Возможно ли это?Я знаю, что в JVM встроена функция профилирования - можно ли получить к ней доступ из программы, которая работает, или есть какой-то другой способ добиться того, чего я хочу?

1 Ответ

0 голосов
/ 25 октября 2018

Анализ дампов кучи JVM может быть интегрирован в CI и (гипотетически) даст вам всю информацию, которую вы ищете.

Идея проста: вы берете дамп кучи до и после тестирования функции.Затем вы можете проанализировать разницу и утвердить определенный SLA тестируемого кода.

Раньше я выполнял автоматический анализ дампа кучи для проверки правильности утилизации ресурсов.Некоторый служебный код доступен как открытый исходный код https://github.com/aragozin/heapunit/. Хотя эта библиотека не поддерживает анализ на основе разности кучи.

Использование подхода на основе дампа кучи может иметь и другие недостатки

  • производительность / использование дискового пространства, если у вашей JVM большая куча
  • при точном распределении объектов в GC вызывается профилирование между двумя дампами

Если вам нужно просто отслеживать количество байтов, выделенных по частямкода в одном потоке взгляните на этот фрагмент кода , который он использует для счетчика распределения потоков, доступного через JMX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...