JVM (Java Virtual Machine) — это вопрос, который необходимо задавать на собеседовании, и первый вопрос, который должен задать любой, кто задает вопрос о JVM, звучит так: Расскажите мне о составе JVM? Затем эта статья посвящена составу JVM.
Прежде всего, компоненты JVM делятся на общие компоненты и компоненты области данных времени выполнения.Как правило, разработчики обращают внимание на последние, а интервьюеры спрашивают о последних, но в этой статье мы подробно объясним два вышеупомянутых компонента.
Во-первых, общий состав JVM
Общий состав JVM можно разделить на следующие четыре части:
Загрузчик классов (ClassLoader)
Область данных времени выполнения (Область данных времени выполнения)
Исполнительный механизм
Родной интерфейс
Назначение каждого компонента:
Прежде чем программа будет выполнена, java-код должен быть преобразован в байт-код (файл класса), JVM сначала должен преобразовать байт-код с помощью определенного метода.Загрузчик классов (ClassLoader)загрузить файл в памятьОбласть данных времени выполнения, а файл байт-кода представляет собой набор спецификаций набора инструкций jvm и не может быть напрямую передан базовой операционной системе для выполнения, поэтому требуется специальный анализатор команд.Исполнительный механизмБайт-код транслируется в базовые системные инструкции, а затем передается ЦП для выполнения, и в этом процессе необходимо вызывать интерфейс других языков.Родной интерфейсЧтобы реализовать функцию всей программы, это ответственность и функция этих 4 основных компонентов.
И то, что мы обычно называем композицией jvm, относится к области данных времени выполнения (Runtime Data Area), потому что область, которая обычно требует от программистов отладки и анализа, — это «область данных времени выполнения», или, точнее, «область данных времени выполнения» «Куча ( heap) внутри, тогда давайте посмотрим, из каких модулей состоит область данных времени выполнения.
Во-вторых, состав области данных времени выполнения
Область данных среды выполнения Jvm, различные реализации виртуальной машины могут незначительно отличаться, но будут соответствовать спецификации виртуальной машины Java, спецификации виртуальной машины Java 8, управление памятью виртуальной машины Java будет включать следующую область данных среды выполнения:
Регистр счетчика программ
Стеки виртуальных машин Java
Стек собственных методов
Куча Java
Область метода
Далее мы вводим назначение каждой области в отдельности.
①, Javaсчетчик команд
Регистр счетчика программ — это небольшое пространство памяти, которое можно рассматривать как индикатор номера строки байт-кода, выполняемого текущим потоком. В концептуальной модели виртуальной машины задача синтаксического анализатора байт-кода состоит в том, чтобы выбрать следующую инструкцию байт-кода, которую необходимо выполнить, путем изменения значения этого счетчика.Основные функции, такие как ветвление, цикл, переход, обработка исключений и поток восстановление все Необходимо полагаться на этот счетчик для завершения.
Особенность: Частная память
Поскольку многопоточность JVM достигается переключением потоков по очереди и выделением времени выполнения процессора, то есть в любой момент времени процессор (или ядро) будет выполнять инструкции только в одном потоке. Поэтому, чтобы восстановить правильную позицию выполнения после переключения потока, каждый поток имеет независимый программный счетчик.
Исключения: нет
Если поток выполняет метод на Java, программный счетчик записывает адрес выполняемой инструкции байт-кода виртуальной машины.Если это метод Native, этот счетчик пуст (не определен), поэтому эта область памяти является единственной в Виртуальная машина Java Область ошибки OutOfMemoryError в спецификации не указана.
2, Java виртуальный станок стек
Стеки виртуальной машины Java описывают модель памяти выполнения метода Java, каждый метод создает каркас (фрейм стека) для хранения таблицы локальных переменных, стека операндов, динамической ссылки, такой информации, как выход из метода, процесс каждого метода из вызова. до завершения выполнения соответствует процессу помещения кадра строки в стек в стеке виртуальной машины.
Особенности: Память является частной, и ее жизненный цикл такой же, как у потоков.
Правила исключения: StackOverflowError, OutOfMemoryError
1. Если глубина стека, запрошенная потоком, превышает глубину стека, разрешенную виртуальной машиной, будет выдано исключение StackOverflowError.
2. Если виртуальная машина может быть динамически расширена, будет выдано исключение OutOfMemoryError, если во время расширения не может быть применен достаточный объем памяти.
③, локальный стек методов
Функция стека собственных методов такая же, как у стека виртуальной машины, за исключением того, что стек виртуальной машины обслуживает методы Java, а стек собственных методов служит виртуальной машине для вызова собственных методов.
В спецификации виртуальной машины Java нет особых требований к собственному стеку методов, и виртуальная машина может свободно его реализовать, поэтому виртуальная машина Sun HotSpot напрямую объединяет собственный стек методов и стек виртуальной машины в один.
Особенности и исключения:Как и в случае со стеком виртуальной машины, обратитесь к приведенным выше знаниям.
④, куча Java
Куча Java — это самая большая часть памяти в виртуальной машине Java. Она совместно используется всеми потоками. Она создается при запуске виртуальной машины. Единственная цель кучи Java — хранить экземпляры объектов. Почти все экземпляры объектов выделены памяти здесь., с развитием JIT-компилятора и постепенной зрелостью технологии escape-анализа, технология выделения стека и оптимизации скалярной замены приведет к некоторым тонким изменениям, все объекты размещаются в куче и постепенно становятся менее «абсолютными».
Особенность: Общий доступ к памяти
Аномальные положения: OutOfMemoryError
OutOfMemoryError будет выброшен, если в куче нет памяти для завершения выделения экземпляра, и куча больше не может быть расширена.
Спецификация виртуальной машины Java предусматривает, что куча Java может находиться в физически прерывистом пространстве памяти, если она логически непрерывна, как и наше дисковое пространство. Он также может быть фиксированного размера или расширяемым в реализации, но текущие основные виртуальные машины являются расширяемыми и управляются -Xmx и -Xms.
⑤, область метода
Область методов используется для хранения таких данных, как информация о классе, константы, статические переменные и своевременно скомпилированный код, загруженный виртуальной машиной.
Миф: площадь метода не равна вечному поколению
Многие люди называют область методов "постоянной генерацией" по причинам. По сути, они не эквивалентны. Просто команда сборщика мусора виртуальной машины HotSpot расширила коллекцию поколений GC до области методов или используется для постоянная Область метода реализована только от имени области метода, что избавляет от необходимости писать код управления памятью для области метода, но «постоянная генерация» также удалена в Jdk8, и для реализации области метода используется собственная память. .
Особенность: Общий доступ к памяти
Спецификация исключения: OutofMemoryError
Исключение OutOfMemoryError возникает, когда метод не может удовлетворить требования к выделению памяти.
3. Расширить знания
Этот раздел расширит некоторые знания, связанные с распределением памяти.
постоянный пул времени выполнения
Пул констант времени выполнения является частью области методов.В дополнение к информации описания версии класса, поля, метода, интерфейса и т. д. в файле класса существует также пул констант (таблица пула констант), используемый для хранения различных генерируются во время компиляции Литеральные и символические ссылки, эта часть входит в область методов после загрузки класса и запускается в пуле констант, например метод intern() класса String.
Прямая память
Прямая память (Direct Memory) не является частью области данных работающей виртуальной машины, но часть памяти будет часто использоваться и может привести к OutOfMemoryError. В JDK 1.4 NIO недавно добавленная категория представила режим ввода-вывода на основе буфера канала и буфера, который сохраняется через стек в объектах Java DirectByteBuffer в качестве оперативной памяти этой ссылки, поэтому он более эффективен, он избегает кучи Native Java и кучи обмен данными о времени приема-передачи.
Уведомление:Прямое выделение памяти не ограничивается размером кучи Java, а ограничивается общим объемом памяти машины.При настройке параметров виртуальной машины прямую память нельзя игнорировать, а реальная память устанавливается в -Xmx, чтобы сумма областей памяти была больше физической памяти.Ограничение памяти, приводящее к исключению OutOfMemoryError при динамическом расширении.
4. Резюме
В этой статье рассказывается об основных компонентах jvm и составе самой важной области данных времени выполнения (Runtime Data Area) в компонентах.Счетчик программ, стек виртуальной машины и локальные методы — это приватная память, которая будет рождаться с потоками, и будет меняться вместе с потоком. Потоки умирают, и куча Java, как самая большая область памяти, будет областью памяти, на которой сосредоточатся разработчики, а также взаимосвязь между областью метода и областью констант времени выполнения и бессмертным поколением. Наконец, процесс реализации прямой памяти обязателен при ее использовании.Главный момент, надеюсь поможет вам лучше понять jvm.
5. Ссылки
"Глубокое понимание виртуальной машины Java"
【Конец】
Внимание на следующий код Fanger Wei, подпишитесь на более интересный контент.