Смотрите интервью, механизм разговор GC

предисловие

Источник: studyidea.cn/

GCКитайский переводчик вывоз мусора, является пространством памяти мелиоративных механизмы утечек избежать памяти. Когда JVMпамять плотно, выполняя GCэффективное восстановление памяти , выделенной для нового объекта , в свою очередь позволяет повторное использование памяти. JVM GCХотя необходимость разработки механизмов для активного участия, уменьшить их рабочую нагрузку, но в некоторых случаях, автоматически GCприведет к снижению производительности системы, медленной реакции, поэтому , который нам нужно заранее понять GCмеханизм. Столкнувшись с такой ситуацией, чтобы затишья решить эту проблему. Кроме того GCмеханизмы также Javaинтервью с высокочастотными вопросы, понять GC является важным навыком.

Исследование GC, мы сначала решить три проблемы:

  • Что такое мусор
  • Где мусор
  • Как мусор

Что такое мусор

Давайте посмотрим на простой кусок кода.

код

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

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

Есть может быть использовано для отметки два алгоритма:

  • подсчет ссылок
  • анализ достижимости

подсчет ссылок

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

подсчет ссылок

, Когда выше фиги strссылка объекта в куче, в качестве значения отсчета. Когда strизменяется , nullкогда либо объект больше не ссылается, значение счетчика не уменьшается на единицу. В это время, объект может быть GCвосстановлен.

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

Подсчет ссылок -1

Может быть видно из рисунка, a, bон больше не ссылается кучи объектов, что приводит рассчитывать на один. В этом случае имеется внутренняя ссылка на два объекта друг к другу, значение счетчика не является 0, то GCнет способа восстановить объект.

анализ достижимости

Алгоритм должен сначала найти ссылку на текущий активный в соответствии с правилами, он будет называться GC Roots. Тогда GC Rootsкак вид узла корня, пересекает график ссылки на объект, будет иметь возможность пересечь (до) объект помечен для выживания, остальные объекты как бесполезные объекты.

анализ достижимости

Обратите внимание , что да ссылки , а не объекта.

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

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

  • Метод локальных переменных
  • Статические переменные, константы
  • JNI ручки
  • ....

Где мусор

Помните начало контакта Java, стек только знать, экземпляры объектов , выделенные в куче, метод находится в стеке локальной переменной. На самом деле JVMобласть памяти делится более тонко разделить на:

  • отвал
  • Методы района
  • стек VM
  • Родные стеки метод
  • счетчик программ

зонирование выполнения памяти JVM

Как видно, наша память делится на потоки и потоки разделяют частные. Методы являются поточно область стека и общая площадь, две части занимают JVMбольшую часть памяти, а остальные три будут связаны младший брат с резьбой, с резьбой фильеры, он будет автоматически JVMвосстановлен.

отвал

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

Методы района

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

стек

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

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

public static native void arraycopy(Object src,  int  srcPos,
                                    Object dest, int destPos,
                                    int length);
复制代码

счетчик программ

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

Как рециркуляция

Алгоритм основных ОГО тока разделен на три типа:

  • Марк - алгоритм развертки
  • алгоритм репликации
  • Марк - Collation алгоритм

Марк - алгоритм развертки

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

  • Метка: выше GC Rootsобъект флаг вверх.
  • Clear: Чистые немаркированные объекты .

Изображение-20191214114722060

пс: Эта карта очень трудно сделать ах. , , ,

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

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

Для того, чтобы процитировать его здесь R Бог @RednaxelaFX ответ.

Изображение-20191214141247453

Кроме того , существует дефицит этого алгоритма: Четкая маркировка и эффективность относительно невелика. Это может даже привести к GCзанять слишком много времени, влияющее на нормальную программу.

алгоритм репликации

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

Изображение-20191214144413235

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

PS: Репликация алгоритм пространства для времени, они не могут иметь и

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

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

Марк - Collation алгоритм

Марк - алгоритм сортировки может быть отмечен - Clear улучшенной версии алгоритма повышает проблема космического мусора очищается в результате. Этот алгоритм делится на два этапа:

  • Теги: также GC Rootsмаркирование живых объектов.
  • Отделка: перемещение живых объектов к концу, в соответствии с адресом памяти первого рода, то в конце границы, чем прямая очистка памяти.

Изображение-20191214152625150

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

Алгоритм сбора Generational

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

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

Каждое новое поколение GCпосле того, как объект может быть переработано в больших количествах, он больше подходит для алгоритма репликации, нужно только оплатить стоимость копирования небольшого количества живых объектов. Здесь память разделена и не 1: 1 деление, по умолчанию будет следовать 8: 1 делится на: 1 Edenи два Survivorпространства. Каждое использование Edenс Survivorпространством, так что мы просто бездельничать 10% от объема памяти. Но каждый раз , когда мы не можем обеспечить выживание и восстановление объекта составляет менее 10%, в этом случае вы должны полагаться на выделении памяти обеспеченной старость. Если Survivorпространство не спасает остальные живые объекты, эти объекты будут перемещаться по распределению , чтобы гарантировать бинарные года.

объекты OLD выживания будут особенно высоки, и нет никакой гарантии, дополнительное пространство выделяется, он не подходит для алгоритма репликации, необходимо использовать знак - развертку или знак - алгоритмы сортировки.

Просто разговоры

В последнее время года выпускной экзамен, он взял Чжоу Чжимин «в глубины Java Virtual Machine» , чтобы переучиваться. Помните первый раз взглянуть на эту книгу, большую часть контента не может читать, читать скоро забудут. Затем через некоторое время, забрать книгу снова, на этот раз лучше , чем в прошлый раз, мы смогли увидеть немного больше , чем наполовину. Последние партнерства с некоторым небольшим чатом и обнаружил , что они все читали эту книгу , чтобы узнать JVM, должно сказать , что эта книга действительно книга Бога. Последние «в глубинах Java Virtual Machine,» третье издание в ближайшее время в продаже есть маленькие партнеры должны можно считать начало.

Ну, GCмеханизм суммировать здесь, давайте поговорим о следующем JVM общий GCколлектор.

Помощь ссылка

Корни GC Java Virtual Machine Детальнее 04 ---- GC алгоритм и тип углубленного Java Virtual Machine

Я приветствую внимание общественности номера: программы - интерпретатора, и получение ежедневной сухой толчке. Если вы заинтересованы в моей теме содержания, вы можете сосредоточиться на своем блоге: studyidea.cn

Другие платформы .png

рекомендация

отjuejin.im/post/5df786c56fb9a0161e592da4
рекомендация