Что такое сборщик мусора в java

Разбираемся со сборкой мусора в Java — Java2Blog

Что такое сборщик мусора в java. Смотреть фото Что такое сборщик мусора в java. Смотреть картинку Что такое сборщик мусора в java. Картинка про Что такое сборщик мусора в java. Фото Что такое сборщик мусора в java

В этой статье мы рассмотрим механизм сборки мусора на платформе Java.

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

Младшее поколение (young generation)

Старшее поколение (old generation)

Метапространство — постоянное поколение (permanent generation)

Область младшего поколения

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

Когда область младшего поколения заполняется, происходит малая сборка мусора (minor GC).

При выполнении малой сборки мусора из области младшего поколения удаляются мертвые объекты.

Если в младшем поколении находится много мертвых объектов, малая сборка мусора выполняется быстрее.

Все операции малой сборки мусора являются событиями «остановки мира» (stop-the-world), поэтому при их выполнении также останавливаются потоки приложений.

Давайте разберемся, как размещаются объекты в области младшего поколения.

Младшее поколение делится на три части.

Ниже приведена схема, иллюстрирующая области младшего и старшего поколений.

Что такое сборщик мусора в java. Смотреть фото Что такое сборщик мусора в java. Смотреть картинку Что такое сборщик мусора в java. Картинка про Что такое сборщик мусора в java. Фото Что такое сборщик мусора в java

    Все новые объекты размещаются в регионе Eden («Эдем»).

    Когда регион Eden будет окончательно заполнен объектами, произойдет малая сборка мусора. Все объекты, кроме мертвых и тех, на которые нет ссылок, будут перемещены в один из регионов Survivor (регионы для выживших объектов). Пусть в нашем случае все объекты будут перемещены в регион S0.

    Что такое сборщик мусора в java. Смотреть фото Что такое сборщик мусора в java. Смотреть картинку Что такое сборщик мусора в java. Картинка про Что такое сборщик мусора в java. Фото Что такое сборщик мусора в java

    Что такое сборщик мусора в java. Смотреть фото Что такое сборщик мусора в java. Смотреть картинку Что такое сборщик мусора в java. Картинка про Что такое сборщик мусора в java. Фото Что такое сборщик мусора в java

    Что такое сборщик мусора в java. Смотреть фото Что такое сборщик мусора в java. Смотреть картинку Что такое сборщик мусора в java. Картинка про Что такое сборщик мусора в java. Фото Что такое сборщик мусора в java Что такое сборщик мусора в java. Смотреть фото Что такое сборщик мусора в java. Смотреть картинку Что такое сборщик мусора в java. Картинка про Что такое сборщик мусора в java. Фото Что такое сборщик мусора в java

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

    Запустим программу и проверим выделение памяти с помощью Visual GC (плагин для VisualVM).

    Что такое сборщик мусора в java. Смотреть фото Что такое сборщик мусора в java. Смотреть картинку Что такое сборщик мусора в java. Картинка про Что такое сборщик мусора в java. Фото Что такое сборщик мусора в java

    Как видите, в S0 есть несколько объектов. Как только регион Eden окончательно заполнился, все объекты, на которые имелись ссылки, переместились в S1.

    Что такое сборщик мусора в java. Смотреть фото Что такое сборщик мусора в java. Смотреть картинку Что такое сборщик мусора в java. Картинка про Что такое сборщик мусора в java. Фото Что такое сборщик мусора в java

    Область старшего поколения

    Используется для размещения долгоживущих объектов.

    Обычно больше, чем область младшего поколения.

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

    Во многих случаях операции крупной сборки мусора выполняются медленнее и менее часто по сравнению с малой сборкой мусора.

    Как эти знания помогут в оптимизации работы с памятью?Это зависит от характера приложения.Если у вас много временных объектов, то будет много операций малой сборки мусора. Можно указать аргумент XX:NewRatio=1, чтобы выделить 50 % кучи на младшее поколение и 50 % — на старшее.По умолчанию NewRatio=2, то есть младшее поколение занимает 1/3 всей кучи.Точно так же, если у вас очень много объектов-долгожителей, может потребоваться увеличить размер области старшего поколения, задав большее значение для NewRatio.

    Зачем нужны два региона Survivor?

    Вероятно, вам интересно, зачем нам два региона для выживших объектов. Мы используем два региона Survivor во избежание фрагментации памяти. При каждом копировании объектов из региона Eden в регион Survivor получается пустой регион Eden и один пустой регион Survivor.

    Алгоритмы сборки мусора

    В виртуальную машину Java встроены несколько алгоритмов для организации областей младшего и старшего поколений. Существует три типа таких алгоритмов.

    Последовательная сборка мусора

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

    Что такое сборщик мусора в java. Смотреть фото Что такое сборщик мусора в java. Смотреть картинку Что такое сборщик мусора в java. Картинка про Что такое сборщик мусора в java. Фото Что такое сборщик мусора в java

    Параллельная сборка мусора

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

    Что такое сборщик мусора в java. Смотреть фото Что такое сборщик мусора в java. Смотреть картинку Что такое сборщик мусора в java. Картинка про Что такое сборщик мусора в java. Фото Что такое сборщик мусора в java

    Одновременная сборка мусора

    В алгоритме одновременной сборки мусора (concurrent mark sweep, CMS) для сборки мусора используются потоки приложения. Такой подход полезен в приложениях, которые имеют дело с наборами данных среднего или крупного объема и требуют повышенного быстродействия.

    Что такое сборщик мусора в java. Смотреть фото Что такое сборщик мусора в java. Смотреть картинку Что такое сборщик мусора в java. Картинка про Что такое сборщик мусора в java. Фото Что такое сборщик мусора в java

    Для организации областей младшего и старшего поколений можно использовать различные алгоритмы сборки мусора, однако комбинировать между собой можно только совместимые алгоритмы.

    Например, нельзя одновременно использовать алгоритм параллельной сборки мусора для младшего поколения и алгоритм CMS для старшего поколения, так как параллельный алгоритм не обеспечивает синхронизацию, необходимую для CMS.

    С выходом Java 8 в механизм сборки мусора было внесено множество изменений, о которых я постараюсь написать в будущих статьях.

    Если у вас есть какие-либо предложения по этой статье, пишите в комментариях.

    Всех желающих приглашаем на открытый урок «Конструкторы и блоки инициализации». На этом занятии мы:
    — Разберём конструктор на запчасти;
    — Определим финалистов (финальные переменные);
    — Наведём порядок (инициализации).
    >> РЕГИСТРАЦИЯ

    Источник

    Дюк, вынеси мусор! — Часть 1

    Что такое сборщик мусора в java. Смотреть фото Что такое сборщик мусора в java. Смотреть картинку Что такое сборщик мусора в java. Картинка про Что такое сборщик мусора в java. Фото Что такое сборщик мусора в java

    Наверняка вы уже читали не один обзор механизмов сборки мусора в Java и настройка таких опций, как Xmx и Xms, превратилась для вас в обычную рутину. Но действительно ли вы в деталях понимаете, что происходит под капотом вашей виртуальной машины в тот момент, когда приходит время избавиться от ненужных объектов в памяти и ваш идеально оптимизированный метод начинает выполняться в несколько раз дольше положенного? И знаете ли вы, какие возможности предоставляют вам последние версии Java для оптимизации ответственной работы по сборке мусора, зачастую сильно влияющей на производительность вашего приложения?

    Попробуем в нескольких статьях пройти путь от описания базовых идей, лежащих в основе всех сборщиков мусора, до разбора алгоритмов работы и возможностей тонкой настройки различных сборщиков Java HotSpot VM (вы ведь знаете, что таких сборщиков четыре?). И самое главное, рассмотрим, каким образом эти знания можно использовать на практике.

    Следует сразу оговориться, что все сказанное ниже относится к виртуальной машине HotSpot. Так что если вы встречаете в тексте упоминание JVM, то речь идет именно об этой реализации. Но базовые принципы распространяются и на виртуальные машины других поставщиков, хотя в некоторых деталях они могут отличаться.

    А оно мне надо?

    Резонный вопрос. Далеко не любой программе для беспроблемной работы требуется тонкая настройка сборщика мусора. Очень часто выделения ей необходимого объема памяти оказывается достаточным. В конце концов, редкий пользователь заметит, что отклик программы время от времени занимает на сотню-другую миллисекунд дольше обычного.

    Разделяй и властвуй

    Прежде чем приступить непосредственно к решению вопросов очистки наших Авгиевых конюшен, давайте разберемся с их общим устройством и определимся, на чем конкретно нам хотелось бы сосредоточиться.

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

    Если ваше приложение при работе самостоятельно не генерирует новые классы и не занимается постоянной подгрузкой / выгрузкой классов, то состояние non-heap в долгосрочной перспективе будет близким к статичному и мало поддающимся оптимизации. В связи с этим, механизмы функционирования области non-heap мы здесь рассматривать не будем, а сосредоточимся на той области, где наши усилия принесут наибольшую выгоду.

    Все объекты, которые явно или неявно создаются Java-приложением, размещаются в куче. Над оптимизацией размещения объектов и алгоритмами их обработки разработчики языков с автоматической сборкой мусора бьются с первого дня их создания. И как минимум в ближайшем будущем эта битва будет продолжаться, ведь объемы обрабатываемых данных растут, а требования к сборке мусора у различных приложений сильно отличаются, что делает создание единого идеального сборщика не самым тривиальным делом. Наше же дело — следить за развитием ситуации и стараться извлекать из имеющихся инструментов как можно больше пользы.

    Из поколения в поколение

    Что такое сборщик мусора в java. Смотреть фото Что такое сборщик мусора в java. Смотреть картинку Что такое сборщик мусора в java. Картинка про Что такое сборщик мусора в java. Фото Что такое сборщик мусора в java

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

    Далее идут объекты, создаваемые для выполнения более-менее долгих вычислений. Их жизнь чуть разнообразнее — они обычно гуляют по различным методам, трансформируясь и обогащаясь в процессе, но после этого становятся ненужными и превращаются в мусор. Благодаря таким объектам возникает небольшой бугорок на графике следом за пиком временных объектов.

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

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

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

    Что такое сборщик мусора в java. Смотреть фото Что такое сборщик мусора в java. Смотреть картинку Что такое сборщик мусора в java. Картинка про Что такое сборщик мусора в java. Фото Что такое сборщик мусора в java

    Вот тут и возникает идея разделения объектов на младшее поколение (young generation) и старшее поколение (old generation). В соответствии с этим разделением и процессы сборки мусора разделяются на малую сборку (minor GC), затрагивающую только младшее поколение, и полную сборку (full GC), которая может затрагивать оба поколения. Малые сборки выполняются достаточно часто и удаляют основную часть мертвых объектов. Полные сборки выполняются тогда, когда текущий объем выделенной программе памяти близок к исчерпанию и малой сборкой уже не обойтись.

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

    Вам быстро, дешево или качественно?

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

    Традиционно, при определении эффективности работы сборщика мусора учитываются следующие факторы:

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

    Memento Mori

    Господи, дай мне места для размещения того, что пока еще нужно,
    Дай мне смелости удалить то, что больше не пригодится,
    И дай мне мудрости, чтобы отличить одно от другого.
    — Молитва сборщиков мусора

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

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

    Все мы знаем, что считать объект живым просто по факту наличия на него ссылок из других объектов нельзя. В противном случае рецепт бессмертия в JVM был бы до безобразия прост и заключался бы в наличии взаимных ссылок хотя бы у двух объектов друг на друга, а в общем случае — в наличии цикла в графе связанности объектов. При таком подходе и ограниченном объеме памяти более-менее серьезная программа долго не проработала бы, поэтому с отслеживанием циклов в графах объектов JVM справляется хорошо.

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

    Рассмотрим такую ситуацию: У нас есть молодой объект A и ссылающийся на него объект B, уже заслуживший место в старшем поколении. В какой-то момент времени оба этих объекта стали нам не нужны и мы обнулили все имеющиеся у нас ссылки на них. Очевидно, объект A можно было бы удалить в ближайшую малую сборку мусора, но для того, чтобы получить это знание, сборщику пришлось бы просмотреть всё старшее поколение и понять, что объект B ссылающийся на A, тоже является мусором, а следовательно их оба можно утилизировать. Но анализ старшего поколения не входит в план малой сборки, так как является относительно дорогой процедурой, поэтому объект А во время малой сборки будет считаться живым.

    Что такое сборщик мусора в java. Смотреть фото Что такое сборщик мусора в java. Смотреть картинку Что такое сборщик мусора в java. Картинка про Что такое сборщик мусора в java. Фото Что такое сборщик мусора в java

    Таким образом, чаще всего для целей малой сборки мусора объект считается мертвым и подлежащим утилизации, если до него невозможно добраться по ссылкам ни из объектов старшего поколения, ни из так называемых корней (roots), к каковым относятся ссылки из стеков потоков, статические члены классов При полной сборке мусора могут анализироваться оба поколения, поэтому здесь сборщик может плясать только от корней.

    Кстати, время от момента, когда объект стал нам не нужен, до момента его фактического удаления из памяти называется проворством (promptness) и иногда рассматривается как дополнительный фактор оценки эффективности сборщика.

    Под микроскопом

    Итак, мы уже получили базовые представления о том, чем занимаются сборщики мусора и по каким критериям их можно оценивать. Теперь хотелось бы разобраться, каким образом можно заглянуть внутрь виртуальной машины, чтобы у нас была возможность наблюдать за работой ее скрытых механизмов.

    Внутренние инструменты

    Что касается внутренних инструментов мониторинга, то здесь мы можем либо попросить JVM выводить информацию о производимых сборках с различным уровнем детализации (в stdout или в лог-файл), либо самостоятельно обращаться к MXBean’ам, возвращающим информацию о состоянии памяти и о выполняемых сборках мусора, и обрабатывать ее как нам вздумается.

    В JVM HotSpot доступны следующие опции, управляющие выводом информации о сборках мусора (это основные опции, работающие для всех сборщиков):

    Включает режим логирования сборок мусора в stdout.
    Указывает имя файла, в который должна логироваться информация о сборках мусора. Имеет приоритет над -verbose:gc.
    Добавляет к информации о сборках временные метки (в виде количества секунд, прошедших с начала работы программы).
    Включает расширенный вывод информации о сборках мусора.
    При старте приложения выводит в stdout значения всех опций, заданных явно или установленных самой JVM. Сюда же попадают опции, относящиеся к сборке мусора. Часто бывает полезно посмотреть на присвоенные им значения.

    Если вы хотите собирать данные из своего приложения самостоятельно, то для этого можно использовать соответствующие MXBean’ы. Вот пример простого класса, который позволяет выводить текущее состояние различных регионов памяти, а также информацию о сборках мусора, его можно взять за основу, если хотите разработать свой собственный мониторинг:

    Внешние инструменты

    В природе существует огромное количество инструментов, позволяющих подключиться к процессу Java и в удобном виде получить информацию о состоянии памяти и процессах сборки мусора. Это и входящие в поставку JVM HotSpot утилиты VisualVM (с плагином VisualGC) и Java Mission Control и различные инструменты/плагины для IDE и отдельные программы вроде JProfiler или YourKit и еще много чего.

    Вы можете выбрать то, чем вам удобнее пользоваться, но как уже было сказано выше, обязательно проверьте, какое влияние оказывает ваш инструмент и его настройки на подопытное приложение. Вот пример того, как VisualVM влияет на поведение программы, весь исполняемый код которой состоит из приостановки выполнения основного потока:

    Что такое сборщик мусора в java. Смотреть фото Что такое сборщик мусора в java. Смотреть картинку Что такое сборщик мусора в java. Картинка про Что такое сборщик мусора в java. Фото Что такое сборщик мусора в java

    Видите этот растущий график в верхней части? Это почти 8 МБ мусорных данных в минуту, привносимых мониторингом. Если вам нужно общее представление о том, как работает сборщик, либо если десяток мегабайт данных в минуту для вашей программы меньше допустимой погрешности измерений, то такое поведение инструменту можно простить. Но если вы проводите тонкую настройку и у вас каждый мегабайт на счету, то лучше выбрать что-нибудь менее прожорливое.

    В идеале, ваш инструмент должен отображать график использования памяти коматозной программой как-нибудь так:

    Что такое сборщик мусора в java. Смотреть фото Что такое сборщик мусора в java. Смотреть картинку Что такое сборщик мусора в java. Картинка про Что такое сборщик мусора в java. Фото Что такое сборщик мусора в java

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

    А можно всех посмотреть?

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

    Как уже было сказано, описанные выше принципы сборки мусора являются общими для всех сборщиков. Но при этом между сборщиками существуют и заметные различия, проявляющиеся в ответах на следующие вопросы:

    Что такое сборщик мусора в java. Смотреть фото Что такое сборщик мусора в java. Смотреть картинку Что такое сборщик мусора в java. Картинка про Что такое сборщик мусора в java. Фото Что такое сборщик мусора в java

    Java HotSpot VM предоставляет разработчикам на выбор четыре различных сборщика мусора:

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

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

    Concurrent Mark Sweep (CMS) — нацелен на снижение максимальных задержек путем выполнения части работ по сборке мусора параллельно с основными потоками приложения. Подходит для работы с относительно большими объемами данных в памяти.

    Garbage-First (G1) — создан для постепенной замены CMS, особенно в серверных приложениях, работающих на многопроцессорных серверах и оперирующих большими объемами данных.

    В следующих статьях мы детально рассмотрим каждый из этих сборщиков, стараясь придерживаться общего плана: краткое описание, принципы работы, ситуации STW (это stop the world, если успели забыть), способы настройки, достоинства и недостатки. Получив эти знания, мы посмотрим, что с ними делать в реальной жизни.

    Источник

    Сборка мусора

    — Привет! Снова решила устроить тебе небольшую лекцию про сборку мусора.

    Как ты уже знаешь, Java-машина сама отслеживает ситуации, когда объект становится ненужным и удаляет его.

    — Ага. Вы с Ришей раньше мне рассказывали об этом, нюансов я не помню.

    Что такое сборщик мусора в java. Смотреть фото Что такое сборщик мусора в java. Смотреть картинку Что такое сборщик мусора в java. Картинка про Что такое сборщик мусора в java. Фото Что такое сборщик мусора в java

    Как только объект создается, Java выделяет ему память. А за востребованностью объекта следит с помощью переменных-ссылок. Объект может быть удален при «сборке мусора» — процедуре очистки памяти, если не остается переменных, которые ссылаются на этот объект.

    — А расскажи немного о сборщике мусора, что это такое и как он работает.

    — Ок. Раньше сборка мусора происходила в главном потоке/нити. Раз в 5 минут, или чаще. Если наступал случай, когда не хватало свободной памяти, Java-машина приостанавливала работу всех нитей и удаляла неиспользуемые объекты.

    Но сейчас от этого подхода отказались. Сборщик Мусора нового поколения работает незаметно и в отдельном потоке. Такую сборку мусора принято называть параллельной.

    — Ясно. А как именно определяется – нужно удалять объект или нет.

    — Просто считать количество ссылок на объект не очень эффективно – ведь могут быть объекты, которые ссылаются друг на друга, но больше на них не ссылается никто.

    Поэтому в Java применяется другой подход. Java делит объекты на достижимые и недостижимые. Объект считается достижимым (живым), если на него ссылается другой достижимый (живой) объект. Достижимость считается от нитей. Работающие нити всегда считаются достижимыми (живыми), даже если на них никто не ссылается.

    — Ок. С этим вроде ясно.

    А как происходит сама уборка мусора – удаление ненужных объектов?

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

    — Интересный подход. И не надо считать ссылки – скопировал все достижимые объекты, а все остальные – мусор.

    — Там все немного сложнее. Программисты Java выяснили, что объекты обычно делятся на две категории – долгоживущие (которые существуют все время работы программы) и маложивущие (нужны в методах и для выполнения «локальных» операций).

    Хранить долгоживущие отдельно от маложивущих гораздо эффективнее. Для этого надо было придумать механизм определения долгожительства объекта.

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

    Сборщик Мусора очень — сложная и эффективная составляющая Java. Многие его части работают эвристически – на основе алгоритмов-догадок. Поэтому он часто «не слушается» пользователя.

    — У Java есть объект GC (Garbage Collector – Сборщик Мусора), который можно вызвать с помощью метода System.gc ().

    — Ничего себе! Буду знать.

    — Но и это еще не все. Как ты знаешь, в Java одни объекты ссылаются на другие, и именно с помощью этой сети ссылок определяется – стоит удалять объект или нет.

    Так вот, в Java есть специальные ссылки, которые позволяют влиять на этот процесс. Для них есть специальные классы-обертки. Вот они:

    SoftReference – мягкая ссылка.

    WeakReference – слабая ссылка.

    PhantomReference – призрачная ссылка.

    — М-да. Чем-то напоминает внутренние классы, вложенные классы, внутренние анонимные классы, локальные классы. Названия разные, но по ним совсем не понятно за что они отвечают.

    — Вот ты, Амиго, и стал программистом. Теперь ты возмущаешься по поводу названий классов – дескать, недостаточно информативны, и нельзя по одному названию(!) определить, что этот класс делает, как и зачем.

    — Ого. А я и сам не заметил. Но это же так очевидно.

    Ладно. Соловья баснями не кормят. Давай я тебе расскажу про SoftReference – мягкие ссылки.

    Эти ссылки были специально придуманы для кэширования, хотя их можно использовать и для других целей – все на усмотрение программиста.

    Пример такой ссылки:

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

    Но! Объект, на который ссылаются только мягкие ссылки, может быть удален сборщиком мусора, если программе не хватает памяти. Если программе вдруг не хватает памяти, прежде чем выкинуть OutOfMemoryException, сборщик мусора удалит все объекты, на которые ссылаются мягкие ссылки и попробует выделить программе память еще раз.

    — Ага. Мне самому понравилось.

    — Спасибо за интересный рассказ, Элли. Действительно было очень интересно.

    Источник

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *