undefined

Время жизни объекта

Java Syntax
6 уровень , 4 лекция
Открыта

— Ещё хочу рассказать пару интересных вещей про время жизни объектов. В Java случайно потерять объект очень сложно – если у тебя есть ссылка на него, значит, объект гарантированно жив.

Ссылки на объекты нельзя поменять. Нельзя увеличить или уменьшить. Также нельзя создать ссылку на объект – ее можно только присвоить. Или обнулить. Все.

Ясно. Т.е. если я обнулю (сотру) все ссылки на объект, то я никогда не смогу получить на него ссылку и обращаться к нему?

— Да. Но часто наблюдается обратная ситуация – слишком много неиспользуемых живых объектов. Часто программисты создают объекты десятками и хранят их в различных списках для обработки, но никогда эти списки не чистят.

Чаще всего ненужные объекты помечаются программистами, как неиспользуемые и все. А удалением их из списков никто не занимается. Так что для больших Java-программ характерно раздувание – все больше и больше неиспользуемых объектов остаются жить в памяти.

— Ты столкнёшься с этим ещё не скоро. Но я буду каждый раз обращать твоё внимание, на неиспользуемые больше объекты и правильный способ их утилизации.

Ок. спасибо. Ты прояснила мне пару моментов насчет ссылок.

Комментарии (177)
Чтобы просмотреть все комментарии или оставить свой,
перейдите в полную версию
Valua Sinicyn 41 уровень, Харьков
17 февраля 2021
На самом деле все просто: • объекты на которые не ведет ни одна ссылка считаются мертворожденными и удаляются сборщиком мусора при следующем проходе; • неиспользуемые объекты, в т.ч., дефолтные нужно обнулять (обнулять ссылки на них), чтобы они были удалены Garbage Collector и не захламляли систему. Возьмем, для примера, котов :)
 
public class Main{
  public static void main(String[] args){
    new Cats("Васька").info();
    Cats cat2 = new Cats();
    cat2.info();
    Cats cat3 = new Cats("Персик");
    cat3.info();
    
    try{
      cat2 = null;
      cat2.info();
}
    catch(NullPointerException e){
      System.out.println(e.getMessage());
  }
 }
}
public class Cats{
  String name;
  public Cats(){
}
  public Cats(String name){
    this.name = name;
}
  public void info(){
    System.out.println("Тест");
 }
}
 
Исходим из того, что обнуленная ссылка считается мертвой и не может вызывать метод, т.к., метод вызывается на объекте, на который обнуленная ссылка уже не ссылается (будет выброшено исключение NullPointerException, которое мы обработали в try - catch). Такой вот каламбур. Отвязали ссылку от объекта - ссылка сдохла. Привязали сдохшую ссылку к новому объекту - ссылка ожила. Итак. Создано 3 кота. 1-й бессылочный (будет удален сборщиком мусора). 2-й дефолтный (имеет значение null по умолчанию), но все равно считается "живым", поэтому обнуляем ссылку в 10-й строке. 3-й кот выжил, ибо: - имеет ссылку; - ссылка не обнулена. Коты виртуальные. В реале ни один кот не пострадал. Я сам кошатник до мозга костей. :) Надеюсь, теперь тема стала понятной. Особое внимание - необходимости также обнулять ссылки на дефолтные объекты. Геттер не использовал для наглядности и чтобы облегчить код. Всем удачи.
hidden #2448783 19 уровень
7 декабря 2020
у меня такой хлам в голове .
Pavel Kuropatin 17 уровень, Минск
24 октября 2020
Пояснительная бригада: В С(Си, мб и в С++) есть указательная арифметика, позволяющая бегать по массиву через +, а не через индекс. [простыми словами] Для любопытных: псомотрите референсы - StrongReferene, WeakReference, etc
Никита 10 уровень, Пермь
23 сентября 2020
"Ссылки на объекты..." "Нельзя увеличить или уменьшить" ШТА??
🦔 Виктор 20 уровень, Москва Expert
17 сентября 2020
Удаляйте неиспользуемые объекты.
Pronax 9 уровень, Санкт-Петербург
8 сентября 2020
Мне интересно, у меня когда-нибудь будут вообще такие моменты, чтобы не хватало материи или ее было меньше 200? Пишите, у кого сколько материи сейчас. У меня 230.
Егор Анчутин 41 уровень, Санкт-Петербург
31 августа 2020
🐨
Alec I 16 уровень
26 августа 2020
😀
Zhanna 20 уровень, Москва
24 августа 2020
🦜
Zhanna 20 уровень, Москва
24 августа 2020
🦚