предисловие
Составьте ментальную карту о точках знаний интервью серии JVM и поделитесь ею с вами
структура памяти
общая область потока
Куча (используется для хранения экземпляров объектов)
область метода
- ссылка на символ класса
- ссылка на символ метода
- Справочник по символам поля
- Текстовая строка (строка a = "abc", эта abc является литералом)
- Восемь основных типов (int a = 1; this 1 — литерал)
- Константы, объявленные как final
- Полностью допустимое имя класса
- тип возвращаемого значения
- модификаторы (общедоступные, приватные...)
- имя переменной
- имя метода
- код метода
- Полностью допустимое имя непосредственного суперкласса этого типа (если тип не интерфейс или java.lang.Object, в этом случае суперкласс отсутствует)
- упорядоченный список прямых интерфейсов класса
приватная область темы
стек виртуальных машин
- Процесс разрешения и связывания символических ссылок и прямых ссылок во время выполнения называется динамическим связыванием.
- Предпосылка заключается в том, что каждый кадр стека должен содержать ссылку на пул констант времени выполнения для поддержки реализации динамической компоновки.
- базовый тип данных
- ссылка на объект
- тип возвращаемого адреса
- Восстановить таблицу локальных переменных и стек операндов метода верхнего уровня.
- поместите возвращаемое значение (если есть) в стек операндов кадра стека вызывающей стороны
- Отрегулируйте значение счетчика ПК, чтобы оно указывало на одну инструкцию после инструкции вызова метода.
собственный стек методов
счетчик команд
прямая память
выделение памяти
Предметы предпочтительно размещаются в районе Эдема
Крупные предметы уходят прямо в старость
Выжившие в течение длительного времени входят в зону старения
Динамическое определение возраста объекта
гарантия распределения места
восстановление памяти
Minor GC
- Недостаточно места в районе Эдема
- гарантия распределения места
Full GC
- вызов System.gc()
- Недостаточно места в зоне престарелых
- Гарантия распределения места не удалась
- Недостаточно места для JDK 1.7 и более ранних версий для постоянного поколения (область методов)
- Когда CMS GC обрабатывает плавающий мусор, при недостатке места в молодом поколении срабатывает механизм гарантированного выделения места, при нехватке места в старом поколении срабатывает Full GC.
переполнение памяти
переполнение кучи
переполнение стека
Область метода и переполнение пула констант времени выполнения
Родная память переполняется напрямую
утечка памяти
Долгоживущие объекты содержат ссылки на недолговечные объекты.
соединение не закрыто
Переменная область неразумна
Внутренний класс содержит внешний класс
- Определите внутренний класс как статический
- Используйте статическую переменную для ссылки на экземпляр анонимного внутреннего класса
- Или поместите экземпляр анонимного внутреннего класса в статический метод внешнего класса.
Изменение значения хэша
Общие вопросы интервью
1. Будут ли утечки памяти в java?Кратко опишите пожалуйста.
Может. Утечки памяти могут возникать при самостоятельной реализации структур данных с загрузкой из кучи.
2. Какова длина int в 64-битной JVM?
В Java длина переменных типа int является фиксированным значением, не зависящим от платформы, и все они 32-битные. Это означает, что в 32-битных и 64-битных виртуальных машинах Java длина типа int одинакова.
3. В чем разница между последовательной и параллельной сборкой мусора?
И Serial, и Parallel вызывают остановку мира во время выполнения GC. Основное различие между ними заключается в том, что последовательный сборщик является копирующим сборщиком по умолчанию, и при выполнении GC используется только один поток, в то время как параллельный сборщик использует для выполнения несколько потоков GC.
4, 32-битная и 64-битная JVM, какова длина переменной типа int?
В 32-битных и 64-битных JVM длина переменных типа int одинакова и составляет 32 бита или 4 байта.
5. В чем разница между WeakReference и SoftReference в Java?
Хотя WeakReference и SoftReference полезны для повышения эффективности GC и памяти, WeakReference, как только последняя сильная ссылка будет потеряна, будет восстановлена GC, и хотя мягкая ссылка не может предотвратить восстановление, ее можно отложить до тех пор, пока JVM не исчерпает ресурсы. Память.
6. Что делает опция JVM -XX:+UseCompressedOops? зачем использовать
Когда вы переносите свое приложение с 32-разрядной JVM на 64-разрядную JVM, размер кучи внезапно увеличивается, почти удваиваясь, по мере того, как указатели объектов увеличиваются с 32-разрядных до 64-разрядных. Это также негативно влияет на данные, которые кэшируются процессором (который намного меньше памяти). Поскольку основная мотивация перехода на 64-битную JVM заключается в том, что вы можете указать максимальный размер кучи, вы можете сэкономить определенный объем памяти за счет сжатия ООП. С опцией -XX:+UseCompressedOops JVM будет использовать 32-битный ООП вместо 64-битного ООП.
7. Как определить, является ли JVM 32-битной или 64-битной с помощью программы Java?
Вы можете проверить некоторые системные свойства, такие как sun.arch.data.model или os.arch, чтобы получить эту информацию.
8. Каков максимальный объем памяти кучи для 32-разрядной и 64-разрядной JVM соответственно?
Теоретически память кучи 32-битной JVM может достигать 2^32, что составляет 4 ГБ, но на практике она будет намного меньше. В разных операционных системах он варьируется, например, около 1,5 ГБ для Windows и около 3 ГБ для Solaris. 64-битная JVM позволяет указать максимальный размер кучи, теоретически он может быть до 2^64, что является очень большим числом, на практике можно указать размер кучи до 100 ГБ. Даже некоторые JVM, такие как Azul, могут иметь кучу до 1000G.
9. В чем разница между JRE, JDK, JVM и JIT?
JRE означает время выполнения Java и требуется для запуска ссылок Java. JDK означает комплект для разработки Java, который представляет собой инструмент разработки для программ Java, таких как компилятор Java, который также включает JRE. JVM расшифровывается как Java Virtual Machine и отвечает за запуск Java-приложений. JIT расшифровывается как компиляция Just In Time. Когда количество выполнений кода превышает определенный порог, байт-код Java будет преобразован в собственный код. Например, основной горячий код будет преобразован в собственный код, что выгодно Значительно улучшить производительность Java-приложений.
10. Объясните пространство кучи Java и сборщик мусора?
Когда процесс Java запускается с помощью команды Java, для него выделяется память. Часть памяти используется для создания пространства кучи, а при создании объектов в программе память выделяется из парного пространства. GC — это процесс внутри JVM, который освобождает память недопустимых объектов для будущих распределений.
область памяти
11. Область памяти JVM
Область памяти JVM в основном делится на частную область потока [счетчик программ, стек виртуальной машины, область локального метода], общую область потока [куча JAVA, область метода] и прямую память.
Жизненный цикл частной области данных потока такой же, как и у потока, который создается/уничтожается в зависимости от начала/окончания пользовательского потока (в виртуальной машине Hotspot каждый поток напрямую сопоставляется с локальным потоком операционной системы, поэтому хранение/отсутствие этой части области памяти соответствует живому/мертвому соответствию для нативных потоков).
Общая область потока создается/уничтожается при запуске/остановке виртуальной машины.
Прямая память не является частью области данных времени выполнения JVM, но она часто используется: NIO, представленный в JDK 1.4, предоставляет метод ввода-вывода, основанный на канале и буфере, который может использовать библиотеку собственных функций для прямого выделения памяти вне кучи, а затем use Объект DirectByteBuffer действует как ссылка на эту память (см. Расширения ввода-вывода Java), что позволяет избежать копирования данных туда и обратно между кучей Java и собственной кучей, что может значительно повысить производительность в некоторых сценариях.
12. Счетчик программ (приватный поток)
Небольшое пространство памяти является индикатором номера строки байт-кода, выполняемого текущим потоком.Каждый поток должен иметь независимый программный счетчик.Этот тип памяти также называется "частной памятью потока".
Если метод java выполняется, счетчик записывает адрес инструкции байт-кода виртуальной машины (адрес текущей инструкции). Пусто, если все еще является собственным методом.
Эта область памяти является единственной областью виртуальной машины, в которой не указаны условия OutOfMemoryError.
13. Стек виртуальной машины (приватный поток)
Это модель памяти, которая описывает выполнение java-методов.Каждый метод будет создавать кадр стека (Stack Frame) для хранения таблицы локальных переменных, стека операндов, динамической ссылки, выхода метода и другой информации при его выполнении. Процесс каждого метода от вызова до завершения выполнения соответствует процессу помещения кадра стека в стек в стеке виртуальной машины.
Фрейм стека (Frame) — это структура данных, используемая для хранения данных и частичных результатов обработки, а также используется для работы с динамической компоновкой (Dynamic Linking), возвращаемыми значениями метода и диспетчеризацией исключений (Dispatch Exception). Фреймы стека создаются при вызовах методов и уничтожаются при завершении метода — вне зависимости от того, завершается ли метод нормально или ненормально (выдает неперехваченное исключение в методе), что считается завершением метода.
14. Область локального метода (приватный поток)
Область локальных методов похожа на стек Java, разница в том, что стек виртуальной машины служит для выполнения методов Java, а локальный стек методов служит для собственных методов.Если реализация виртуальной машины использует модель связи C для поддержки собственных вызовов, то стек будет представлять собой стек C, но HotSpot VM напрямую объединяет стек собственных методов и стек виртуальной машины в один.
15. Можете ли вы гарантировать выполнение сборщика мусора?
Нет, хотя вы можете вызвать System.gc() или Runtime.gc(), гарантировать выполнение сборщика мусора невозможно.
16. Как получить память, используемую программой Java? Процент используемой кучи?
Оставшуюся память, общую память и максимальную память кучи можно получить с помощью методов, связанных с памятью, в классе java.lang.Runtime. С помощью этих методов вы также можете получить процент использования кучи и оставшееся пространство кучи памяти. Метод Runtime.freeMemory() возвращает количество байтов оставшегося пространства, метод Runtime.totalMemory() возвращает количество байтов общей памяти, а Runtime.maxMemory() возвращает количество байтов максимальной памяти.
17. В чем разница между кучей и стеком в Java?
Куча и стек в JVM относятся к разным областям памяти и используются для разных целей. Стек часто используется для хранения фреймов методов и локальных переменных, в то время как объекты всегда размещаются в куче. Стек обычно меньше, чем куча, и не используется совместно несколькими потоками, тогда как куча совместно используется всеми потоками всей JVM.
18. Опишите принцип загрузки файлов классов JVM.
Загрузка классов в JVM осуществляется загрузчиком классов (ClassLoader) и его подклассами.Различные загрузчики в Java являются важным компонентом системы времени выполнения Java, который отвечает за поиск и загрузку файлов классов во время выполнения.
Из-за кроссплатформенной природы Java скомпилированная исходная программа Java представляет собой не исполняемую программу, а один или несколько файлов классов. Когда Java-программе необходимо использовать класс, JVM гарантирует, что класс загружен, связан (проверен, подготовлен и разрешен) и инициализирован. Загрузка класса относится к чтению данных из файла .class класса в память, обычно создавая массив байтов и читая его в файл .class, а затем генерируя объект класса, соответствующий загруженному классу.
После загрузки объект класса не завершен, поэтому в настоящее время класс еще недоступен. Когда класс загружается, он вступает в фазу компоновки, которая включает три шага: проверка, подготовка (выделение памяти для статических переменных и установка начальных значений по умолчанию) и разрешение (замена символических ссылок прямыми ссылками). Наконец, JVM инициализирует класс, в том числе: 1) если класс имеет прямой родительский класс, а класс не был инициализирован, то сначала инициализируйте родительский класс; 2) если в классе есть операторы инициализации, выполните эти операторы инициализации по очереди.
Загрузка классов выполняется загрузчиком классов, который включает в себя: корневой загрузчик (BootStrap), загрузчик расширений (Extension), системный загрузчик (System) и определяемый пользователем загрузчик классов (подкласс java.lang.ClassLoader).
Начиная с Java 2 (JDK 1.2), в процессе загрузки класса используется механизм родительского делегирования (PDM). PDM лучше гарантирует безопасность платформы Java.В этом механизме Bootstrap, поставляемый с JVM, является корневым загрузчиком, а другие загрузчики имеют и имеют только один загрузчик родительского класса. Загрузка класса требует, чтобы загрузчик родительского класса загружался первым, а его загрузчик дочернего класса загружается сам, когда загрузчик родительского класса бессилен. JVM не предоставляет ссылки на программы Bootstrap для Java. Ниже приведены сведения о нескольких категориях
Описание загрузчика:
(1) Bootstrap: обычно реализуется с помощью собственного кода, отвечающего за загрузку основной библиотеки основных классов JVM (rt.jar);
(2) Расширение: загрузите библиотеку классов из каталога, указанного системным свойством java.ext.dirs, и его родительским загрузчиком является Bootstrap;
(3) Система: также называется загрузчиком класса приложения, его родительским классом является расширение. Это наиболее широко используемый загрузчик классов. Он извлекается из пути к классу переменной среды или системных свойств.
Классы записываются в каталог, указанный java.class.path, который является родительским загрузчиком по умолчанию для пользовательского загрузчика.
уборщик мусора
19. Что такое ГК? Зачем ГК?
GC означает "сборка мусора". Обработка памяти - это место, где программисты склонны к проблемам. Забывание или неправильное использование памяти может привести к нестабильности или даже к сбою программы или системы. Функция GC, предоставляемая Java, может автоматически отслеживать, выходят ли объекты за пределы области действия. достижения В целях автоматического освобождения памяти язык Java не предоставляет явного метода операции для освобождения выделенной памяти. Java-программистам не нужно беспокоиться об управлении памятью, поскольку сборщик мусора управляет ею автоматически. Чтобы запросить сборку мусора, вы можете вызвать один из следующих методов: System.gc() или Runtime.getRuntime().gc() , но JVM может маскировать отбрасываемые вызовы сборки мусора.
Сборка мусора может эффективно предотвращать утечки памяти и эффективно использовать доступную память. Сборщик мусора обычно работает как отдельный низкоприоритетный поток и непредсказуемо очищает и перерабатывает объекты в куче памяти, которые умерли или давно не использовались.Программисты не могут вызывать сборщик мусора в режиме реального времени.Объект или все объекты собираются мусором. В первые дни зарождения Java сборка мусора была одной из самых важных особенностей Java, поскольку программирование на стороне сервера требовало эффективного предотвращения утечек памяти.Однако с течением времени механизм сборки мусора в Java стал объектом критики. Пользователи мобильных смарт-терминалов обычно считают, что система iOS имеет лучший пользовательский интерфейс, чем система Android.Одной из глубинных причин является непредсказуемость сборки мусора в системе Android.
20. Heap (совместное использование кучи и потоков) — область данных времени выполнения
Это область памяти, совместно используемая потоками.Созданные объекты и массивы хранятся в памяти кучи Java, и это также самая важная область памяти для сборки мусора сборщиком мусора. Поскольку современная виртуальная машина использует алгоритм сбора поколений, куча Java также может быть подразделена на: новое поколение (область Эдема, область «От выжившего» и область «До выжившего») и старое поколение с точки зрения GC.
21. Область метода/постоянная генерация (обмен потоками)
То есть то, что мы часто называем постоянным поколением, которое используется для хранения данных, таких как информация о классе, константы, статические переменные и код, скомпилированный компилятором, которые загружаются JVM.HotSpot VM расширяет коллекцию поколений GC до метода область, то есть постоянная генерация кучи Java используется для реализации области метода, так что сборщик мусора HotSpot может управлять этой частью памяти, как кучей Java, без необходимости разработки специального менеджера памяти для метода области (основная цель восстановления памяти постоянного бэнда. Именно для рециркуляции и выгрузки типа постоянного пула, так что выгоды в общем-то невелики).
Пул констант времени выполнения является частью области методов. В дополнение к версии класса, полям, методам, интерфейсам и т.д. описаниям и т.п. в Class файле также есть постоянный пул (Constant Pool Table), который используется для хранения различных литералов и символьных ссылок, сгенерированных во время компиляции. Эта часть. Содержимое будет храниться в пуле констант времени выполнения области методов после загрузки класса. Виртуальная машина Java имеет строгие правила в отношении формата каждой части файла класса (включая постоянный пул, конечно).То, какой тип данных используется для хранения каждого байта, должен соответствовать требованиям спецификации, чтобы он был распознается виртуальной машиной. Загрузите и выполните.
22. Память времени выполнения JVM
С точки зрения GC, куча Java также может быть подразделена на: новое поколение (область Eden, область From Survivor и область To Survivor) и старое поколение.
23. Новое поколение
Он используется для хранения новых объектов. Обычно занимает 1/3 пространства кучи. Из-за частого создания объектов новое поколение будет часто запускать MinorGC для сборки мусора. Новое поколение разделено на три области: область Eden, ServivorFrom и ServivorTo.
Эдемский район
Место рождения новых Java-объектов (если вновь созданный объект занимает большой объем памяти, он напрямую выделяется старому поколению). Когда памяти в области Eden недостаточно, MinorGC запускается для выполнения сборки мусора в области нового поколения.
ServivorFrom
Выжившие после последнего ГК, как отсканированное лицо этого ГК.
ServivorTo
Выжившие после процесса MinorGC сохраняются.
Процесс MinorGC (копировать -> очистить -> поменять местами)
MinorGC использует алгоритм репликации.
(1) eden, servicorFrom копируются в ServicorTo, возраст +1
Сначала скопируйте уцелевшие объекты в областях Eden и ServivorFrom в область ServicorTo (если возраст объекта достигает старости, назначьте его в область старости), и добавьте к возрасту этих объектов 1 (если ServicorTo места не хватает) поставил его в районе пожилых людей);
(2) Clear eden, servicorFrom
Затем очистите объекты в Eden и ServiceFrom;
(3) Переключение между ServicorTo и ServicorFrom
Наконец, ServicorTo и ServicorFrom меняются местами, и исходный ServicorTo становится областью ServicorFrom в следующем GC.
24. Старость
В основном храните в приложении объекты памяти с длительным жизненным циклом.
Объекты в старости относительно стабильны, поэтому MajorGC не будет выполняться часто. Обычно MinorGC выполняется до выполнения MajorGC, так что объекты нового поколения переходят в старое поколение, которое срабатывает, когда места недостаточно. Когда невозможно найти достаточно большое непрерывное пространство для выделения вновь созданному более крупному объекту, MajorGC будет запущен заранее для сборки мусора, чтобы освободить место.
MajorGC использует алгоритм маркировки и очистки: сначала сканируются все старые поколения, помечаются уцелевшие объекты, а затем перерабатываются немаркированные объекты. ajorGC занимает много времени, потому что его нужно сканировать и перерабатывать. MajorGC будет генерировать фрагментацию памяти.Чтобы уменьшить потерю памяти, нам обычно нужно объединить или пометить их для прямого выделения в следующий раз. Когда старая эра слишком заполнена, чтобы поместиться, будет выдано исключение OOM (недостаточно памяти).
25. Постоянное поколение
Относится к области постоянного хранения памяти, в которой в основном хранится информация Class и Meta (метаданные). Классы помещаются в постоянную область при их загрузке. Она отличается от области, где хранятся экземпляры. быть очищены. Таким образом, это также приводит к увеличению области постоянной генерации с увеличением загруженных классов и, в конечном итоге, вызывает исключение OOM.
26. JAVA8 и метаданные
В Java 8 постоянное поколение было удалено и заменено областью, называемой «областью метаданных» (метапространство). Суть метапространства аналогична постоянному поколению.Самая большая разница между метапространством и постоянным поколением заключается в том, что метапространство находится не в виртуальной машине, а использует локальную память. Поэтому по умолчанию размер метапространства ограничен только локальной памятью. Метаданные класса помещаются в собственную память, пул строк и статические переменные класса помещаются в кучу java, поэтому количество загружаемых метаданных класса больше не контролируется MaxPermSize, а фактическим доступным пространством системы.
27. Подсчет ссылок
В Java ссылки и объекты связаны. Если вы хотите манипулировать объектами, вы должны использовать ссылки. Таким образом, очевидно, что простой способ — определить, можно ли собрать объект с помощью подсчета ссылок. Проще говоря, если объект не имеет связанных с ним ссылок, то есть их счетчики ссылок не равны 0, это означает, что объект вряд ли будет использоваться снова, тогда объект является перерабатываемым объектом.
28. Анализ доступности
Чтобы решить проблему циклических ссылок метода подсчета ссылок, Java использует метод анализа достижимости. Поиск по серии объектов «корни GC» в качестве отправных точек. Объект считается недостижимым, если нет достижимого пути между «корнями GC» и объектом. Следует отметить, что недостижимый объект не эквивалентен перерабатываемому объекту, и недостижимый объект становится перерабатываемым объектом после как минимум двух процессов маркировки. Предметы, которые по-прежнему подлежат вторичной переработке после того, как были дважды помечены, подлежат переработке.
29. Отметка-развертка
Самый простой алгоритм сборки мусора делится на два этапа: маркировку и очистку. Фаза маркировки помечает все объекты, которые необходимо вернуть, а фаза очистки восстанавливает пространство, занимаемое помеченными объектами. Как показано
Из рисунка видно, что самая большая проблема этого алгоритма заключается в том, что память сильно фрагментирована, и может возникнуть проблема, связанная с тем, что большие объекты не смогут найти полезное пространство в будущем.
30. Алгоритм копирования (копирование)
Алгоритм, предложенный для решения дефекта фрагментации памяти алгоритма Mark-Sweep. Разделите память на два блока одинакового размера в соответствии с объемом памяти. Используйте только один из них за раз.Когда этот блок памяти заполнится, скопируйте уцелевшие объекты в другой блок и очистите используемую память, как показано на рисунке:
Хотя этот алгоритм прост в реализации, обладает высокой эффективностью использования памяти и не подвержен фрагментации, самая большая проблема заключается в том, что доступная память сжимается до половины исходной. А если уцелевших объектов будет больше, то эффективность алгоритма Копирования сильно снизится.
31. Марк-Компакт
Объединив два вышеуказанных алгоритма, предлагается избежать дефектов. Фаза маркировки аналогична алгоритму Mark-Sweep: вместо очистки объектов после маркировки уцелевшие объекты перемещаются в один конец памяти. Затем объекты за пределами конечной границы удаляются. Как показано на рисунке:
32. Алгоритм сбора поколений
Метод сбора поколений — это метод, принятый большинством JVM в настоящее время. Его основная идея состоит в том, чтобы разделить память на разные домены в соответствии с различными жизненными циклами выживания объекта.Как правило, куча GC делится на Tenured/Old Generation и YoungGeneration. Характерной чертой старого поколения является то, что при каждой сборке мусора необходимо собирать лишь небольшое количество объектов, а характеристикой нового поколения является то, что при каждой сборке мусора необходимо собирать большое количество мусора, поэтому могут использоваться разные алгоритмы. быть выбраны в соответствии с различными регионами.
33. Новое поколение и алгоритмы репликации
В настоящее время большинство сборщиков мусора JVM принимают алгоритм копирования для нового поколения, потому что каждая сборка мусора в новом поколении должна высвобождать большую часть объектов, то есть операции, подлежащие копированию, относительно невелики, а новое поколение обычно не делится в соотношении 1:1. Как правило, новое поколение делится на большее пространство Эдема и два меньших пространства Выживших (Из космоса, В космос).Каждый раз, когда пространство Эдема и одно из пространств Выживших используются, при переработке используются два пространства. объекты копируются в другое пространство Survivor.
34. Алгоритмы Old Age и Mark Copy
В старости используется алгоритм Mark-Compact, поскольку каждый раз восстанавливается лишь небольшое количество объектов.
(1) Постоянная генерация (постоянная генерация) в области методов, упомянутой виртуальной машиной JAVA, используется для хранения классов классов, констант, описаний методов и т. д. Коллекция вечного поколения в основном состоит из выброшенных констант и бесполезных классов.
(2) Выделение памяти для объектов в основном происходит в пространстве Эдема нового поколения и в пространстве из пространства выжившего (часть, где выживший в данный момент хранит объект), а в некоторых случаях она будет напрямую выделена для старое поколение.
(3) При недостатке Пространства Эдема и Из Космоса нового поколения будет происходить GC.После GC уцелевшие объекты в областях Пространство Эдема и Из Космоса будут перемещены в Космос, а затем Пространство Эдема и Из Пространство будет очищено.
(4) Если To Space не может хранить объект в достаточном количестве, сохраните объект в старом поколении.
(5) После GC используются Eden Space и To Space, и цикл повторяется.
(6) Когда объект избегает GC в Survivor, его возраст будет +1. Объекты в возрасте 15 лет по умолчанию перемещаются в старое поколение.
35. Сильная ссылка на JAVA
Наиболее распространенной в Java является сильная ссылка, присваивающая объект ссылочной переменной, эта ссылочная переменная является строгой ссылкой. Когда на объект ссылается переменная со строгой ссылкой, он находится в достижимом состоянии, и механизм сборки мусора не может его восстановить, даже если объект никогда не будет использоваться в будущем и JVM не вернет его. Таким образом, сильные ссылки являются одной из основных причин утечек памяти в Java.
36. Программный справочник JAVA
Мягкие ссылки должны быть реализованы с помощью класса SoftReference.Для объектов только с мягкими ссылками он не будет переработан, когда системной памяти будет достаточно, и будет переработан, когда места в системной памяти недостаточно. Мягкие ссылки часто используются в программах, чувствительных к памяти.
37, слабая ссылка на JAVA
Слабые ссылки должны быть реализованы с помощью класса WeakReference, который имеет более короткое время жизни, чем мягкие ссылки.Для объектов только со слабыми ссылками, пока работает механизм сборки мусора, независимо от того, достаточно ли места в памяти JVM, объекты занятая объектом всегда будет освобождена оперативная память.
38. Виртуальный справочник JAVA
Виртуальная ссылка должна быть реализована классом PhantomReference, который нельзя использовать отдельно, но необходимо использовать в сочетании с очередью ссылок. Основная цель фантомных ссылок — отслеживать статус объектов, которые собираются мусором.
39. Алгоритм сбора поколений
Текущая основная сборка мусора VM использует алгоритм «Generational Collection», который делит память на несколько блоков в соответствии с различными жизненными циклами объекта, такими как новое поколение, старое поколение и постоянное поколение в JVM. Алгоритм GC можно использовать в соответствии с особенностями каждого возраста
40. В новом поколении - алгоритм репликации
Каждая сборка мусора может обнаружить, что большое количество объектов мертво, а выживают лишь немногие, поэтому используется алгоритм репликации, и сборка может быть завершена лишь с небольшими затратами на копирование уцелевших объектов.
41. В старости — Алгоритмы сопоставления меток
Из-за высокой выживаемости объекта, для его гарантии не выделяется лишнее место, для восстановления необходимо использовать алгоритм "отметка - очистка" или "отметка - отделка", не нужно копировать память , и сделать прямую свободную память.
42. Алгоритм сбора разделов
Алгоритм разделения делит все пространство кучи на последовательные разные ячейки, и каждая ячейка используется независимо и перерабатывается независимо.Преимущество этого заключается в том, что он может контролировать, сколько ячеек перерабатывается за раз, и в соответствии с целевым временем паузы, разумное количество ячеек перерабатывается каждый раз.Небольшой интервал (вместо всей кучи), тем самым уменьшая паузу, вызванную GC.
43. Сборщик мусора GC
Память кучи Java разделена на две части: новое поколение и старое поколение.Новое поколение в основном использует алгоритм сборки мусора копирования и маркировки-развертки.Поколение предоставляет множество различных сборщиков мусора.Сборщики мусора Sun HotSpot виртуальная машина в JDK1.6 выглядит следующим образом:
44. Последовательный сборщик мусора (один поток, алгоритм копирования)
Serial (continuous на английском языке) — самый простой сборщик мусора, использующий алгоритм репликации, единственный сборщик мусора в новом поколении до JDK1.3.1. Serial — это однопоточный сборщик, который не только использует один ЦП или один поток для завершения сборки мусора, но и должен приостанавливать все остальные рабочие потоки во время сборки мусора до окончания сборки мусора.
Хотя последовательному сборщику мусора необходимо приостановить все другие рабочие потоки во время процесса сборки мусора, он прост и эффективен.Для ограниченной среды с одним ЦП нет накладных расходов на взаимодействие потоков, и можно получить максимальную эффективность однопоточной сборки мусора. Таким образом, последовательные сборщики мусора Сборщик мусора по-прежнему является сборщиком мусора нового поколения по умолчанию для виртуальной машины Java, работающей в клиентском режиме.
45. Сборщик мусора ParNew (последовательный + многопоточность)
Сборщик мусора ParNew на самом деле является многопоточной версией сборщика Serial.Он также использует алгоритм репликации.За исключением использования многопоточности для сборки мусора, в остальном поведение точно такое же, как у сборщика Serial. Сборщик мусора ParNew также находится в процессе сборки мусора, чтобы приостановить все остальные рабочие потоки.
Сборщик ParNew по умолчанию открывает столько потоков, сколько процессоров.Вы можете ограничить количество потоков сборщика мусора с помощью параметра -XX:ParallelGCThreads. [Параллельно: Параллельно]
Хотя ParNew почти идентичен сборщику Serial, за исключением многопоточности, сборщик мусора ParNew является сборщиком мусора по умолчанию для нового поколения многих виртуальных машин Java, работающих в режиме сервера.
46. Сборщик Parallel Scavenge (алгоритм многопоточной репликации, эффективный)
Сборщик мусора Parallel Scavenge также является сборщиком мусора нового поколения. Он также использует алгоритм репликации и является многопоточным сборщиком мусора. Он фокусируется на достижении программой контролируемой пропускной способности (Пропускная способность, время, которое ЦП тратит на выполнение пользовательского кода). Общее время потребления ЦП, то есть пропускная способность = время выполнения пользовательского кода/(время выполнения пользовательского кода + время сборки мусора)), высокая пропускная способность позволяет наиболее эффективно использовать время ЦП и выполнять вычислительные задачи программы как можно быстрее. , Фоновые операции без особого взаимодействия. Стратегия адаптивного масштабирования также является важным отличием сборщика ParallelScavenge от сборщика ParNew.
47. Сборщик Serial Old (алгоритм сортировки меток одного потока)
Serial Old – это старая версия сборщика мусора Serial. Он также является однопоточным сборщиком и использует алгоритм маркировки до завершения. Этот сборщик также в основном работает на клиенте по умолчанию.
Сборщик мусора старого поколения по умолчанию для виртуальной машины Java. В режиме сервера есть две основные цели:
(1) Используется вместе с новым поколением сборщиков Parallel Scavenge в версиях до JDK1.5.
(2) В качестве резервной схемы сборки мусора с использованием сборщика CMS в старом поколении. Serial нового поколения и Serial Old поколения Old со схемой процесса сборки мусора:
Сборщик Parallel Scavenge нового поколения работает аналогично сборщику ParNew. Оба являются многопоточными сборщиками. Оба используют алгоритм репликации. Все рабочие потоки должны быть приостановлены во время процесса сборки мусора. Схема процесса сборки мусора нового поколения ParallelScavenge/ParNew и старого поколения Serial Old:
48. Параллельный старый сборщик (многопоточный алгоритм сортировки меток)
Сборщик Parallel Old — это версия Parallel Scavenge старого поколения, которая использует многопоточный алгоритм маркировки для сопоставления и была доступна только в JDK1.6.
До JDK1.6 сборщик ParallelScavenge, используемый в новом поколении, можно было использовать только с сборщиком Serial Old старого поколения, который может гарантировать только пропускную способность нового поколения, но не может гарантировать общую пропускную способность. сборщик мусора с приоритетом.Если система предъявляет высокие требования к пропускной способности, приоритет может быть отдан стратегии совместного размещения Parallel Scavenge нового поколения и сборщика Parallel Old старого поколения.
Схема рабочего процесса Parallel Scavenge нового поколения и сборщика Parallel Old старого поколения
49. Сборщик CMS (многопоточный алгоритм маркировки-развертки)
Сборщик параллельной очистки по меткам (CMS) — это сборщик мусора старого поколения, основной целью которого является получение кратчайшего времени паузы при сборке мусора.В отличие от других алгоритмов очистки по меткам старого поколения, он использует многопоточный алгоритм очистки по меткам. Кратчайшее время приостановки сборки мусора может улучшить взаимодействие с пользователем для программ с высоким уровнем взаимодействия. Механизм работы CMS сложнее, чем у других сборщиков мусора. Весь процесс делится на следующие 4 этапа:
начальная отметка
Просто отметьте объекты, которые GC Roots может напрямую связать, это быстро, и все равно необходимо приостановить все рабочие потоки.
одновременная маркировка
Процесс отслеживания GC Roots работает с пользовательскими потоками и не требует приостановки рабочих потоков.
перемаркировать
Чтобы исправить запись маркировки части объекта, маркировка которой изменяется по мере того, как пользовательская программа продолжает работать во время параллельной маркировки, по-прежнему необходимо приостановить все рабочие потоки.
Параллельная очистка
Очистка недоступных объектов GC Roots, работа с пользовательскими потоками, отсутствие необходимости приостанавливать рабочие потоки. Поскольку поток сборки мусора может работать одновременно с пользователем во время самого продолжительного одновременного процесса маркировки и параллельной очистки, вообще говоря, высвобождение памяти сборщика CMS и пользовательского потока выполняются одновременно. Рабочий процесс сборщика CMS
50. Коллектор G1
Сборщик мусора Garbage first Garbage является авангардом развития теории сборщика мусора.По сравнению со сборщиком CMS, два наиболее заметных улучшения сборщика G1:
(1) На основе алгоритма сортировки по меткам фрагментации памяти не происходит.
(2) Время паузы можно очень точно контролировать, чтобы добиться сборки мусора с малой паузой без ущерба для пропускной способности. Сборщик G1 избегает полной сборки мусора, он делит память кучи на несколько независимых областей фиксированного размера, отслеживает ход сборки мусора в этих областях и поддерживает в фоновом режиме список приоритетов, каждый раз в соответствии с разрешенной сборкой Время, районы с наибольшим количеством мусора рекультивируются в первую очередь. Механизмы зонирования и приоритезации зон гарантируют, что сборщик G1 сможет добиться максимальной эффективности сбора мусора за ограниченное время.
механизм загрузки классов
51. Механизм загрузки классов JVM
Механизм загрузки класса JVM разделен на пять частей: загрузка, проверка, подготовка, синтаксический анализ и инициализация.Давайте рассмотрим эти пять процессов по отдельности.
нагрузка
Загрузка — это этап процесса загрузки класса, на котором объект java.lang.Class, представляющий класс, будет сгенерирован в памяти как запись для различных данных класса в области методов. Обратите внимание, что его необязательно получать из файла Class, его можно прочитать из ZIP-пакета (например, из jar-пакета или военного пакета), либо рассчитать и сгенерировать во время выполнения (динамический прокси-сервер), либо его можно генерируются другим генерированием файлов (например, преобразованием файлов JSP в соответствующие классы классов).
проверять
Основная цель этого этапа — убедиться, что информация, содержащаяся в байтовом потоке Class-файла, соответствует требованиям текущей виртуальной машины и не будет угрожать безопасности самой виртуальной машины.
Подготовить
Подготовительный этап — это этап формального выделения памяти под переменные класса и установки начального значения переменных класса, то есть выделения пространства памяти, используемого этими переменными, в области методов. Обратите внимание на концепцию начального значения, упомянутую здесь, такую как переменная класса, определенная как:
На самом деле начальное значение переменной v после этапа подготовки равно 0 вместо 8080. Статическая инструкция put, присваивающая v значение 8080, сохраняется в методе конструктора класса после компиляции программы.
Но обратите внимание, что если объявление:
public static final int v = 8080;
На этапе компиляции для v будет сгенерировано свойство ConstantValue, а на этапе подготовки виртуальная машина присвоит значение v 8080 в соответствии со свойством ConstantValue.
Разобрать
Фаза синтаксического анализа относится к процессу, посредством которого виртуальная машина заменяет символические ссылки в пуле констант прямыми ссылками. Символические ссылки находятся в файле класса
public static int v = 8080;
На самом деле начальное значение переменной v после этапа подготовки равно 0 вместо 8080. Статическая инструкция put, присваивающая v значение 8080, сохраняется в методе конструктора класса после компиляции программы. Но обратите внимание, что если объявление:
На этапе компиляции для v будет сгенерировано свойство ConstantValue, а на этапе подготовки виртуальная машина присвоит значение v 8080 в соответствии со свойством ConstantValue.
Разобрать
Фаза синтаксического анализа относится к процессу, посредством которого виртуальная машина заменяет символические ссылки в пуле констант прямыми ссылками. Символические ссылки находятся в файле класса
public static final int v = 8080;
На этапе компиляции для v будет сгенерировано свойство ConstantValue, а на этапе подготовки виртуальная машина присвоит значение v 8080 в соответствии со свойством ConstantValue.
Разобрать
Фаза синтаксического анализа относится к процессу, посредством которого виртуальная машина заменяет символические ссылки в пуле констант прямыми ссылками. Символические ссылки находятся в файле класса:
(1) CONSTANT_Class_info
(2) CONSTANT_Field_info
(3) CONSTANT_Method_info
константы одного типа.
Символическая ссылка
Символические ссылки не имеют ничего общего с макетом реализации виртуальной машины, и цель ссылки не обязательно должна быть загружена в память. Структура памяти различных реализаций виртуальных машин может различаться, но символические ссылки, которые они могут принимать, должны быть согласованы, поскольку буквальная форма символических ссылок четко определена в формате файла класса спецификации виртуальной машины Java.
прямая цитата
Прямая ссылка может быть указателем на цель, относительным смещением или дескриптором, который может косвенно указывать на цель. Если есть прямая ссылка, цель ссылки уже должна существовать в памяти.
инициализация
Фаза инициализации является последней фазой загрузки класса.После предыдущей фазы загрузки классов, за исключением того, что загрузчик классов можно настроить на этапе загрузки, в других операциях доминирует JVM. На начальном этапе начинается собственно выполнение кода Java-программы, определенной в классе.
конструктор класса
Фаза инициализации — это процесс выполнения методов конструктора класса. Метод представляет собой комбинацию операций присваивания переменных класса в классе, автоматически собираемом компилятором, и операторов в статическом блоке операторов. Виртуальная машина гарантирует, что метод родительского класса был выполнен до выполнения дочернего метода.Если в классе нет статического назначения переменной или статического блока операторов, компилятор может не сгенерировать метод () для этого класса. Обратите внимание, что инициализация класса не выполняется в следующих случаях:
(1) Ссылка на статическое поле родительского класса через подкласс вызовет инициализацию только родительского класса, а не подкласса.
(2) Определение массива объектов не приведет к инициализации класса.
(3) Константы будут храниться в пуле констант вызывающего класса во время компиляции.По сути, нет прямой ссылки на класс, который определяет константу, и класс, в котором определена константа, не будет запущен.
(4) Получение объекта Class через имя класса не приведет к инициализации класса.
(5) При загрузке указанного класса через Class.forName, если указанный параметр initialize имеет значение false, инициализация класса не будет запущена.Фактически этот параметр сообщает виртуальной машине, следует ли инициализировать класс.
(6) Через метод loadClass по умолчанию для ClassLoader действие инициализации не будет запущено.
52. Загрузчик классов
Группа разработчиков виртуальной машины реализует действие загрузки вне JVM, чтобы приложение могло решить, как получить требуемые классы.JVM предоставляет три типа загрузчиков:
Bootstrap ClassLoader
Отвечает за загрузку классов в каталог JAVA_HOME\lib или по пути, указанному параметром -Xbootclasspath и распознаваемому виртуальной машиной (идентифицируемому по имени файла, например rt.jar).
Расширение ClassLoader
Отвечает за загрузку библиотек классов в каталог JAVA_HOME\lib\ext или по пути, указанному в системной переменной java.ext.dirs.
Загрузчик классов приложений (Application ClassLoader):
Отвечает за загрузку библиотек классов по пользовательскому пути (classpath). JVM загружает классы через родительскую модель делегирования.Конечно, мы также можем реализовать собственные загрузчики классов, унаследовав java.lang.ClassLoader.
53. Родительская делегация
Когда класс получает запрос на загрузку класса, он сначала не пытается загрузить сам класс, а делегирует запрос родительскому классу для его завершения.Это относится к каждому загрузчику класса в иерархии, поэтому все запросы на загрузку должны быть При загрузке класса запуска только тогда, когда загрузчик родительского класса сообщает, что он не может выполнить запрос (загружаемый класс не найден в его пути загрузки), загрузчик дочернего класса попытается загрузить его сам.
Одним из преимуществ использования родительского делегирования является то, что, например, при загрузке класса java.lang.Object, расположенного в пакете rt.jar, независимо от того, какой загрузчик загружает этот класс, он в конечном итоге делегируется загрузчику класса запуска верхнего уровня для загрузка, которая гарантирует, что использование разных загрузчиков классов приведет к тому же объекту объекта
54. OSGI (система динамических моделей)
OSGi (Open Service Gateway Initiative) — это ориентированная на Java система динамических моделей и ряд спецификаций для динамической модульной системы Java.
55. Динамически меняйте структуру
Сервисная платформа OSGi обеспечивает возможность динамического изменения конструкций на различных сетевых устройствах без перезагрузки. Чтобы свести к минимуму связи и сделать их управляемыми, технология OSGi предоставляет сервис-ориентированную архитектуру, которая позволяет этим компонентам динамически обнаруживать друг друга.
56. Модульное программирование и горячая замена
OSGi предназначена для обеспечения базовых условий для реализации модульного программирования программ Java. Программы на основе OSGi, вероятно, смогут реализовать возможности горячего подключения на уровне модулей. При обновлении программы можно деактивировать только часть программы, переустановил, а затем запустил. , что является очень привлекательной функцией для разработки программ корпоративного уровня.
OSGi изображает красивую модульную цель разработки и определяет службы и архитектуру, необходимые для достижения этой цели, а также имеет зрелую структуру для поддержки реализации. Но не все приложения подходят для принятия OSGi в качестве инфраструктуры, и, хотя он обеспечивает мощность, он также вносит дополнительную сложность, поскольку не соответствует родительской модели делегирования загрузки классов.
57. Модель памяти JVM
Эксклюзивно для потока: стек, собственный стек методов, счетчик программ
Совместное использование потоков: куча, область методов
58. Стек
Также известный как стек методов, частный поток, метод выполнения потока создаст массив стека для хранения таблицы локальных переменных, стека операций, динамической ссылки, выхода из метода и т. д. При вызове метода он будет помещен в стек, а метод return будет выполнен из стека.
59. Стек локальных методов
Подобно стеку, он также используется для сохранения информации о выполняемом методе.Метод Java выполняется с использованием стека, а стек собственного метода используется при выполнении собственного метода.
60. Счетчик программ
Сохраняет позицию байт-кода, исполняемую текущим потоком.Каждый поток при работе имеет независимый счетчик, только для выполнения Java-методов.При выполнении Native-методов счетчик программы пуст.
61. Куча
Самая большая часть управления памятью JVM совместно используется потоками для хранения экземпляров объектов. Здесь будут размещены почти все экземпляры объектов. Когда в куче нет свободного места, будет выдано исключение OOM. В зависимости от жизненного цикла объекта, JVM управляет объектами путем создания, а сборщик мусора выполняет управление сборкой мусора.
62. Область метода
Также известная как область без кучи, она используется для хранения таких данных, как информация о классе, константы, статические переменные и код, оптимизированный компилятором реального времени, который загружается виртуальной машиной. meta space 1.8 являются реализацией области метода.
63. Переработка поколений
Генерационный сбор основан на двух фактах: большинство предметов используются не скоро, а некоторые не сразу бесполезны, но и недолго
Молодое поколение -> Маркер - Копировать
старое поколение -> пометить - очистить
64. Разница между кучей и стеком
Стек представляет собой единицу времени выполнения, представляющую логику, включая основные типы данных и ссылки на объекты в куче. Область непрерывна и не имеет фрагментации; куча представляет собой единицу хранения, представляющую данные, которые могут совместно использоваться несколькими стеками (включая основные типы данных в членах), ссылки и объекты ссылок), область не является непрерывной, и будут фрагменты.
(1) Различные функции
Память стека используется для хранения локальных переменных и вызовов методов, а память кучи используется для хранения объектов в Java. Независимо от того, являются ли они переменными-членами, локальными переменными или переменными класса, объекты, на которые они указывают, хранятся в куче памяти.
(2) Различный обмен
Память стека является частной для потока.
Куча памяти является общей для всех потоков.
(3) Ошибки исключения отличаются
Исключение будет выдано, если памяти стека или памяти кучи недостаточно.
Недостаточно места в стеке: java.lang.StackOverFlowError.
Недостаточно места в куче: java.lang.OutOfMemoryError.
(4) Размер пространства
Размер стека намного меньше размера кучи
65. Когда будет запущен FullGC
В дополнение к прямому вызову System.gc существуют следующие четыре ситуации, которые запускают выполнение полного GC.
(1) Недостаточно места в старом поколении
Пространства старого поколения будет недостаточно только тогда, когда объекты нового поколения будут переданы и созданы как большие объекты и большие массивы.Когда места все еще недостаточно после выполнения полного GC, будет выдана следующая ошибка
ошибка:
java.lang.OutOfMemoryError: Java heap space
Чтобы избежать полного GC, вызванного двумя вышеуказанными ситуациями, при настройке старайтесь, чтобы объекты были восстановлены на этапе Minor GC, дайте объектам выжить в течение более длительного периода времени в новом поколении и не создавайте слишком большие объекты. и массивы.
(2) Пространство Permanet Generation заполнено
PermanetGeneration хранит некоторую информацию о классах и т. д. Когда в системе нужно загрузить много классов, отраженных классов и методов, генерация Permanet может быть заполнена, и будет выполняться полная сборка мусора, если она не настроена на использование CMS. ГК. Если его по-прежнему невозможно восстановить после полного GC, JVM выдаст следующее сообщение об ошибке:
java.lang.OutOfMemoryError: PermGen space
Чтобы избежать явления Full GC, вызванного полным Perm Gen, можно использовать следующие методы: увеличить пространство Perm Gen или переключиться на CMS GC.
(3) Не удалось повысить уровень, и во время CMS GC появляется ошибка параллельного режима.
Для программ, использующих CMS для сборщика мусора старого поколения, обратите особое внимание на наличие двух условий: сбой повышения и сбой параллельного режима в журнале сборщика мусора.При возникновении этих двух условий может быть запущен полный сборщик мусора.
Promotionfailed возникает, когда выжившее пространство не может быть помещено в Minor GC, а объекты могут быть размещены только в старом поколении, а старое поколение не может быть размещено в это время; отказ concurrentmode вызван тем, что есть объекты для размещать в процессе выполнения CMS GC Старого поколения, а места старого поколения на данный момент недостаточно.
Контрмеры: увеличьте оставшееся пространство, старое пространство генерации или уменьшите коэффициент запуска параллельного GC, но в версиях JDK 5.0+ и 6.0+ возможно, что CMS не будет запускать действие очистки в течение долгого времени после завершения примечания. из-за ошибки 29 JDK. В этой ситуации этого можно избежать, установив -XX:CMSMaxAbortablePrecleanTime=5 (единица измерения — мс).
(4) Средний размер Minor GC, переведенного в старое поколение, больше, чем оставшееся пространство старого поколения.
Это относительно сложная триггерная ситуация. Чтобы избежать явления нехватки места в старом поколении из-за продвижения объекта нового поколения к старому поколению, Hotspot принимает решение при выполнении Minor GC. Если Minor GC получен от продвигается предыдущая статистика Когда средний размер старого поколения превышает оставшееся пространство старого поколения, полный сборщик мусора запускается напрямую.
Например, после того, как программа запускает MinorGC в первый раз, объекты размером 6 МБ продвигаются к старому поколению, а затем, когда происходит следующий Minor GC, сначала проверяют, больше ли оставшееся пространство старого поколения 6 МБ, и если оно меньше чем 6 МБ, выполните полный сборщик мусора.
Когда новое поколение принимает PSGC, метод немного отличается. PS GC также проверяется после Minor GC. Например, после первого Minor GC в приведенном выше примере PS GC проверяет, больше ли оставшееся пространство старого поколения, чем 6Мб на данный момент. , если меньше, запускаем сбор старого поколения. Помимо описанных выше четырех ситуаций, для приложений Sun JDK, использующих RMI для RPC или управления, полный сборщик мусора выполняется по умолчанию один раз в час. Полный интервал выполнения GC можно установить с помощью -java-Dsun.rmi.dgc.client.gcInterval=3600000 при запуске или с помощью -XX:+ DisableExplicitGC, чтобы запретить RMI вызывать System.gc.
66. Что такое виртуальная машина Java? Почему Java называют «независимым от платформы языком программирования»?
Виртуальная машина Java — это процесс виртуальной машины, который может выполнять байт-код Java. Исходные файлы Java компилируются в файлы байт-кода, которые могут выполняться виртуальной машиной Java. Java был разработан, чтобы позволить приложениям работать на любой платформе, не требуя, чтобы программисты индивидуально переписывали или перекомпилировали для каждой платформы. Виртуальная машина Java делает это возможным, потому что она знает длину инструкции и другие характеристики базовой аппаратной платформы.
67. Правила размещения объектов
(1) Объект предпочтительно размещается в области Eden.Если в области Eden недостаточно места, виртуальная машина выполняет Minor GC.
(2) Большие объекты устаревают напрямую (большие объекты относятся к объектам, которым требуется большой объем непрерывной памяти). Цель этого состоит в том, чтобы избежать большого количества копий памяти между областью Эдема и двумя областями Выживших (новое поколение использует алгоритм копирования для сбора памяти).
(3) Долгоживущие объекты вступают в старость. Виртуальная машина определяет счетчик возраста для каждого объекта.Если объект прошел один Minor GC, объект попадет в зону Survivor.После каждого Minor GC возраст объекта будет увеличиваться на 1, пока объект не достигнет порога и входит в зону престарелых.
(4) Динамическое определение возраста объекта. Если сумма размеров всех объектов одного возраста в области Survivor больше половины пространства Survivor, объекты, возраст которых больше или равен этому возрасту, могут напрямую войти в старость.
(5) Гарантия распределения места. Каждый раз, когда выполняется дополнительный сборщик мусора, JVM будет вычислять средний размер объектов, перемещенных из оставшейся области в старую область. Если это значение больше, чем оставшееся значение в старой области, будет выполнен полный сбор мусора. меньше параметра HandlePromotionFailure, будет выполняться только Monitor.GC, если false, то Full GC
68. Опишите принцип загрузки файлов классов JVM?
Загрузка классов в JVM осуществляется загрузчиком классов (ClassLoader) и его подклассами.Загрузчик классов в Java является важным компонентом системы времени выполнения Java, который отвечает за поиск и загрузку файлов классов во время выполнения.
Из-за кроссплатформенной природы Java скомпилированная исходная программа Java представляет собой не исполняемую программу, а один или несколько файлов классов. Когда Java-программе необходимо использовать класс, JVM гарантирует, что класс загружен, связан (проверен, подготовлен и разрешен) и инициализирован.
Загрузка класса относится к чтению данных из файла .class класса в память, обычно создавая массив байтов и читая его в файл .class, а затем генерируя объект класса, соответствующий загруженному классу. После завершения загрузки объект класса не завершен, поэтому в настоящее время класс недоступен.
Когда класс загружается, он вступает в фазу компоновки, которая включает три шага: проверка, подготовка (выделение памяти для статических переменных и установка начальных значений по умолчанию) и разрешение (замена символических ссылок прямыми ссылками). Наконец, JVM инициализирует класс,
включать:
(1) Если у класса есть прямой родительский класс, и класс не был инициализирован, то сначала инициализируйте родительский класс;
(2) Если в классе есть операторы инициализации, эти операторы инициализации выполняются по очереди. Загрузка классов выполняется загрузчиком классов, загрузчик классов включает в себя: корневой загрузчик (BootStrap), загрузчик расширений (Extension), системный загрузчик (System) и определяемый пользователем загрузчик классов (подкласс java.lang.ClassLoader).
Начиная с Java 2 (JDK 1.2), в процессе загрузки класса используется механизм родительского делегирования (PDM). PDM лучше обеспечивает безопасность платформы Java.В этом механизме Bootstrap, поставляемый с JVM, является корневым загрузчиком, а другие загрузчики имеют и имеют только один загрузчик родительского класса. Загрузка класса требует, чтобы загрузчик родительского класса загружался первым, а его загрузчик дочернего класса загружается сам, когда загрузчик родительского класса бессилен. JVM не предоставляет ссылку на Bootstrap для программы Java. Ниже приводится описание нескольких загрузчиков классов.
Bootstrap: обычно реализуется с помощью собственного кода, отвечающего за загрузку базовой библиотеки базовых классов JVM (rt.jar);
Расширение: Загрузите библиотеку классов из каталога, указанного системным свойством java.ext.dirs, и его родительским загрузчиком является Bootstrap;
Система: также называется загрузчиком класса приложения, его родительским классом является Extension. Это наиболее широко используемый загрузчик классов. Он записывает классы из каталога, указанного в переменной среды classpath или системном свойстве java.class.path, и является родительским загрузчиком по умолчанию для пользовательских загрузчиков.
69. Процесс создания объекта Java
(1) Когда JVM встречает инструкцию по созданию нового объекта, она сначала проверяет, могут ли параметры этой инструкции определять символическую ссылку на класс в пуле констант. Затем загрузите класс (процесс загрузки класса будет описан позже)
(2) Выделите память для объекта. Один метод «коллизия указателей», один метод «свободный список» и, наконец, широко используемый метод «выделение локального буфера потока (TLAB)».
(3) Инициализировать пространство памяти объекта, кроме заголовка объекта, до 0
(4) Сделайте необходимые настройки для заголовка объекта
70. Кратко опишите объектную структуру Java
Объект Java состоит из трех частей: заголовка объекта, данных экземпляра и заполнения выравнивания.
Заголовок объекта состоит из двух частей.В первой части хранятся данные времени выполнения самого объекта: хэш-код, возраст генерации GC, статус идентификации блокировки, блокировки, удерживаемые потоками, и смещенные идентификаторы потоков (обычно 32/64 бита). Вторая часть — это тип указателя, который указывает на тип метаданных класса объекта (то есть на класс, который представляет объект). Если это объект массива, в заголовке объекта также есть часть для записи длины массива.
Данные экземпляра используются для хранения реальной эффективной информации об объекте (в том числе унаследованной от родительского класса и определенной им самим)
Заполнение выравнивания: JVM требует, чтобы начальный адрес объекта был целым числом, кратным 8 байтам (выравнивание по 8 байтам).
71. Как определить, что предмет можно переработать
Обычно есть два способа определить, жив ли объект:
Счетчик ссылок: у каждого объекта есть атрибут счетчика ссылок.При добавлении новой ссылки счетчик увеличивается на 1, а когда ссылка освобождается, счетчик уменьшается на 1. Когда счетчик равен 0, его можно переработать. Этот метод прост и не может решить проблему циклической ссылки объектов друг на друга.
Анализ достижимости: поиск вниз от корней GC, и путь, пройденный поиском, называется цепочкой ссылок. Когда объект не имеет какой-либо цепочки ссылок, связанной с корнями GC, это доказывает, что объект недоступен и недоступен.
72. Будет ли производиться сборка мусора в постоянном поколении JVM?
Сборка мусора не происходит в постоянном поколении.Если постоянное поколение заполнено или превышает критическое значение, будет запущена полная сборка мусора (Full GC). Если вы внимательно посмотрите на вывод сборщика мусора, то увидите, что постоянное поколение тоже собирается. Вот почему правильный размер постоянного поколения очень важен, чтобы избежать полного GC. Пожалуйста, обратитесь к Java8: от постоянного поколения к области метаданных (Примечание: постоянное поколение было удалено в Java8, и была добавлена новая собственная область памяти, называемая областью метаданных)
73. Алгоритмы сборки мусора
Существует три основных алгоритма GC: алгоритм маркировки-очистки, алгоритм копирования, алгоритм маркировки-сжатия, наши часто используемые сборщики мусора обычно используют алгоритмы сбора поколений.
алгоритм маркировки-развертки
Алгоритм «Mark-Sweep» (Mark-Sweep), как и его название, делится на два этапа: «разметка» и «подметание»: сначала помечаются все объекты, которые необходимо переработать, а все объекты, которые необходимо переработанные равномерно перерабатываются после завершения маркировки маркированного объекта.
алгоритм репликации
«Копирование» — это алгоритм сбора, который делит доступную память на два блока одинакового размера в соответствии с их емкостью и использует только один из них за раз. Когда память этого блока израсходована, уцелевшие объекты копируются в другой блок, а затем однократно очищается использованное пространство памяти.
алгоритм сжатия тегов
Процесс маркировки все тот же, что и в алгоритме «маркировка-очистка», но вместо непосредственной очистки перерабатываемых объектов последующие шаги перемещают все уцелевшие объекты в один конец, а затем непосредственно очищают память за пределами конечной границы.
Алгоритм сбора поколений
Алгоритм «Коллекция поколений» делит кучу Java на новое поколение и старое поколение, чтобы можно было выбрать наиболее подходящий алгоритм сбора в соответствии с характеристиками каждого поколения.
Связанные с тюнингом
74. Что такое команды настройки?
Команды Sun JDK для мониторинга и устранения неполадок: jps jstat jmap jhat jstack jinfo
(1) jps, инструмент состояния процессов JVM, отображает все процессы виртуальной машины HotSpot в указанной системе.
(1) jstat, мониторинг статистики JVM — это команда, используемая для мониторинга информации о состоянии выполнения виртуальной машины.Он может отображать текущие данные, такие как загрузка классов, память, сборка мусора и JIT-компиляция в процессе виртуальной машины.
(3) jmap, команда карты памяти JVM используется для создания файлов дампа кучи
(4) jhat, команда JVM Heap Analysis Tool используется совместно с jmap для анализа дампа, сгенерированного jmap. jhat имеет встроенный миниатюрный сервер HTTP/HTML. После создания результатов анализа дампа вы можете просмотреть его в браузере
(5) jstack, который используется для создания моментального снимка потока текущего момента виртуальной машины Java.
(6) jinfo, информация о конфигурации JVM. Эта команда используется для просмотра и настройки параметров работы виртуальной машины в режиме реального времени.
75. Инструменты настройки
Обычно используемые инструменты настройки делятся на две категории, jdk поставляется с инструментами мониторинга: jconsole и jvisualvm, сторонние: MAT (Memory AnalyzerTool), GChisto.
(1) jconsole, Консоль мониторинга и управления Java — это консоль мониторинга и управления Java, которая поставляется с JDK, начиная с java5, которая используется для мониторинга памяти, потоков и классов в JVM.
(2) jvisualvm, jdk поставляется с универсальным инструментом, который может анализировать моментальные снимки памяти, снимки потоков, отслеживать изменения памяти, изменения GC и т. д.
(3) MAT, Memory Analyzer Tool, инструмент анализа памяти на основе Eclipse, представляет собой быстрый, многофункциональный инструмент анализа Javaheap, который может помочь нам найти утечки памяти и сократить потребление памяти.
(4) GChisto, профессиональный инструмент для анализа журналов сборщика мусора
76. Когда происходят Minor GC и Full GC?
MGC также называется YGC, когда памяти нового поколения не хватает, а FGC возникает, когда памяти JVM не хватает.
77. Какие настройки производительности JVM вы знаете?
Установить размер кучи памяти
-Xmx: максимальный предел памяти кучи.
Установите размер молодого поколения. Новое поколение не должно быть слишком маленьким, иначе в старое поколение хлынет большое количество объектов
-XX:NewSize: размер нового поколения
-XX:NewRatio Соотношение нового поколения и старого поколения
-XX:SurvivorRatio: соотношение пространства Эдема и пространства выживших.
Установить молодой прокси сборщика мусора -XX:+UseParNewGC старый прокси -XX:+UseConcMarkSweepGC
В конце концов
Обратите внимание на официальный аккаунт: Программисты следуют за ветром, ответьте 003, чтобы получить последнее руководство по вопросам собеседования по Java в 2020 году (более 200 страниц PDF-документов).