Как посмотреть, какие объекты были собраны мусором в Java? - PullRequest
6 голосов
/ 21 сентября 2011

Пожалуйста, есть ли способ получить историю объектов (их переменных или, по крайней мере, имен классов), которые были собраны сборщиком мусора в Java?

Просто добавив эти параметры (в Oracle JVM)

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

не предоставляет ничего другого в байтах. Это очень ограниченная помощь для меня. Спасибо за все ответы.

Примечание. Обходной путь с помощью метода add finilize (), к сожалению, для меня не вариант (у меня нет к нему доступа).

Ответы [ 5 ]

4 голосов
/ 21 сентября 2011

Отказ от ответственности: Моя компания разрабатывает инструмент, который я рекомендую в этом ответе.

В JProfiler вы можете перейти к представлению «Записанные объекты» в разделе памяти и переключить режим «живучести» на объекты, собираемые мусором («Просмотр» -> «Изменить режим жизнеспособности» -> «Собранные объекты мусора»). Затем вы увидите статистику объектов, которые были GCed.

enter image description here

4 голосов
/ 21 сентября 2011

Вы можете использовать метод finalize из Object.Этот метод вызывается, когда объект собирается быть GCed.Отсюда вы можете регистрировать необходимую информацию.

0 голосов
/ 01 апреля 2016

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

0 голосов
/ 21 сентября 2011

В JDK есть хороший встроенный инструмент для наблюдения за jvm во время выполнения.Это jvisualvm.Есть хорошая ссылка со скриншотами: http://visualvm.java.net/description.html

Вот один из них: enter image description here

Надеюсь, что поможет.

0 голосов
/ 21 сентября 2011

Вы ищете утечку памяти?

Если вы реализуете метод finalize() (доступен в каждом Object), он будет вызван непосредственно перед сборкой мусора, и вы сможете запустить любой код внутри него.

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

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