2016-02-16 4 views
0

При использовании jvisualvm для определения проблем с производительностью я обнаружил, что мое приложение java (1000 классов) создает много временных объектов (например, X) во время операции, которые имеют право на GC после операции, только небольшая количество объектов (скажем, Y) являются неприменимыми. Уменьшение количества временных объектов может привести к повышению производительности (циклы CPU для создания, удаления объектов и объектов ОЗУ). Отсутствует информация о типах или временных объектах, которые создаются. Я могу посетить код и попытаться выяснить, но это займет много времени, чтобы проследить все потоки кода.обратные вызовы сборщика мусора Java

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

Есть ли у java GC какие-либо средства для предоставления этой информации?

+0

Используйте инструменты, такие как AppDynamics (Есть и другие варианты тоже), которые должны быстро помочь вам в определении спорного кода. – kosa

+0

Для того, что стоит, сборщик мусора Java - это действительно очень хорошо, когда вы сталкиваетесь с ситуацией, когда создано очень много короткоживущих объектов. –

ответ

0

Вы можете переопределить метод finalize() (more info) и распечатать некоторую информацию там.

Вызывается сборщиком мусора на объект, когда сбор мусора определяет, что больше нет ссылок на объект. Подкласс отменяет метод finalize для утилизации системных ресурсов или для выполнения другой очистки.

+0

не очень хороший совет, медленные финализаторы убивают GC –

+0

Ну, похоже, это отлаживается только так, я думаю, что это нормально – MartinS

+0

с использованием финализаторов даст мне необходимую информацию, но мне нужно добавить финализаторы для всех моих классов, я ищу ярлыки :). – Sri

1

Я не думаю, что можно получить регистрацию объектов или обратные вызовы из GC, но вы можете получить накопленную статистику программно через JMX. В этом article показано, как получать уведомления от GarbageCollectorMXBean экземпляров, задокументированных Oracle here.

Возможно, вы очищаете банан на неправильном конце. Вместо того, чтобы сосредоточиться на том, что происходит с мертвыми объектами, вы можете отслеживать моментальные снимки памяти, показывающие ваши живые объекты. Вы можете сделать это с помощью VisualVM на лету или сохранить сбережения памяти с помощью утилиты jmap. Это даст вам много возможностей для оптимизации профиля вашей памяти. В конце концов, что вы ожидаете от мониторинга GC? Все, что поднимается, должно спуститься. Все живые объекты в какой-то момент будут мертвы. Проверьте свои живые объекты.

+0

Моя проблема заключается в том, что временные/короткоживущие объекты слишком велики (~ 1 ГБ ОЗУ), а фактическое количество объектов, которые не являются временными, составляет ~ 200 МБ.Это означает, что во время выполнения приложение создает записи/считывает данные 1 ГБ из ОЗУ и вызывает соответствующие конструкторы. Один из возможных способов повышения производительности - не создавать так много объектов temp и передавать один объект. – Sri

0

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

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

Я автоматизировал этот процесс, вы можете использовать sjk инструменты и команду hh для создания гистограмм класса для мусора в вашей куче.

Here вы можете найти более подробную информацию.

Смежные вопросы