2014-11-18 4 views
3

В моем приложении много мусора, и я хотел бы проанализировать это. Что я хочу видеть, какие объекты собирают мусор. Я думаю, что это даст мне представление о том, где искать оптимизацию (добавление кеша или что-то еще).Java - какие объекты собирают мусор?

Есть ли возможность распечатать подробную информацию GC, в том числе, сколько объектов из каждого класса собирали мусор?

Я использую G1GC, если это важно.

Спасибо!

ответ

1

Oracle's JFR (Java Flight Recorder или Java Mission Control) - отличный инструмент для помощи в этой задаче - он показывает нагрузку на GC на объект - это означает, сколько объектов из каждого класса сгенерировано (это вместе с объектами которые собираются). Очень рекомендуется.

1

Это был ответ есть: Howto print java class garbage collection events?

Вам нужно запустить JVM, используя аргументы

-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails 
+0

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

0

Я не уверен G1GC, но обычно я нашел этот инструментарий VisualVM весьма полезным. Это достойная комбинация хорошей функции, адекватного углубленного анализа объектов, а также хорошей скорости (многие инструменты GC в раннем возрасте отстойны на этом). Это бесплатный инструмент.

http://visualvm.java.net/download.html

+0

Это действительно хороший инструмент, и я также установил в него плагин Visual GC, но я до сих пор не вижу, что хочу, - какие объекты (из которых классы) собирают мусор. – duduamar

+0

На странице профилирования процесса выберите «Профиль памяти», сделайте снимок, и вы сможете анализировать в глубину. Кроме того, вы можете видеть, какие объекты temp больше создаются объектом, прыгающим вверх и вниз при сортировке по памяти, до и после GC. Если вы хотите, «из какого класса он выделен», я боюсь, что ни один из существующих коммерческих инструментов не имеет такой удобной функции. –

0

Проследить Используйте коллекторской деятельности Garbage эту команду:

-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails 
+0

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

0

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

Есть целый ряд инструментов, которые позволяют проверять объекты и классы пришедшего из в куче, VisualVM как упомянуто Алекс Суо выше, JProfiler (что приятно, но заплатил за вки), YourKit (то же самое) или jmap. Используя любой из них, я мог бы записывать состояние кучи через регулярные промежутки времени, чтобы вы могли перекрестно ссылаться на свои подробные журналы сбора мусора.

В зависимости от вашего приложения вы также можете добиться значительного прогресса, используя свои подробные журналы сбора мусора в сочетании с журналами активности вашего приложения (какие действия вызывают заметные скачки в куче, особенно там, где наблюдается некоторое подобное уменьшение при возникновении GC позже). Даже если вы используете вышеприведенные инструменты, журналы активности могут иметь решающее значение для определения того, откуда происходит использование памяти.

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