сборка мусора экземпляров классов, содержащих статические члены - PullRequest
3 голосов
/ 04 апреля 2011

Я немного озадачен сборкой мусора в Java экземпляров классов, содержащих статические члены:

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

Мне нужны экземпляры определенного класса (скажем, класса AA) для совместного использования ссылки на другой тип (это источник данных SQL): DS создается при первом обращении к члену статического класса AA, в то время как экземпляры AA используют это поделились DS внутри своих методов, чтобы получить соединение. Вопросы:

  1. Будет ли статический DS предотвращать сборку мусора экземплярами AA?
  2. если я положу экземпляры AA в ноль и получу мусор, DS тоже будет gc?
  3. Получение соединения от этого статического DS внутри методов AA является поточно-ориентированным?

По моему мнению, статический DS не должен собираться мусором, поскольку он является членом класса, а не членом экземпляра, а экземпляры AA должны собираться. В любом случае, мне бы хотелось узнать мнение более опытного Java-программиста.

Ответы [ 2 ]

5 голосов
/ 04 апреля 2011
  1. Статическая ссылка не будет препятствовать сборке мусора экземплярами AA.

  2. Статический источник данных будет собираться только в том случае, если на него больше нет ссылок. Например. после установки AA.DS = null исходный источник данных может быть собран. Удаление ссылок на все экземпляры AA не поможет, поскольку статическая ссылка DS по-прежнему сохраняется.

  3. Это зависит от того, как вы его кодируете. Это не потокобезопасный дизайн.

3 голосов
/ 04 апреля 2011

Объекты, на которые ссылаются статические поля, становятся приемлемыми только в том случае, если класс в целом подходит для GC, что может произойти только тогда, когда все из следующих истинны:

  • нетэкземпляры этого класса существуют
  • все остальные классы, загруженные его ClassLoader, имеют право на GC
  • нет ссылок на его Class объект.

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

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