Можно ли увидеть все ссылки на объект во время выполнения? - PullRequest
20 голосов
/ 27 мая 2011

Есть ли способ увидеть все ссылки на объект во время выполнения?

Я использую Netbeans, существует ли эта функция в нем?

РЕДАКТИРОВАТЬ: нет проблем с использованиемчтобы сделать это, мне нужно знать только ссылки, независимо от того, как.

Ответы [ 4 ]

16 голосов
/ 27 мая 2011

Хорошо, NetBeans показывает все ссылки на объект.

Сначала запустите проект в режиме отладки CTRL + F5, затем покажите загруженные классы Alt + Shift + 4 или Window->Debug->Loaded Classes.

Выберите класс, который хотите увидеть ссылки и дважды щелкните по нему.

Приостановить выполнение и есть.

В верхней части находятся атрибуты объекта, а внизу - все ссылки на него.

In the bottom area where is

13 голосов
/ 27 мая 2011

Если вы сбросите кучу и проанализируете ее, вы найдете все ссылки. Профилировщики, такие как VisualVM и YourKit, могут сделать это за вас.

Однако это невозможно определить динамически. Если вы хотите знать все, что относится к объекту, вы должны сами поддерживать коллекцию.

7 голосов
/ 27 мая 2011

В Netbeans вы можете использовать функцию Find Usages , чтобы увидеть, где на определенный класс могли ссылаться внутри определенного проекта., выберите класс и щелкните правой кнопкой мыши> Find Usages .

Результаты будут выглядеть примерно так:

5 голосов
/ 27 мая 2011

Извините, не было ясно. Я хочу ссылки во время выполнения. Все ссылки созданного объекта

К сожалению, в Java нет такой функции. Но есть способ получить уведомление о том, что больше нет ссылки на объект во время выполнения.

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

Если вы предоставите больше информации о вашей проблеме, возможно, мы сможем дать больше советов и рекомендаций.

EDIT

Для управления всеми ссылками на объект вы можете использовать Прокси-шаблон. Вместо того, чтобы устанавливать ссылки на ваш объект соединения, вы создаете прокси-объект, содержащий частный экземпляр объекта соединения. Затем пусть ваш код вызывает прокси, который будет вызывать сам объект соединения, вместо того, чтобы иметь прямые ссылки на соединение.

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

Это трюк, который вы можете использовать, чтобы определить, какая часть кода все еще «ссылается» на ваш объект, так сказать.

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

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