Хобрук: Ваш путь к мастерству в программировании

Ссылки статического объекта GC на null

Я понял это:

  • Обнуление локальных ссылок более полезно для удобочитаемости, чем фактическая коллекция GC (это не будет иметь большого значения)
  • Объекты, на которые ссылаются статические ссылки, не имеют права, пока загрузчик классов не будет собран сам (поскольку он ссылается на объект класса, который, в свою очередь, ссылается на статические переменные)

Что на самом деле происходит за кулисами, когда статическим ссылкам на объекты явно присваивается значение null?
Что происходит с исходным объектом, который изначально хранился в куче?


  • Обнуление локальных ссылок может служить предупреждением о том, что код написан кем-то, кто на самом деле не понимает, что делает. В противном случае это не имеет никакого преимущества. 06.10.2016
  • Nullifying local references is more useful for readability than actual GC collection (it won't make a real difference) --- он может сделать разницу между OutOfMemoryError и отсутствием ошибки. 06.10.2016
  • Распространенным заблуждением является мнение, что что-то произойдет, когда объект станет недоступным, т. е. мусором. Правда в том, что ничего не произойдет с обычными объектами. Управление памятью работает путем копирования или сжатия все еще доступных объектов, так что область памяти, содержащая только мусор, может считаться свободной памятью сама по себе, без необходимости явных действий по освобождению. 07.10.2016
  • @Holger Спасибо, на самом деле это самый полезный ответ, который более четко объясняет процесс. Не уверен, почему это редко объясняется таким образом, так как это лучшее объяснение. 08.10.2016
  • Его часто считают деталью реализации (ну, это является деталью реализации, но деталью наиболее распространенных реализаций…) или слишком сложным для введения. Этот документ устарел, но дает хороший обзор различных алгоритмов. 10.10.2016

Ответы:


1

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

06.10.2016
  • Спасибо, я слишком много думал. 07.10.2016

  • 2

    Между этими двумя точками «за кулисами» нет существенной разницы.

    Различные эффекты просто связаны со временем жизни самих ссылок. Локальная переменная выходит из области видимости, как только она больше не используется в методе или самое позднее после выхода из метода. Статические поля существуют до тех пор, пока существует класс, что во многих случаях соответствует продолжительности жизни приложения.

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

    06.10.2016

    3

    Обнуление локальных ссылок более полезно для удобочитаемости

    Если вы имеете в виду, что это загромождает код и делает его менее читаемым, то я согласен.

    ... это не будет иметь большого значения

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

    Что на самом деле происходит за кулисами, когда статическим ссылкам на объекты явно присваивается значение null?

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

    Что происходит с исходным объектом, который изначально хранился в куче?

    Вообще ничего, поскольку обнуляется только ссылка. Объект собирается однажды (если это была последняя ссылка), но опять же: ничего особенного.

    06.10.2016
    Новые материалы

    Неделя 1 — Кентерберийские рельсы.
    Неделя 1 — Кентерберийские рельсы. So. Мы все еще живы, все еще усердно работаем и еще не пассивно-агрессивно рассылаем друг другу сообщения «за мое последнее сообщение в Slack…», поэтому, на..

    Цена завтрашнего дня  — Джефф Бут
    Технологический прогресс в наши дни происходит с молниеносной скоростью, и мы не в состоянии это понять. Джефф в основном говорит о влиянии технологий на экономику по всему миру. Он твердо верит..

    Данные: суперсила современного бизнеса
    В цифровой среде данные превратились из простого побочного продукта бизнес-операций в центральный актив, стимулирующий рост и инновации. Крейг Манди, бывший главный директор по стратегии..

    Как симулировать серию пенальти на Python с помощью симуляции Монте-Карло, часть 1: генерация функций
    Серия пенальти была огромным испытанием во время чемпионата мира по футболу. Они вызвали много споров в социальных сетях и новостных агентствах. Даже финальный матч турнира решался по..

    AST для разработчиков JavaScript
    TL; DR Эта статья - мое выступление на недавно состоявшейся конференции Stockholm ReactJS Meetup. Вы можете посмотреть слайды здесь..

    5 проектов на Python, которые нужно создать прямо сейчас!
    Добро пожаловать! Python — один из моих любимых языков программирования. Если вы новичок в этом языке, перейдите по ссылке ниже, чтобы узнать о нем больше:

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..