Есть ли способ увидеть все ссылки на объект во время выполнения?
Я использую Netbeans, эта функция существует в нем?
РЕДАКТИРОВАТЬ: Нет проблем с использованием профилировщиков для этого, мне нужно знать только ссылки, не имеет значения.
Есть ли способ увидеть все ссылки на объект во время выполнения?
Я использую Netbeans, эта функция существует в нем?
РЕДАКТИРОВАТЬ: Нет проблем с использованием профилировщиков для этого, мне нужно знать только ссылки, не имеет значения.
Хорошо, Netbeans показывают все ссылки на объект.
Сначала запустите проект в режиме отладки CTRL + F5
, после, покажите загруженные классы Alt + Shift + 4
или Window->Debug->Loaded Classes
.
Выберите класс, который захочет увидеть ссылки и дважды щелкните по нему.
Приостановить выполнение и есть.
В верхней части находятся атрибуты объекта, а внизу - все ссылки на него.
Если вы сбросите кучу и проанализируете ее, вы найдете все ссылки. Такие профилиры, как VisualVM и YourKit, могут сделать это для вас.
Однако его невозможно определить динамически. Если вы хотите знать все, что относится к объекту, вы должны сами сохранить коллекцию.
В Netbeans вы можете использовать функцию Найти использование, чтобы увидеть, где определенный класс может быть указан внутри конкретного проекта.
В Проводнике проекта выберите класс и щелкните правой кнопкой мыши > Поиск использования.
Результаты немного похожи на следующие изображения:
Извините, не было ясно. Я хочу ссылки во время выполнения. Все рефери созданного объекта
К сожалению, такой функции нет в Java. Но есть способ получить уведомление о том, что больше нет ссылки на объект во время выполнения.
Решение состоит в том, чтобы создать слабую ссылку на объект и контролируемого связать его с ссылка очереди. Когда не будет более жесткой ссылки на этот объект, GC будет рано или поздно вспоминать об этом и помещать слабую ссылку. Вы можете проверить это с помощью isEnqueued().
Если вы предоставите больше информации о своей проблеме, возможно, мы можем дать больше советов и трюков.
ИЗМЕНИТЬ
Чтобы управлять всеми ссылками на объект, вы можете использовать шаблон прокси. Вместо задания ссылок на объект подключения вы создаете прокси-объект, содержащий частный экземпляр объекта соединения. Затем попросите свой код вызвать прокси-сервер, который сам вызовет сам объект подключения, вместо прямого ссылки на соединение.
Когда вы закончите с объектом соединения, закройте его в прокси-объекте. Если другие части кода по-прежнему пытаются получить доступ к этим объектам соединения через прокси-сервер, вы сможете обнаружить его в прокси-сервере при его вызове.
Это трюк, который вы можете использовать, чтобы найти, какая часть кода по-прежнему "ссылается" на ваш объект, так сказать.
Надеюсь, что это поможет.