Что такое корни?


каковы корни в сборке мусора?

Я прочитал определение root как "любая ссылка, к которой вы можете получить доступ", а определение live-это объект, который используется, который может быть локальной переменной, статической переменной.

Я немного путаю с различением разницы между корневыми и живыми объектами.

Что такое путь к корню? Как работают корневые и живые объекты?

может кто-нибудь уточнить ?

5 59

5 ответов:

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

Person p = new Person();
p.car = new Car(RED);
p.car.engine = new Engine();
p.car.horn = new AnnoyingHorn();

есть четыре объекта; человек, красный автомобиль, его двигатель и клаксон. Нарисуйте справочный график:

     Person [p]
        |
     Car (red)
   /           \
Engine    AnnoyingHorn

и вы в конечном итоге с Person в "корне" дерева. Он живой, потому что на него ссылается локальная переменная, p, который программа может использовать в любое время обратиться к

корни GC (сборщик мусора) - это объекты, специальные для сборщика мусора. Сборщик мусора собирает те объекты, которые не являются корнями GC и недоступны по ссылкам из корней GC.

существует несколько видов корней GC. Один объект может принадлежать более чем одному виду корня. Корневые виды:

  • класс-класс, загруженный загрузчиком системного класса. Такие классы никогда не могут быть выгружены. Они могут удерживать объекты через статические поля. Обратите внимание, что классы, загруженные пользовательскими загрузчиками классов, не являются корнями, если только соответствующие экземпляры java.ленг.Класс - это корни другого рода(ов).
  • Thread-live thread
  • Stack Local-локальная переменная или параметр метода Java
  • JNI Local-локальная переменная или параметр метода JNI
  • JNI Global-глобальная ссылка JNI
  • монитор используется-объекты, используемые в качестве монитора для синхронизации
  • удерживается JVM-объекты удерживаются от сбор мусора JVM для своих целей. На самом деле список таких объектов зависит от реализации JVM. Возможные известные случаи: системный загрузчик классов, несколько важных классов исключений, о которых знает JVM, несколько предварительно выделенных объектов для обработки исключений и пользовательские загрузчики классов, когда они находятся в процессе загрузки классов. К сожалению, JVM не предоставляет абсолютно никаких дополнительных деталей для таких объектов. Таким образом, аналитик должен решить, в каком случае определенный " удерживаемый СПМ " принадлежит.

(кредита сайт YourKit)

Не упомянутый YourKit-это тот факт, что объекты, ожидающие завершения, будут сохранены как корни, пока GC не запустит finalize() метод. Это может вызвать переходное удержание больших графов несколько неожиданно. Общее правило-не использовать финализаторы (но это другой вопрос).

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

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

Я знаю Java больше, чем платформу .Net, поэтому я буду говорить только за одного. На платформе Java корни GC фактически зависят от реализации. Однако в большинстве случаев корни GC, как правило, являются операндами в стеке (поскольку они в настоящее время используются потоками) и классовыми (статическими) членами классов. Достижимость вычисляется из этих объектов в большинстве JVMs. Есть и другие случаи, когда местные параметры и операнды, используемые вызовами JNI, будут считаться частью корневого набора, а также использоваться для вычисления достижимости.

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

The web-сайте IBM перечисляет следующее как корни GC.

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

  • система класс

    класс, загруженный загрузчиком начальной загрузки или загрузчиком системного класса. Например, эта категория включает в себя все классы rt.jar файл (часть среды выполнения Java environment), например, в java.утиль.* пакет.

  • JNI local

    локальная переменная в машинном коде, например пользовательский код JNI или внутренний код JVM.

  • JNI global

    глобальная переменная в машинном коде, например пользовательский код JNI или внутренний код JVM.

  • нить блок

    объект, который был ссылка из активного блока потока.

  • Thread

    Бегущий поток.

  • занят монитор

    все, что вызывало методы wait() или notify () или синхронизировано, например, путем вызова метода synchronized (Object) или путем ввода синхронизированного метода. Если метод был статическим, корень является классом, в противном случае он является объект.

  • Java local

    локальная переменная. Например, входные параметры, или локально созданные объекты методов, которые все еще находятся в стеке потока. Родной стек

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

  • финализатор

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

  • воспроизведение

    объект, который имеет метод finalize, но не был завершен и еще не находится в очереди финализатора.

  • недоступен

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

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

    по умолчанию, недоступен объекты исключаются, когда анализатор памяти анализирует дамп "кучи". Поэтому эти объекты не отображаются в гистограмме, дереве доминатора или результатах запроса. Это поведение можно изменить, щелкнув Файл > Параметры... > IBM Diagnostic Tools for Java-Memory Analyzer, затем установите флажок хранить недоступные объекты.

  • Java stack frame

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

  • неизвестный

    объект неизвестного типа. Некоторые дампы, такие как IBM Portable Heap Dump (.наук) файлы, не имеют корневой информации. В этом случае анализатор памяти отмечает объекты, которые не имеют входящих ссылок или недоступны из любого другого корня, как неизвестные. Этот действие гарантирует, что анализатор памяти сохранит все объекты в дампе.

в java я бы сказал, что потоки являются корневыми объектами. Каждый живой объект можно проследить до живого потока. Например, на статический объект ссылается класс, на который ссылается загрузчик классов, на который ссылается другой класс, на который ссылается экземпляр этого класса ... на который ссылается Runnable, на который ссылается живой поток. (обратите внимание, классы могут быть GC'Ed, они не могут быть корнями)

мы также можем рассмотреть" реальный " корень для все потоки, однако, это выходит за рамки стандартной Java. Мы не можем сказать, что это такое, и как он ссылается на все потоки.