Случайный разговор: объясните своей девушке, как GC определяет, что можно переработать?

Java задняя часть алгоритм программист


Закончив работу в понедельник вечером, я счастливый пришел домой, а моя девушка вскочила и побежала ко мне, держа в руке веник и швабру. Это снова ударит по мне? Я опять что-то не так делаю? Мой мозг крутится на большой скорости. В это время подруга нарушила молчание.






Сборка мусора, именуемая GC, китайское название «сборка мусора». Это концепция, связанная с управлением памятью компьютера.Мусор здесь относится к пространству памяти, которое программа не использует.




что такое сбор мусора


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


В реальном мире под мусором подразумевают непрочитанные книги, неношеную одежду и т. д. «Хлам» в данном случае относится к «вещам, которыми вы не пользуетесь». Когда мы организуем работу по дому, мы обычно делаем две вещи: находим мусор, который не используется в доме, и выбрасываем мусор, чтобы положить какие-то другие полезные вещи.


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




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


Как мы уже упоминали ранее, мусор в жизни — это то, что не используется. Но как определить «не нужно»?


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


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


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

1. Посмотрите, есть ли дома какое-либо устройство, которое может использовать этот зарядный порт.

2. Посмотрите, есть ли дома адаптер, который можно адаптировать к этому кабелю USB.


Если есть, то считаем кабель полезным, иначе кабель USB будет помечен нами как мусор. Ожидание сброса.


Вышеупомянутый метод вызывается в алгоритме мобильного телефона мусора компьютера.引用计数法, процесс алгоритма следующий: добавляем счетчик ссылок к объекту, всякий раз, когда есть ссылка на него, счетчик увеличивается на 1, а когда ссылка недействительна, значение счетчика уменьшается на 1. Когда выполняется сборка мусора, необходимо только определить, равно ли значение счетчика ссылок этого объекта 0. Если значение счетчика ссылок равно 0, это означает, что его можно перезапустить.


Это относительно простой алгоритм, и этот метод сборки мусора относительно прост.


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


Но что, если никто вообще не хочет использовать этот кабель MP3 и USB? Например, этот кабель USB и MP3 оставил гость дома, а он сказал, что он ему больше не нужен?


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




Алгоритмы анализа достижимости


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


Поэтому, когда будет надежнее судить, является ли предмет мусором, мы возьмем предмет и спросим у всех членов семьи: Вам еще нужен этот предмет?


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


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


Вышеупомянутый метод оценки мусора вызывается в компьютере可达性分析算法, основная идея этого алгоритма состоит в том, чтобы использовать ряд объектов «GC Root» в качестве отправной точки, начать поиск вниз от этих узлов, и путь, пройденный поиском, становится цепочкой ссылок. GC Root без какой-либо цепочки ссылок, объект оказывается недоступным.


Предмет, который ни один из членов семьи не заявил о необходимости продолжать использовать. Точно так же, как и для объекта, это то же самое, что и для доступа ко всем «GC Root» без цепочки ссылок.


В языке Java объекты, которые можно использовать в качестве корней сборщика мусора, включают следующее:


1. Объекты, на которые есть ссылки в стеке виртуальной машины.


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


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


4. Объекты, на которые ссылается JNI в собственном стеке методов.






Судьба мусора


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


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


В общем, чтобы объявить объект мертвым, требуется как минимум два процесса маркировки:


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


2. Виртуальная машина создает поток Finalizer с низким приоритетом для выполнения метода finalize() объектов в F-Queue. Если объект может «сохранить» себя в методе finalize(), он не будет собран, в противном случае он будет перемещен в коллекцию объектов, которые собираются собрать.


Как объект «сохраняет» себя в finalize()?


Самый простой способ — возобновить ссылку, например, присвоить себя переменной класса или переменной-члену объекта.