Этот учебник - понять базовую коллекцию мусора Java и то, как он работает. Это вторая часть учебной серии по сбору мусора. Я надеюсь, что вы прочитали первую часть: « Краткое представление о механизме сбора мусора Java ».
Java Grabage Collection - это автоматический процесс, используемый для управления памятью времени выполнения, используемой программами. Благодаря этому процессу автоматизации JVM устраняет накладные расходы программистов для распределения и свободных ресурсов памяти в программе.
Начать сбору мусора Java
В качестве автоматического процесса программистам не нужно начинать процесс сбора мусора, отображаемый в коде. System.gc () и Runtime.gc () используются для запроса JVM для запуска сбора мусора.
Хотя этот механизм запроса предоставляет программистам возможность начать процесс GC, стартап является обязанностью JVM. JVM может отклонить этот запрос, поэтому нет никакой гарантии, что все эти вызовы будут выполнять коллекцию мусора. Выбор времени запуска определяется JVM и зависит от того, доступна ли область Eden в памяти кучи. JVM оставляет этот выбор для реализации спецификации Java, а конкретные алгоритмы, используемые различными реализациями, различны.
Само собой разумеется, мы знаем, что процесс сбора мусора не может быть применен. Я только что нашел сцену, в которой имеет смысл Calling System.gc (). Благодаря этой статье давайте узнаем о экстремальных ситуациях, которые подходят для вызова System.gc () .
Процесс сбора мусора Java
Сборник мусора - это процесс восстановления бесполезного пространства памяти и предоставления его доступным для будущих экземпляров.
Область Эдема: Когда будет создан экземпляр, он сначала будет храниться в области Eden молодого поколения памяти.
Примечание. Если вы не можете понять эти слова, я предлагаю вам прочитать это введение в сборку мусора, которая обеспечивает подробное введение в модели памяти, архитектуры JVM и эти термины.
Зоны Survivor (S0 и S1): как часть цикла GC молодого поколения (миноргк), выживший объект (все еще упоминается) перемещается из зоны Eden в S0 зоны выжившего. Точно так же сборщик мусора сканирует S0 и перемещает выживший экземпляр в S1.
(Примечание переводчика: разве выжившие люди в Эдеме и S0 не переходят на S1? Почему они сначала переходят на S0, а затем от S0 на S1?)
Пример смерти (больше не упоминается) отмечается как сбор мусора. В зависимости от коллекционера мусора (есть четыре обычно используемых коллекционеров мусора, которые будут описаны в следующем учебном пособии), либо тегированные экземпляры постоянно удаляются из памяти, либо процесс утилизации завершается в отдельном процессе.
Старшее поколение: старшее поколение - вторая логическая область в памяти кучи. Когда коллекционер мусора выполняет цикл MinorGC, выживший экземпляр в области S1Survivor будет продвигаться до старости, в то время как неравномерные объекты отмечены как переработанные.
Старый GC (MajorGC): по сравнению с процессом сбора мусора Java, старый GC является последним этапом жизненного цикла экземпляра. Majorgc сканирует процесс переработки мусора пожилых людей. Если случаи больше не упоминаются, они отмечены как переработанные, иначе они будут продолжать оставаться в старости.
Shard памяти: как только экземпляр удален из памяти кучи, его местоположение становится пустым и может использоваться для распределения будущих экземпляров. Эти свободные пространства будут фрагментировать всю область памяти. Для быстрого распределения случаев требуется дефрагментация. Основываясь на различных вариантах коллекционера мусора, область переработанной памяти либо постоянно сортируется, либо завершается в отдельном процессе GC.
Конец случаев в сборе мусора
Прежде чем освободить экземпляр и восстановить пространство памяти, коллектор мусора Java вызывает соответствующий метод экземпляра (), так что экземпляр имеет возможность освободить ресурсы, которые он удерживает. Хотя гарантируется, что Finalize () будет вызвана до восстановления пространства памяти, указанный порядок и время не существует. Порядок между несколькими экземплярами непредсказуем и может даже происходить параллельно. Программы не должны предварительно настроить порядок между экземплярами и ресурсами переработки с использованием метода завершения ().
Любые исключения, которые не попадают в процесс завершения, будут автоматически игнорироваться, а процесс завершения экземпляра отменяется.
Спецификация JVM не обсуждает механизм сбора мусора для слабых ссылок и не имеет четких требований. Конкретная реализация определяется реализующей стороной.
Сбор мусора выполняется нитью демон.
Когда объект будет соответствовать условиям для сбора мусора?
Все случаи не имеют активного доступа к потоку.
Круглый эталонный экземпляр, к которому не обращаются ни какого другого экземпляра.
В Java существуют разные ссылочные типы. Определение того, соответствует ли экземпляр соответствующих условий сбора мусора, зависит от его эталонного типа.
| Ссылочный тип | Сбор мусора |
|---|---|
| Сильная ссылка | Не в соответствии с сборкой мусора |
| Мягкая ссылка | Сбор мусора может быть выполнена, но будет последним средством |
| Слабая ссылка | Средством сбора мусора |
| Призрачная ссылка | Средством сбора мусора |
В качестве метода оптимизации во время процесса компиляции компилятор Java может выбрать назначение нулевых значений экземплярам, тем самым отмечая экземпляр как пригодную для переработки.
класс животное {public static void main (string [] args) {Animal Lion = New Animal (); System.out.println («Main завершен»); } Защищенный void infintize () {System.out.println ("Rest With Mife!"); }}В приведенном выше классе объект Lion никогда не использовался после создания инстанции линии. Следовательно, в качестве меры оптимизации, компилятор Java может напрямую назначать Lion = NULL после создания строки. Поэтому функция завершения может распечатать «Restinpeace!» Еще до вывода SOP. Мы не можем доказать, что это произойдет, потому что это зависит от того, как реализована JVM и память, используемая во время выполнения. Тем не менее, мы можем выучить еще один: если компилятор увидит, что экземпляр никогда не будет ссылаться в будущем, он может выбирать и освободить пространство экземпляров на ранней стадии.
Существует лучший пример того, когда объекты соответствуют сбору мусора. Все атрибуты экземпляра могут храниться в регистрах, которые затем будут доступны и прочитаны. Без исключения эти значения будут записаны в экземпляр. Хотя эти значения могут использоваться в будущем, этот экземпляр все еще может быть помечен как соответствующий сборке мусора. Это очень классический пример, не так ли?
Это очень простой пример, который соответствует сбору мусора при назначении NULL. Конечно, сложные ситуации могут быть похожи на вышеуказанные точки. Это выбор, сделанный исполнителем JVM. Цель состоит в том, чтобы оставить наименьший след памяти, ускорить скорость отклика и повысить пропускную способность. Чтобы достичь этого, реализаторы JVM могут выбрать лучшее решение или алгоритм для восстановления пространства памяти во время процесса сбора мусора.
Когда вызывается метод infintize (), JVM выпускает все блокировки синхронизации на потоке.
GCSCOPE Пример программы
Класс gcscope {gcscope t; static int i = 1; public static void main (string args []) {gcscope t1 = new gcscope (); gcscope t2 = new gcscope (); gcscope t3 = new gcscope (); // объект No gct1.t = t2; // no el -объект el eLIGBLE is eLible eLIGBLE для gct3; Объект имеет право на GCT3.T = T1; // Нет объекта, имеющего право на GCT1 = null; // Нет объекта, не подходит для GC (t3.t все еще имеет ссылку на T1) t2 = null; // Нет объекта не имеет права на GC (T3.T по -прежнему имеет ссылку на T2) t3 = nul Объекты ссылаются друг на друга в // округленная мода, образуя остров объектов без любой внешней // ссылки)} Protected void infintize () {System.out.println ("мусор, собранная из объекта"+i); i ++;} класс GCScope {gcscope t; static int i = 1; public void void main (string args {]) Gcscope (); gcscope t2 = new gcscope (); gcscope t3 = new gcscope (); // Нет объекта не соответствует gct1.t = t2; // Ни один объект не соответствует gct2.t = t3; // no объект не соответствует gct3.t = t1; // no object -complies с gct1 = null; // no comebles с gc -object с gc -object -ntablies с gc noble -nation с gc no -cobted with gc no come -als с gc no. T1) t2 = null; // Нет объекта не соответствует GC (T3.TT по -прежнему имеет ссылку на T2) t3 = null; // Все три объекта соответствуют GC (ни один из них не имеет ссылки. // Только переменная t каждого объекта также указывает друг на друга, // образуйте остров кольца, состоящий из объектов без каких -либо внешних ссылок.) объект "+i); i ++;}Образец образец GC Outofmemoryerror
GC не гарантирует безопасность задач переполнения памяти, а небрежный код, записанный, вызовет OutofmemoryError.
Импорт java.util.linkedlist; import java.util.list; открытый класс gc {public static void main (string [] main) {list l = new LinkedList (); // Введите бесконечный цикл, который добавит строку в список: l на каждом // iteters.do {l.Add (new String ("Hello, World"));Выход:
Исключение в ветке "Main" java.lang.outofmemoryerror: Java Heap Space at java.util.linkedlist.linklast (linkedlist.java:142) на java.util.linkedlist.add (linkedlist.java:338) на com.javapers.java.gscope.mainjainjainJainJavope.
Суммировать
Выше приведено все содержание этой статьи о кратком обсуждении процесса реализации сбора мусора Java. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!