jvm — подсистема загрузки классов
подсистема загрузки классов
процесс загрузки класса
нагрузка
-
Получить двоичный поток, определяющий этот класс по его полному имени,
-
Преобразуйте статическую структуру хранения, представленную этим потоком байтов класса, в структуру данных времени выполнения метода.
-
В области кучи == == в памяти объект класса, представляющий этот класс, генерируется как запись доступа к структуре данных этого класса в области методов.
Различать, являются ли два класса одним и тем же объектом
Прежде всего, два класса находятся в одном пакете и имеют одно и то же имя?
Являются погрузчиками двух классов одинаковы
Загруженный путь
- Загружать напрямую в локальную систему
- Получено из Интернета
- Читать из zip архива
- Генерация вычислений во время выполнения, реализованная через динамические прокси
- генерируется из других файлов
- Извлечь файлы .Class из собственной базы данных
- Получено из зашифрованного файла
Ссылка на сайт
проверять
Убедитесь, что информация, содержащаяся в потоке байтов файла Class, соответствует требованиям виртуальной машины, обеспечит корректность загруженного класса и не будет угрожать безопасности самой виртуальной машины.
В основном он включает четыре вида проверки: проверку формата файла, проверку метаданных, проверку байт-кода и проверку ссылки на символ.
Подготовить
Выделите память для переменных класса и установите начальное значение типа по умолчанию, то есть нулевое или нулевое (статические переменные, измененные с помощью == final, не будут выделены, потому что окончательные переменные выделяются во время компиляции, и на этапе подготовки будет явно инициализирована ; инициализация не будет выделена для переменных экземпляра, переменные класса будут выделены в область методов, а переменные экземпляра будут выделены в кучу java вместе с объектом ==)
Разобрать
Процесс преобразования символической ссылки в пуле констант в прямую ссылку
Выполнить после инициализации jvm
инициализация
Выполнение операций инициализации над статическими переменными класса, статическими блоками кода
Процесс инициализации — это процесс создания == исполняемого метода конструктора класса == путем автоматического сбора всех == переменных класса ==, а также действий и инструкций присваивания в статических блоках кода в классе путем выполнения компилятора javac.
Виртуальная машина должна гарантировать, что метод конструктора класса выполняется только один раз, а в многопоточной среде он блокируется синхронно.
Когда инициализируется класс:
1) Создать экземпляр класса, то есть новый объект
2) Доступ к статическим переменным класса или интерфейса или присвоение значений статическим переменным
3) Вызвать статический метод класса
4) Отражение (Class.forName("com.lyj.load"))
5) Инициализировать подкласс класса (сначала будет инициализирован родительский класс подкласса)
6) Класс запуска, указанный при запуске JVM, то есть класс с тем же именем файла и именем класса.Только в этих 6 случаях будет инициализирован класс класса.
Классификация загрузчиков классов
Bootstrap ClassLoader: реализация c, c++
Не могу понять. Не написано java, вложено в jvm, но вы можете найти, какие пути API можно загрузить:sun,misc.Launcher.getBootstrapClassPath().getURLS();
Загрузите класс расширения и загрузчик класса приложения и сделайте его своим загрузчиком родительского класса.
Загружайте только те классы в каталоге, имя пакета которых начинается с java, javax, sun
Пользовательский загрузчик классов: реализация Java
Любой класс, который прямо или косвенно наследует ClassLoader, называется пользовательским загрузчиком классов.
Пользовательский класс загружается системным загрузчиком классов по умолчанию; основная библиотека классов системы загружается загрузчиком классов начальной загрузки.
загрузчик класса расширения
Унаследованный от класса загрузчика классов, загрузчик родительского класса является загрузчиком запускаемого класса.
Загрузите библиотеку классов из подкаталога jre/lib/ext каталога установки jdk или из каталога, указанного системным свойством java.ext.dirs.Если созданный пользователем пакет jar будет помещен в этот каталог, он также будет автоматически загружается классом расширения для загрузки
загрузчик системных классов
Производный от загрузчика классов, родительский класс является расширенным загрузчиком классов
Отвечает за загрузку библиотеки классов по пути, указанному в переменной окружения classpath или в системном свойстве java.class.path.
Загрузчик классов является загрузчиком классов по умолчанию в программе, вообще говоря, классы java-приложений загружаются им.
Пользовательский загрузчик классов
В каких ситуациях требуется пользовательский загрузчик классов?
- Изолированный загрузчик
- Изменить метод загрузки класса
- источник загрузки расширения
- Предотвратить утечку исходного кода
Шаги для пользовательского загрузчика?
-
Наследовать загрузчик классов абстрактного класса
-
Перепишите метод findClass() и напишите свою собственную логику в этом методе.
Способ получить загрузчик классов
1. Получено отражением
Class.forName("java.lang.String").getClassLoader();
2. Пройти через нить
Thread.currentThread().getContextClassLoader();
3. Получить системный загрузчик
ClassLoader.getSystemClassLoader().getParent();
Механизм родительского делегирования
Какова роль механизма родительского делегирования?
Если загрузчик класса получает запрос на загрузку, он не загрузит его сам, а передаст его загрузчику родительского класса для загрузки.Если у родительского класса все еще есть родительский класс, он будет передан до тех пор, пока он не будет передан в класс запуска Loader. Если загрузчик родительского класса может завершить загрузку, он возвращается успешно, в противном случае дочерний класс попытается загрузиться.
Это может предотвратить подделку основного класса и избежать повторной загрузки.
Процесс реализации:
1. Когда системный загрузчик классов получает запрос на загрузку класса, он не будет пытаться сначала загрузить класс самостоятельно, а делегирует запрос родительскому загрузчику классов, чтобы расширить загрузчик классов для завершения.
2. Когда расширенный загрузчик класса получает запрос на загрузку класса, он не будет пытаться сначала загрузить класс сам по себе, а делегирует запрос загрузчику родительского класса, чтобы запустить загрузчик класса для завершения.
3. Если загрузчик класса запуска не загружается (необходимый класс не найден в
4. Если загрузчик класса расширения также не загружается, он будет использовать системный загрузчик класса для загрузки.
5. Если загрузчик системного класса также не загружается, для попытки загрузки будет использоваться пользовательский загрузчик.
область данных времени выполнения
Описывает состояние выполнения программы в реальном времени; стек виртуальной машины, собственный стек методов и счетчик программы являются частными для каждого потока. Области кучи и методов совместно используются потоками.
счетчик команд
Это индикатор номера строки байт-кода, выполняемого текущим потоком, и используется для хранения адреса следующей выполняемой инструкции, то есть кода инструкции, подлежащей выполнению. Следующая инструкция считывается механизмом выполнения.
Зачем нужен счетчик программ?
Когда ЦП выполняет переключение потоков или прерывается другой работой, а затем возвращается к выполнению потока, ему необходимо знать, где было последнее выполнение, и счетчик программ записывает позицию выполнения программы, чтобы он мог быстро найти последнее выполнение. прерывание, позиция, продолжение.
Почему каждому потоку нужен собственный счетчик программ?
В процессе будет несколько потоков, и каждый поток может часто переключаться.Если мы используем только один программный счетчик, это может привести к тому, что адреса байт-кода, выполняемые между разными потоками, перекрываются и мешают друг другу, поэтому лучшим решением является Решение заключается в том, что каждый поток имеет программный счетчик, адрес байт-кода, который быстро выполняется каждым потоком.
стек виртуальных машин
Почему появляется стек виртуальной машины?
Архитектура Java имеет преимущества кроссплатформенности, небольшого набора инструкций и простоты реализации компилятором.Архитектура ЦП разных платформ различна.Поэтому для достижения кроссплатформенного дизайна поток инструкций Java разработан в соответствии с в структуру стека.Метод помещается в стек, затем выполняется с вершины стека и извлекается из стека после выполнения. Однако в такой архитектуре также есть некоторые недостатки, то есть производительность ниже, чем у архитектуры на основе регистров, и для достижения той же функции требуется больше инструкций.
Что такое стек виртуальной машины Java? преимущество?
==Стек — это единица времени выполнения ==, которая является частной для потока и имеет тот же жизненный цикл, что и поток; в нем хранятся локальные переменные метода (включая 8 основных типов данных, адрес ссылки объект), часть результата и участвует в вызове метода return.
Как способ распределения памяти, скорость доступа - это только счетчик программ, и есть только два процесса толкания и извлечения стека.Проблемы сборки мусора нет, но есть проблемы исключения переполнения и исключения нехватки памяти. .
Поскольку будет исключение из-за нехватки памяти, как установить размер стека для изменения требований в некоторых конкретных средах?
До версии 2021 г.run ==》edit Configurations
идея версии 2021 года,help ==> custom VM options
единица хранения стека
Основной единицей хранения стека является кадр стека.
Фреймы стека, содержащиеся в разных потоках, не могут ссылаться друг на друга.Стек является частным для потока и изолирован друг от друга.
Два способа завершения метода:
- нормальный обратный конец
- Произошло неперехваченное исключение, завершение исключения путем выдачи исключения
Внутренняя структура рамы стека
-
таблица локальных переменных
- Это массив чисел, который в основном используется для хранения параметров метода и локальных переменных, определенных в теле метода.
- Требуемая емкость определяется во время компиляции, поэтому ее размер не меняется во время выполнения.
- Поскольку это частный поток, проблем с безопасностью потоков не возникает.
- Базовой единицей хранения таблицы локальных переменных является слот, и каждому слоту назначается индекс доступа, через который можно успешно получить доступ к значению локальной переменной, указанному в таблице локальных переменных.
- 32-битные типы, включая 32-битные типы, занимают один слот (ссылочный тип), а 64-битные типы занимают 2 слота (long, double).При обращении к локальным переменным двух слотов можно получить доступ к индексу предыдущего слота.
- byte, short, char преобразуются в int перед сохранением, а Boolean также преобразуется в int.
- Если текущий кадр создается конструктором или методом экземпляра, ссылка на объект this будет сохранена в слоте с индексом 0, а остальные параметры будут расположены по порядку.
- Слоты можно использовать повторно, когда локальная переменная выходит за пределы своей области видимости, она уничтожается, а ее место занимает другая локальная переменная, таким образом реализуя повторное использование. (Область действия объекта находится в блоке кода, то вне этого блока кода его позицию займет следующая переменная. Если она не будет занята позже, то и позиция не будет занята. Если в этой позиции создается объект , тогда кодовый блок не будет переработан, а объект, изначально созданный в позиции, будет переработан только в том случае, если переменная занимает следующую позицию)
-
Стек операндов (стек выражений)
- Он сохраняет промежуточные результаты процесса расчета и служит временным хранилищем для переменных процесса расчета.
- Во время выполнения метода данные могут быть записаны в стек или извлечены из него в соответствии с инструкциями байт-кода.
- 32-битные типы данных занимают 1 место в стеке, а 64-битные типы данных занимают 2 места в стеке.
- Если вызываемый метод имеет возвращаемое значение, его возвращаемое значение также помещается в стек операндов текущего кадра стека.
-
Динамическое связывание (выполняет ссылки методов на пул констант времени выполнения)
- Внутри каждого кадра стека находится ссылка на метод в пуле констант времени выполнения, к которому принадлежит кадр стека.
- Преобразуйте эти символические ссылки в прямые ссылки на вызывающий метод.
- Роль константного пула состоит в том, чтобы предоставить некоторые символы и константы для облегчения идентификации инструкций.
- раннее связывание
- Когда вызываемый метод известен компилятору, а среда выполнения остается неизменной, тип, к которому принадлежит метод, может быть связан, чтобы было ясно, какой целевой метод вызывается.Поэтому статическое связывание может использоваться для прямого преобразования символической ссылки в Quote .
- позднее связывание
- У компилятора нет возможности определить, а только во время выполнения привязать соответствующий метод на основе фактического типа.
- Пример: проблема полиморфизма. Когда мы вызываем метод, тип которого является восходящим, поскольку компилятор не может предсказать вызываемый метод, он может быть определен только в соответствии с реальной ситуацией во время выполнения.
- У компилятора нет возможности определить, а только во время выполнения привязать соответствующий метод на основе фактического типа.
class Animal { public void eat(){ System.out.println("动物在吃");; } } class Cat extends Animal { public void eat(){ System.out.println("猫吃鱼"); super.eat(); } } class Dog extends Animal { public void eat(){ System.out.println("狗吃骨头"); } } public class testAnimal(Animal animal) { animal.eat() //晚期绑定 }
- невиртуальный метод
- Частные методы, статические методы, конструкторы экземпляров, методы в родительских классах (должны вызываться явно с помощью super), окончательно модифицированные методы (статические вызовы вызовов статических методов, вызовы специальных вызовов, частные методы родительского класса), компиляторы. Будьте уверены.
- виртуальный метод
- Неопределенный метод в компиляторе. (invokevirtual: вызов всех виртуальных методов; invokeinterface: вызов всех методов интерфейса)
Новая инструкция динамического вызова invokedynamic в java7 должна динамически анализировать вызываемый метод Поток stream в java8 является лучшим воплощением.
-
адрес возврата метода
- Содержит значение регистра pc, вызвавшего этот метод.
- Верните значение регистра pc механизму выполнения.
- Инструкции возврата включают ireturn (используется для типов boolean, byte, char, short, int), lreturn, lreturn, freturn, dreturn и areturn, а также инструкции возврата для методов, объявленных как void, методов инициализации экземпляров, классов и интерфейсов. метод инициализации.
-
Дополнительная информация
Вопросы на собеседовании, связанные с виртуальной машиной:
Пример переполнения стека? (Ошибка стекпереполнения)
Когда пространство стека загружено кадрами стека, из-за слишком большого количества кадров стека произойдет переполнение стека.Вы можете установить размер стека с помощью -Xss, что является расширением; когда общего пространства недостаточно, проблема переполнения памяти будет происходить.
Регулировка размера стека может гарантировать отсутствие переполнения?
не может. Поскольку объем памяти ограничен, а выполнение программы может зацикливаться бесконечно, при достижении определенного предела пространство стека будет заполнено. Переполнение можно только отсрочить, но не избежать.
Будет ли сборка мусора встроена в стек виртуальной машины?
Не буду. Как было сказано ранее, в стеке виртуальной машины есть ошибка, но нет GC (сборки мусора);
Являются ли локальные переменные, определенные в методах потокобезопасными?
Как упоминалось ранее, поскольку локальные переменные являются частными потоками, проблем с безопасностью потоков не возникает. Однако это не является абсолютным.В большинстве случаев нам нужно знать, какие ситуации вызовут проблемы с небезопасностью потока, что также хочет проверить интервьюер. Когда локальная переменная создается в методе, а затем уничтожается в этом методе, локальная переменная является потокобезопасной; если переменная создается в методе, но возвращается как возвращаемое значение из метода, тогда могут быть другие потоки, работающие с этим возвращаемым значением, могут иметь проблемы с безопасностью потоков. (Напоминание: метод должен поддерживать атомарность для обеспечения безопасности синхронизации, чего можно добиться с помощью блокировок)
собственный интерфейс методов, собственная библиотека методов
Что такое нативный метод?
Для метода, модифицированного ключевым словом native, определяется только локальный метод, а конкретная реализация не реализуется языком java, поэтому код других языков также может использоваться java.
эффект
Это использование java для вызова кода на других языках для достижения некоторых требований, которые относительно сложно реализовать в java. Реального применения меньше, и это можно понять.
собственный стек методов
Что такое собственный стек методов
По сравнению со стеком виртуальной машины Java, стек виртуальной машины Java используется для управления вызовом методов Java, а стек собственных методов, естественно, используется для управления вызовом собственных методов. Это также частный поток. Другая информация также может быть похожа на стек виртуальной машины.
куча
куча Javaэто память, управляемая виртуальной машиной Javaсамый большой кусок памяти, вфизически прерывистыйобъем памяти, покалогическая непрерывностьТо есть в основном используется для хранения экземплярных объектов различных классов. Эта область является общей для всех потоков и создается, когда виртуальная машина начинает хранить экземпляры объектов.Здесь выделяется память почти для всех объектов и массивов (за исключением методов оптимизации выделения стека и скалярной замены).
Логическая разбивка памяти jvm
-
Память JVM делится на память кучи и память без кучи.Память кучи делится на молодое поколение и старое поколение.Память без кучи-это постоянное поколение.пространство】.
-
Молодое поколение далее делится на области Эдема и Выжившего. Область Survivor состоит из FromSpace и ToSpace. Область Эдема занимает большую вместимость, а область Выживших — маленькую.Соотношение по умолчанию 8:1:1 (на практике соотношение, которое мы рассчитали, не 8:1:1. Чтобы изменить его на 8:1: 1. Используйте явную спецификацию: -XX:SurvivorRtio=8).
-
Использование памяти кучи: объекты сохраняются, а сборщик мусора собирает эти объекты, а затем перерабатывает их в соответствии с алгоритмом GC.
-
Использование памяти без кучи: постоянная генерация, также известная как область методов, хранит долгоживущие объекты во время работы программы, такие как метаданные класса, методы, константы, свойства и т. д.
стандарт поколения
Объекты классифицируются по вероятности выживания, а объекты с большим временем выживания размещаются в фиксированной области, тем самым сокращая время сканирования мусора и частоту GC. Для классификации используются различные алгоритмы сборки мусора, и эти алгоритмы можно использовать для устранения слабых мест.
Настройка размера кучи
Размер кучи задается при запуске jvm.
-Xms указывает начальную память области кучи, что эквивалентно -XX:InitialHeapSize Размер памяти компьютера по умолчанию/64.
-Xmx указывает максимальную память области кучи, что эквивалентно -XX:MaxHeapSize Размер физической памяти компьютера по умолчанию/4.
-NewRatio: установите соотношение нового поколения к старому. По умолчанию 1/2.
-xmn: установить размер пространства нового поколения.
Большая часть java-объектов создается в области Eden в области кучи, и большая часть объектов также уничтожается в этой области.
стратегия распределения памяти
Вновь сгенерированные объекты сначала помещаются в область Эдема.Когда пространство Эдема заполнено, срабатывает YGC, а уцелевшие объекты перемещаются в область из (Survivor0).После заполнения области Эдема снова срабатывает Minor GC, и область from (Survivor0) выживает объекты.Он также переместится в область to (Suvivor1), что гарантирует, что всегда будет область выжившего, которая пуста в течение определенного периода времени. После того, как несколько второстепенных GC достигнут порога повышения, объекты, которые еще живы, будут помещены в старое поколение. Старое поколение хранит долгоживущие объекты. Когда оно заполнится, запустится Major GC. Во время GC все потоки будут остановлены и будут ждать завершения GC. Поэтому для приложений с высокими требованиями к ответу сведите к минимуму возникновение Major GC чтобы избежать тайм-аута ответа.
==Дополнение: Поскольку Eden:s0:s1=8:1:1, когда s0 или s1 заполнены, ygc не сработает, только когда Eden будет заполнен, ygc сработает, когда Eden полон, сработает YGC. будет переработан вместе с площадью s. Если область s заполнена или сумма размеров предметов одного возраста больше половины пространства, она будет специально обработана и помещена сразу в старость; когда крупный предмет не может быть помещен в новую генерацию , он также будет непосредственно помещен в старость, старость Если места недостаточно, выполните основной GC ==
Разница между Minor GC, Major GC, Full GC, Mixed GC
Minor GC: относится только к коллекции молодого поколения (Eden, s0, s1).
Major GC: относится к коллекции старого поколения.
Mixed GC: Смешанная коллекция, собирающая все молодое поколение и часть старого поколения.
Полный GC: Сборка мусора, которая собирает всю кучу Java и область методов.
Вопрос интервью: должно ли пространство кучи совместно использоваться всеми потоками?
Нет, в области Eden новой области есть TLAB.Это пространство является приватным для каждого потока, что составляет около 1% области Eden.Эти области в основном используются для хранения некоторых объектов, которые являются приватными для каждого потока , Он не слишком мал, чтобы разместить его на территории, разделяемой Эдемом.
Оптимизация кода
выделение стека
Вопрос из интервью: является ли куча единственным вариантом размещения объектного хранилища?
Если после анализа побега обнаруживается, что объект не имеет метода побега, он может быть оптимизирован для размещения в стеке. Что такое анализ побега? Когда объект определен внутри метода и объект используется только внутри метода, говорят, что выхода нет, и его можно оптимизировать для размещения в стеке; если на объект ссылается внешний метод (передается в другом месте в качестве параметра вызова), он считается экранированным.
синхронизировать пропустить
С помощью его анализа побега, чтобы определить, может ли объект блокировки, используемый блоком синхронизации, быть доступен только одному потоку и не может быть выпущен для других потоков, тогда синхронизация этого кода может быть отменена для улучшения параллелизма. То есть, когда к объекту может получить доступ только один поток, нет необходимости его блокировать.
public void test() {
Test t = new Test();
synchronized (t) {
System.out.println(t);
}
}
Например, в приведенном выше коде даже в случае высокого параллелизма t не будет использоваться двумя потоками, потому что каждый поток, входящий в этот метод, будет создавать новый t, поэтому нет необходимости блокировать этот объект.
Отдельный объект или скалярная замена
Некоторые объекты могут не существовать как непрерывная структура памяти, и к ним можно получить доступ, поэтому часть или все объекты могут храниться не в памяти, а в регистре ЦП (стеке).
С помощью анализа побегов обнаружено, что если объект не экранируется, то объект можно заменить скаляром и разложить на несколько скаляров, что эквивалентно преобразованию в несколько локальных переменных и сохранению их в таблице локальных переменных.
Область метода (метапространство)
В некоторых сценариях сложно определить размер пространства для постоянной генерации, а если динамически загружаемых классов слишком много, то легко сгенерировать oom в Пермском крае. Если места слишком мало, это приведет к полной сборке мусора, блокировке пользовательских процессов и снижению производительности программы. Слишком большой приведет к большому количеству отходов. Поэтому метаданные класса перемещаются в локальную область памяти, не связанную с кучей, которая называется метапространством. Поскольку метаданные класса размещаются в локальной памяти, максимальная память, которую может выделить метапространство, — это наша локальная память. До сих пор постоянное поколение навсегда ушло со сцены истории, и родился Метапространство.
Область методов хранит == информацию о типах, загруженную виртуальной машиной, константы, кеш кода == скомпилированный JIT-компилятором и т. д.
До jdk1.6 ссылки на статические переменные и пулы строковых констант хранились в постоянном поколении.
Установить размер метапространства (jdk8)
-XX:MetaspaceSize=100m -XX:MaxMetaspaceSize=100m
постоянный пул времени выполнения
В Java есть два типа постоянных пулов:статический постоянный пулипостоянный пул времени выполнения.
статический постоянный пул, является константным пулом в файле класса.Константный пул в файле класса содержит не только строковые (числовые) литералы, но также информацию о классе и методе, занимая большую часть места в файле класса. Этот пул констант в основном используется для хранения двух типов констант:буквальныйиСсылки на символы, литералы эквивалентны понятию констант на уровне языка Java, таких как текстовые строки, константные значения, объявленные как final и т. д. Символические ссылки относятся к понятию принципов компиляции, включая следующие три типа констант:
- Полные имена классов и интерфейсов
- Имена полей и дескрипторы
- имя и дескриптор метода
Пул констант времени выполнения заключается в том, что после того, как виртуальная машина JVM завершает операцию загрузки класса, пул констант в файле класса загружается в память и сохраняется в области методов.Пул констант, о котором мы часто говорим, относится к операции в области методов. , Пул постоянной времени.
Другая важная особенность пула констант времени выполнения по сравнению с пулом констант файла CLass заключается в том, чтодинамичный, язык Java не требует, чтобы константы могли генерироваться только во время компиляции, то есть содержимое пула констант, не предустановленное в файле CLass, может попадать в пул констант времени выполнения области методов, а новые константы также могут быть помещены в пул во время выполнения.Эта функция больше используется разработчиками в методе intern() класса String.
Метод String intern() проверит, есть ли равная строка в пуле констант, если да, то вернет ссылку на строку, если нет, то добавит вашу собственную строку в пул констант.
Преимущества постоянных пулов
Постоянный пул позволяет избежать частого создания и уничтожения объектов и влияет на производительность системы, реализующей совместное использование объектов. Например, пул строковых констант помещает все строковые литералы в пул констант во время компиляции. (1) Экономия места в памяти: все одинаковые строковые константы в пуле констант объединяются, занимая только одно место. (2) Экономия времени выполнения: быстрее, чем equals() при сравнении строк. Для двух ссылочных переменных, только судя, равны ли ссылки, вы также можете судить, равны ли фактические значения.
Небольшая сводка по времени загрузки и присвоения различных свойств в классе
- Переменные, оформленные только с помощью final, также могут найти соответствующее свойство ConstantValue в байт-коде, но они будут проигнорированы JVM.
- Окончательно измененные свойства экземпляра назначаются только при создании экземпляра.
- Статически измененным атрибутам класса присваиваются начальные значения на этапе подготовки загрузки класса, а присваиваются на этапе инициализации.
- Для констант типа String или базового типа, измененных с помощью static+final, спецификация JVM рекомендует назначать их на этапе инициализации, но HotSpot VM назначает их непосредственно на этапе подготовки.
- Для других констант ссылочного типа, измененных с помощью static+final, шаги присваивания такие же, как и для второй точки.
создание экземпляра объекта
как создаются объекты
- новое ключевое слово
- Создается статическим методом в одноэлементном шаблоне.
- Статические методы xxxBuilder/xxxFactory.
- NewInstance() класса Reflect Class: [можно вызвать только конструктор с нулевым параметром, и разрешение должно быть общедоступным]
- NewInstance(xxx) Reflection Constructor: [Это тоже отражение, вы можете вызвать конструктор с параметрами, никаких разрешений не требуется]
- Используйте clone(): конструктор не требуется, текущий класс должен реализовать интерфейс Cloneable() и реализовать метод clone().
- Используйте десериализацию: восстанавливайте бинарный поток объектов в сети или локально в объект.
- сторонние библиотеки.
Шаги для создания объекта
-
Определите, является ли класс, соответствующий объекту, загруженным, подключенным или инициализированным.
- Найдите символическую ссылку на класс в пуле констант времени выполнения метапространства и проверьте, загружен ли класс, связан ли он, инициализирован ли (проверьте, существует ли метаинформация класса). Если нет, в режиме родительского делегирования используйте загрузчик, чтобы найти соответствующий файл класса, сообщите об исключении classnotfoundexception, если он не найден, и загрузите его, если он найден.
-
Выделить память для объектов
- Регуляризация памяти --- Конфликт указателей
- Неравномерность памяти — виртуальная машина ведет список; список пространства выделен
-
Обработка проблем безопасности параллелизма
- Используйте повторную попытку CAS при сбое и блокировку региона, чтобы гарантировать атомарность обновлений.
- Каждый поток предварительно выделяет часть TLAB--set с параметром --XX:+/-UseTlab.
-
Инициализировать выделенное пространство.
-
Устанавливает заголовок объекта объекта.
- Метаданные времени выполнения: хеш-значение, возраст генерации сборщика мусора, флаг состояния блокировки, блокировка удержания потока, идентификатор потока смещения, отметка времени смещения.
- Указатель типа: указывает на экземпляр класса метаданных класса, чтобы определить тип объекта.
-
Выполните метод init для инициализации.
место доступа к объекту
Два способа доступа к объектам
- обрабатывать доступ
- В области кучи есть область пула дескрипторов, в которой хранится указатель на данные экземпляра объекта, указывающий на экземпляр объекта в куче, и указатель на данные типа объекта, указывающий на данные типа объекта в метапространстве. Расположение экземпляра в пуле дескрипторов сохраняется в таблице локальных переменных кадра стека для поиска объекта.
- прямой указатель
- Таблица локальных переменных непосредственно хранит данные экземпляра объекта в куче, а данные экземпляра в куче включают расположение данных типа объекта в метапространстве.
исполнительный механизм
устный переводчик
Когда запускается виртуальная машина Java, байт-код интерпретируется построчно в соответствии с предопределенной спецификацией, а содержимое каждого файла байт-кода «переводится» в собственные машинные инструкции соответствующей платформы для выполнения.
В HotSpot VM интерпретатор в основном состоит из модуля интерпретатора и модуля кода.
- Модуль интерпретатора: реализует основные функции интерпретатора.
- Модуль кода: используется для управления инструкциями локального компьютера, генерируемыми виртуальной машиной HotSpot во время выполнения.
JIT-компилятор
- Поскольку интерпретатор очень прост по конструкции и реализации, помимо языка Java на его основе также выполняются многие языки высокого уровня, такие как Python, Perl, Ruby и т. д. Но сегодня выполнение на основе интерпретатора стало синонимом неэффективности и часто высмеивается некоторыми программистами на C/C++.
- Для решения этой проблемы платформа JVM поддерживает технологию, называемую своевременной компиляцией. Цель своевременной компиляции состоит в том, чтобы предотвратить интерпретацию и выполнение функции, а скомпилировать все тело функции в машинный код.Каждый раз, когда функция выполняется, выполняется только скомпилированный машинный код.Этот метод может сильно повысить эффективность исполнения.
- Однако режим выполнения на основе интерпретатора все же внес неизгладимый вклад в развитие промежуточных языков.
Обнаружение точки доступа
Итак, какую частоту звонков можно назвать горячим кодом?
В серверном режиме jvm, когда вызов метода достигает 10000 раз, это называется горячим кодом, а в клиентском режиме, когда вызов метода достигает 1500 раз, это горячий код. 64-битный ПК по умолчанию работает в режиме сервера.
распад тепла
Счетчик вызовов метода подсчитывает относительную частоту выполнения вызова метода.Если количество вызовов метода никогда не достигает количества горячих точек в течение определенного периода времени, будет выполняться операция спада тепла, то есть счетчик метода будет уменьшен вдвое.
Вы также можете использовать -XX:UseCounterDecay, чтобы отключить термическое затухание. -XX:CounterHalfLifeTime, чтобы установить время спада тепла.
Резюме: В общем случае в механизме исполнения есть и интерпретаторы, и компиляторы точного времени, так как же переключаться?
По умолчанию используется смешанный режим, представляющий собой сочетание режимов интерпретатора и компилятора «точно в срок».
Режим компилятора:java -Xcomp -versio
Режим переводчика:java -Xint -version
Режим смешивания :java -Xmixd -version
Алгоритм сборки мусора
Что такое мусор? Зачем перерабатывать?
В Java, когда на объект не указывает ни один указатель, он становится мусором, и его нужно перерабатывать, иначе это вызовет утечку памяти или даже переполнение памяти.
Сбор мусора делится на две фазы: маркировка мусора и сборка мусора.
спам
Алгоритм вычисления эталона (java не используется, нет циклической ссылки, вызывающей утечку памяти)
Для каждого объекта сохраняется целочисленное свойство счетчика ссылок, которое используется для записи статуса объекта, на который делается ссылка. Когда на объект ссылается какой-либо объект, счетчик будет добавлен, а ссылка будет уменьшена на 1 в случае сбоя ссылки.Пока счетчик не равен 0, объект считается мусором и собирается.
Алгоритм обладает характеристиками высокой эффективности и отсутствия задержки восстановления, но увеличивает накладные расходы, а каждое добавление и вычитание также увеличивает временную сложность, в то же время он не может справиться с проблемой циклических ссылок. Так что на самом деле java не использует такой алгоритм.
Алгоритмы анализа достижимости
Начиная с корневого набора объектов, ищите сверху вниз, доступен ли целевой объект, связанный с корневым набором объектов. Объекты, находящиеся в памяти, прямо или косвенно связаны с корневым объектом. В противном случае объект считается переработанным.
Так что же включает в себя набор корневых элементов?
- Объекты, на которые есть ссылки в стеке виртуальной машины.
- Например, параметры, локальные переменные и т. д., используемые в каждом методе вызова потока.
- Объекты, на которые есть ссылки в собственном стеке методов.
- Объект, на который ссылается статическое свойство в области метода.
- Объект, на который ссылается константа в области метода.
- Ссылка в пуле строковых констант.
- Все объекты удерживаются блокировками синхронизации.
- Ссылка внутри виртуальной машины Java.
Механизм завершения объекта
Объект будет выполнять метод finalization() до того, как он будет повторно использован для выполнения таких операций, как освобождение ресурсов.
Хотя механизм финализации объекта звучит очень высоко, кажется, что мы никогда не использовали его раньше, это правильно, потому что он вызывается для сборки мусора, и его не нужно вызывать программисту, и это не разрешено вызываться программистом. Поскольку финализация может привести к воскрешению объекта, во-вторых, время работы этого механизма определяется потоком GC. Если GC не произойдет, этот механизм никогда не сработает. Наконец, если этот механизм используется неправильно, это серьезно повлияет на производительность GC.
Три состояния объекта
- доступное состояние
- объект обычного использования
- Возрождаемое состояние
- Объект недоступен, но воскрешается при доработке
- неприкосновенное состояние
- Объекты не могут быть воскрешены, и они находятся в своем состоянии до того, как будут фактически переработаны.
Когда виртуальная машина определяет, является ли объект переработанным, она должна отметить его дважды: в первый раз она определяет, имеет ли объект цепочку ссылок, начинающуюся с корневой коллекции объектов, а затем определяет, нужно ли объекту выполнять финализацию( ) метод finalization() Если метод finalization() не переписывается, а метод уже вызывался ранее live (этот метод может быть вызван только один раз), то считается, что его не нужно выполнять, и объект достиг третье состояние.
Если объект переопределяет метод finalization() и не был выполнен, объект будет вставлен в очередь, и виртуальная машина автоматически создаст поток финализатора с низким приоритетом, чтобы запустить свой метод finalization() во второй раз. если объект внезапно воскреснет в методе, он будет удален из коллекции, которая вот-вот будет переработана, и будет достигнуто второе воскресшее состояние.
вывоз мусора
Алгоритм развертки пометки
Отмечает все объекты выполнением ссылки и очищает неотмеченные объекты.
Поскольку на этапе очистки необходимо обойти все объекты, эффективность невысока, а очищенное пространство фрагментировано, и необходимо поддерживать список свободных мест.
Алгоритм очистки копирования
Все уцелевшие объекты не помечаются, а копируются напрямую в другое пространство того же размера, а затем исходное пространство восстанавливается целиком. Преимущество этого заключается в том, что нет процесса маркировки и очистки, что делает очистку очень эффективной, пространство памяти, скопированное в прошлом, является непрерывным, и нет необходимости поддерживать свободную таблицу. Но для этого требуется в два раза больше памяти, а копирование объекта изменит адрес ссылки в стеке значений.
Алгоритм сжатия тегов
Алгоритм репликации основан на условии, что выживших объектов мало, а мусора больше. Этот алгоритм дефрагментирован на основе алгоритма маркировки-очистки, поэтому нет необходимости поддерживать список свободных мест. Но он менее эффективен, чем алгоритм метки-развертки.
Алгоритм сбора поколений
Выбирайте разные алгоритмы для разных разделов. В новой области, поскольку объекты имеют характеристики жизни и смерти и высокую частоту повторного использования, можно использовать алгоритм репликации с высокой эффективностью повторного использования. Для пожилых людей, поскольку жизненный цикл объекта длительный, пространство относительно большое, а частота переработки невелика, мы можем использовать удаление меток, алгоритм сжатия меток или смешанное использование.
Алгоритм инкрементного сбора
Это по-прежнему традиционный алгоритм пометки-очистки и алгоритм копирования, но проблема конфликта потоков решается поэтапно, позволяя потоку сборки мусора выполнять очистку и копирование поэтапно. Однако частое переключение потоков увеличит общую стоимость сборки мусора и снизит пропускную способность системы.
Алгоритм разбиения
Разделите пространство кучи на множество небольших пространств.В соответствии с временем паузы цели каждый раз разумно восстанавливается несколько небольших интервалов, тем самым уменьшая паузу, генерируемую сборщиком мусора.
утечка памяти
Когда объект не используется, jvm автоматически перерабатывает его, но если возникают какие-то непредвиденные ситуации, из-за которых сборщик мусора не перерабатывает его, мы называем это утечкой памяти.Короче говоря, объект не может Он используется, но не может быть переработаны, и занимает определенный объем памяти в течение длительного времени. Итак, при каких обстоятельствах будут происходить утечки памяти?
Когда есть какие-то сложные указатели, если есть объекты, которые не используются, освобождается много указателей, но не освобождается определенный указатель, в результате чего появляются эти объекты. Есть еще некоторые указатели, которые не отключены, в результате чего объекты не могут быть переработаны.
Кроме того, в шаблоне singleton жизненный цикл singleton совпадает с жизненным циклом приложения, поэтому в singleton-программе, если ссылка на объект удерживается, внешний объект не может быть повторно использован, он просто вызвать утечку памяти.
Также есть некоторые варианты поведения, при которых ресурс не закрывает соединение, соединение с базой данных, сетевое соединение, операцию ввода-вывода и т. д., что приведет к тому, что объект не будет переработан (в основном некоторые объекты, подключенные к внешним ресурсам).
Цитировать
сильная цитата
Объекты, похожие на новые, никогда не будут переработаны, пока существует эталон.
Object o = new Object();
мягкая ссылка
Если памяти недостаточно, объект мягкой ссылки будет восстановлен.
SoftReferencre<User> usersoftRef = new SoftReference<User>(new User("zero",18));
слабая ссылка
Жизненный цикл существует только до следующей сборки мусора, то есть пока происходит GC, слабая ссылка будет собираться.
WeakReference<User> userweakreference = new WeakReference<User>(new User("zero",18));
Фантомные ссылки (отслеживание повторного использования объектов)
фантомная ссылкаКак следует из названия, этотолько по названию. В отличие от некоторых других ссылок,фантомная ссылкаиНе будурешить объектжизненный цикл. если объектсодержит только фантомные ссылки, то это то же самое, чтонет цитатТочно так же он может быть собран сборщиком мусора в любое время.
уборщик мусора
серийный коллектор (серийная переработка)
Сценарий приложения заключается в использовании потока сбора для завершения работы по очистке в случае одноядерного ЦП.В период сбора мусора все остальные рабочие потоки должны останавливаться до тех пор, пока поток сбора мусора не завершится. В его особом рабочем сценарии его эффективность рециркуляции самая высокая, потому что ему не нужно многократно переключаться между несколькими потоками. Обычно работает с Serial Old GC.
Коллектор ParNew (параллельный сбор)
Принят параллельный метод сбора, а остальные очень похожи на последовательный метод сбора. В основном используется в многопроцессорной среде. Работает с CMS GC и Serial Old GC.
Сборщик Parallel Scavenge (приоритет пропускной способности)
Сборщик мусора с алгоритмом копирования, параллельной сборкой и механизмом stw. Видно, что цель этого сборщика — сосредоточиться на пропускной способности,
Он очень хорошо работает с коллектором Parallel Old, который использует алгоритм сжатия меток, параллельную переработку и механизм stw. (является сборщиком мусора по умолчанию для jdk8)
сборщик cms (параллельный сборщик)
Первый сборщик, позволяющий потоку сборки мусора и пользовательскому потоку работать одновременно. Его внимание сосредоточено на минимизации времени паузы пользовательского потока во время сборки мусора и повышении скорости отклика.
Используется алгоритм маркировки-зачистки, поэтому после сборки мусора будет сгенерировано некоторое фрагментированное пространство, а последующее выделение памяти может быть выполнено только путем обращения к свободному списку.
Также он очень чувствителен к ресурсам процессора, на параллельном этапе будет занимать часть потока, что замедлит работу программы и уменьшит общую пропускную способность.
Не справляется с плавающим мусором. После завершения параллельного процесса маркировки на втором этапе некоторые объекты, которые до этого не были мусором, становятся мусором из-за некоторых операций пользовательского потока, но переписывание маркировки на третьем этапе проводится только для подтверждения объектов, подозреваемых в мусоре. Будь то настоящий мусор, эта часть вновь сгенерированного плавающего мусора не будет помечена. Эта часть мусора не будет перерабатываться.
Процесс:
-
начальная отметка
- Все рабочие потоки будут иметь короткую stw Цель этого этапа — пометить все корни GC, которые могутпрямая ассоциацияобъект, все приостановленные потоки возобновляются после завершения маркировки, что очень быстро, поскольку связанный объект относительно мал.
-
одновременная маркировка
- Процесс обхода всего связанного графа объектов от объекта, непосредственно связанного с корнем GC, занимает много времени, но он не требует приостановки пользовательского потока и может выполняться одновременно со сборкой мусора.
-
перемаркировать
- В течение периода корректирующей маркировки время паузы этой фазы будет больше, чем начальная фаза, но намного короче, чем параллельная фаза маркировки, потому что пользовательский процесс продолжает выполнять запись маркировки той части объекта, которая вызвала изменение маркировки. .
-
Параллельная очистка
- Очистите неиспользуемые объекты, оцененные на этапе маркировки удаления, чтобы освободить место в памяти. На этом этапе не нужно перемещать живые объекты, поэтому его также можно выполнять одновременно с пользовательскими потоками.
Сборщик мусора G1 (региональная генерация)
Параллельный сборщик, который делит память кучи на несколько регионов, которые не хотят быть закрытыми (физически разрывными), разные регионы представляют разные разделы кучи (Eden, s0, s1, old), цель этого — избежать в куче Do переработку всей области, вести список приоритетов, отслеживая стоимость переработки каждой области (объем пространства, полученного в результате переработки, и долю необходимого времени), и выбирать область с наибольшей ценностью переработки для переработки в зависимости от времени разрешено к переработке.
Функции:
- параллелизм
- В течение периода перезапуска несколько потоков GC могут работать одновременно, используя многоядерную функцию для уменьшения времени ожидания пользовательских потоков.
- параллелизм
- G1 имеет возможность выполняться попеременно с пользовательскими потоками, поэтому вся фаза рециркуляции не будет полностью блокировать выполнение программы.
- Коллекция поколений
- Разделите все пространство кучи на несколько областей, каждая область представляет собой часть первоначального раздела пространства кучи, и его переработка не похожа на другие сборщики, он учитывает новую область и старую область,
- пространственная интеграция
- Между регионами используется алгоритм репликации, а в целом — алгоритм сжатия меток. После сборки мусора не будет фрагментированного пространства, что позволит избежать многих проблем, связанных с последующим выделением пространства.
- Предсказуемая модель времени паузы
- Помимо погони за малой паузой, G1 также устанавливает предсказуемую модель времени паузы, позволяя пользователям производить сборку мусора не более чем за n во временном отрезке M.
Ссылка на переработку:
- ГК «Молодое поколение»
- При недостатке памяти в Эдеме будет выполняться YGC, в это время это параллельный эксклюзивный сборщик, все пользовательские потоки останавливаются и помещают уцелевшие объекты в Эдеме в область s, а большие объекты сразу в область s. пожилой район.
- Параллельная отметка по старости
- Аналогично процессу очистки cms
- смешанная переработка
- Мусор с новой и старой площадей будет перерабатываться одновременно.