Вывоз Мусора

Сборка мусора освобождает вас от бремени освобождения выделенной памяти. Знать, когда явно освободить выделенную память, может быть очень сложно. Предоставление этой работы виртуальной машине Java имеет несколько преимуществ:

  1. Это может сделать вас более продуктивным.
  2. Второе преимущество сборки мусора заключается в том, что она помогает обеспечить целостность программы. Сборка мусора является важной частью стратегии безопасности Java. Программисты Java не могут случайно (или намеренно) вывести виртуальную машину Java из строя из-за неправильного освобождения памяти.

Накладные расходы

  1. Управление накладными расходами: GC добавляет накладные расходы, которые могут повлиять на производительность программы. Виртуальная машина Java должна отслеживать, на какие объекты ссылается исполняющая программа, а также завершать и освобождать объекты без ссылок на лету.
  2. Непредсказуемо: Это действие, скорее всего, потребует больше процессорного времени, чем потребовалось бы, если бы программа явно освободила ненужную память. Кроме того, программисты в среде сбора мусора меньше контролируют планирование процессорного времени, посвященного освобождению объектов, которые больше не нужны.

На приведенном ниже графике моделируется идеальная система, которая идеально масштабируется, за исключением сбора http://hayastannews.com/news/218212.html мусора. Красная линия-это приложение, которое тратит только 1% времени на сборку мусора в однопроцессорной системе. Это приводит к потере пропускной способности более чем на 20% в 32 процессорных системах. В 10% случаев при сборке мусора (не считается чрезмерным количеством времени при сборке мусора в однопроцессорных приложениях) при масштабировании до 32 процессоров теряется более 75% пропускной способности.

Суспензии ГК с увеличением числа процессоров

Зачем Собирать Мусор?

  1. Ограниченная Память
  2. Уплотнение (Де-фрагментация)

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

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

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

Все объекты размещаются в области кучи, управляемой JVM.

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

Чем заняться:

  1. Когда программа больше не ссылается на объект, занимаемое им пространство кучи может быть переработано, чтобы освободить его для последующих новых объектов.
  2. Сборщик мусора должен каким-то образом определить, на какие объекты больше не ссылается программа, и освободить место в куче, занимаемое такими объектами без ссылок.
  3. В процессе освобождения объектов без ссылок сборщик мусора должен запускать все завершители освобождаемых объектов.

Полный алгоритм можно обобщить следующим образом:

  1. Определение набора из roots.
  2. Определение reachabilityот корней.
    • Объект достижим, если существует некоторый путь ссылок от корней, по которому исполняемая программа может получить доступ к объекту.
    • Корни всегда доступны для программы.
    • Рассматриваются любые объекты, доступные из корней live.
    • Объекты, которые недоступны, считаются мусором, поскольку они больше не могут влиять на будущий ход выполнения программы.

Корень

Корневой набор в JVM зависит от реализации, но всегда будет включать:

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

В Java существует четыре вида корней GC:

  1. Локальные переменные сохраняются в стеке потока. Это не виртуальная ссылка на реальный объект и, следовательно, не видна. Во всех смыслах и целях локальные переменные являются корнями GC.
  2. Активные потоки Java всегда считаются живыми объектами и, следовательно, являются корнями GC. Это особенно важно для локальных переменных потока.
  3. На статические переменные ссылаются их классы. Этот факт делает их де-факто корнями GC. Сами классы могут быть собраны в мусор, что приведет к удалению всех статических переменных, на которые имеются ссылки. Это имеет особое значение, когда мы используем серверы приложений, контейнеры OSGi или загрузчики классов в целом. Мы обсудим связанные с этим проблемы в разделе Шаблоны проблем.
  4. Ссылки JNI-это объекты Java, созданные собственным кодом в рамках вызова JNI. Созданные таким образом объекты обрабатываются специально, потому что JVM не знает, ссылается ли на них собственный код или нет.