Профилирование количества экземпляров объектов, собранных из мусора, на класс

#java #garbage-collection

#java #сборка мусора

Вопрос:

Я ищу инструмент, который может обеспечить профилирование живых объектов, подобное VisuaVM, но в режиме, отличном от GUI.

Доступ к функциям виртуальной машины Visual, о которых я говорю, осуществляется путем перехода на вкладку «Профилировщик» и нажатия кнопки «Память».

Установив предустановку профиля «Выделение объектов профиля и GC» для всех объектов ever 1 (все объекты). Это дает мне именно то, что мне нужно в автоматически обновляющемся представлении, которое я могу отфильтровать для интересующего меня класса.

Однако я хочу иметь возможность экспортировать таблицу «живых объектов» в текстовый файл для каждого снимка, который делается (Visual VM обновляется каждые одну секунду). Очевидно, что указание и щелчок никак не могут быть решением…

Кто-нибудь знает о таком профилировщике «командной строки»?

Я смотрел на jmap, который предоставляет дампы кучи, но это слишком дорого (дамп занимает слишком много времени, меня интересует только количество объектов).

Существует коммерческий инструмент под названием YourKit, но я не знаю, может ли он делать то, что мне нужно (а также кажется довольно дорогим для типа «одноразового» использования, для которого он мне нужен).

Если бы я мог использовать VisualVM как есть, но при этом добавлять выходные данные в файл (вместо обновления графического интерфейса пользователя), это было бы идеально…

Ответ №1:

Я думаю, что гистограммы классов — это то, что вы ищете. Вы могли бы собирать гистограммы через регулярные промежутки времени, и это покажет вам количество объектов каждого класса и занимаемое пространство. Затем вы можете самостоятельно проанализировать выводимый текст, чтобы:

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

Соберите гистограмму класса с jmap -histo $pid.