Введение: Подробное и глубокое изложение является «незабываемым» после «внезапно просветленного» знания, и его трудно забыть.
Виртуальная машина Java, указанная в данном виде, называемой JVM, последняя статья имеет общее понимание JVM, после ввода этой статьи мы представим сторону JVM, и этот документ в основном то, что понимается состав JVM. Это обнародовало тайну JVM.
Во-первых, основные компоненты JVM
- Загрузчик классов (ClassLoader)
- Область данных времени выполнения
- Исполнительный механизм
- Родной интерфейс
Далее мы рассмотрим использование вышеупомянутых 4 основных компонентов.
Два, состоящие из использования части JVM
Программа будет преобразовывать код Java в код кода один за другим перед выполнением, и JVM сначала необходимо передать байт-код определенным образом.Загрузчик классов (ClassLoader)загрузить файл в памятьОбласть данных времени выполнения, а файл байт-кода представляет собой набор спецификаций набора инструкций jvm и не может быть напрямую передан базовой операционной системе для выполнения, поэтому требуется специальный анализатор команд.Исполнительный механизмПереведите байт-код в базовую системную команду, а затем передайте ее ЦП, и этот процесс должен вызывать интерфейс других языков.Родной интерфейсЧтобы реализовать функцию всей программы, это ответственность и функция этих 4 основных компонентов.
И то, что мы обычно называем композицией jvm, относится к области данных времени выполнения (Runtime Data Area), потому что область, которая обычно требует от программистов отладки и анализа, — это «область данных времени выполнения», или, точнее, «область данных времени выполнения» «Куча ( heap) внутри, тогда давайте посмотрим, из каких модулей состоит область данных времени выполнения.
3. Область рабочих данных
Область данных времени выполнения jvm может немного отличаться для разных реализаций виртуальных машин, но все они соответствуют спецификации виртуальной машины Java.Согласно спецификации виртуальной машины Java 8, память, управляемая виртуальной машиной Java, будет включать следующие области данных времени выполнения:
- Регистр счетчика программ
- Stack Java Virtual Machine (стеки виртуальных машин Java)
- Нативный метод стека
- Куча Java
- Область метода
Далее мы вводим назначение каждой области отдельно.
3.1 Счетчик программ
Регистр счетчика программ — это небольшое пространство памяти, которое можно рассматривать как индикатор номера строки байт-кода, выполняемого текущим потоком. В концептуальной модели виртуальной машины работа синтаксического анализатора байт-кода состоит в том, чтобы выбрать следующую инструкцию байт-кода, которую необходимо выполнить, путем изменения значения этого счетчика.Основные функции, такие как ветвление, цикл, переход, обработка исключений и поток восстановление все Необходимо полагаться на этот счетчик для завершения.
Особенности: Частная память
Поскольку многопотока JVM достигается путем переключения потоков в свою очередь и выделяющее время выполнения процессора, то есть в любое время процессор (или ядро) будет только выполнять инструкции в одном потоке. Поэтому, чтобы восстановить правильное положение выполнения после переключения потока, каждая нить имеет независимый счетчик программы.
Исключения: нет
Если поток выполняет метод на Java, программный счетчик записывает адрес выполняемой инструкции байт-кода виртуальной машины.Если это метод Native, этот счетчик пуст (не определен), поэтому эта область памяти является единственной в Виртуальная машина Java Область ошибки OutOfMemoryError в спецификации не указана.
3.2 Стек виртуальной машины Java
Стеки виртуальной машины Java описывают модель памяти выполнения метода Java, каждый метод создает каркас (фрейм стека) для хранения таблицы локальных переменных, стека операндов, динамической ссылки, такой информации, как выход из метода, процесс каждого метода из вызова. до завершения выполнения соответствует процессу помещения кадра строки в стек в стеке виртуальной машины.
Особенности: Память является частной, и ее жизненный цикл такой же, как у потоков.
Правила исключения: StackOverflowError, OutOfMemoryError
1. Если глубина стека, запрошенная потоком, превышает глубину стека, разрешенную виртуальной машиной, будет выдано исключение StackOverflowError.
2. Если виртуальная машина может быть динамически расширена, будет выдано исключение OutOfMemoryError, если во время расширения не может быть применен достаточный объем памяти.
3.3 Стек локальных методов
Функция стека собственных методов такая же, как у стека виртуальной машины, за исключением того, что стек виртуальной машины обслуживает методы Java, а стек собственных методов служит виртуальной машине для вызова собственных методов.
В спецификации виртуальной машины Java нет особых требований к локальному стеку методов.Виртуальная машина может быть свободно реализована, поэтому виртуальная машина SUN HOTSPOT напрямую использует локальный квадратный стек и стек виртуальной машины.
Характеристики и исключения:Как и в случае со стеком виртуальных машин, см. раздел 3.2.
3.4 Куча Java
Куча Java — это самая большая часть памяти в виртуальной машине Java. Она совместно используется всеми потоками. Она создается при запуске виртуальной машины. Единственная цель кучи Java — хранить экземпляры объектов. Почти все экземпляры объектов выделены памяти здесь., с развитием JIT-компилятора и постепенной зрелостью технологии escape-анализа, технология выделения стека и оптимизация скалярной замены приведут к некоторым тонким изменениям, все объекты размещаются в куче и постепенно становятся менее «абсолютными».
Особенность: Общий доступ к памяти
Спецификация исключения: OutOfMemoryError
OutofMemoryError будет брошена, если в куче не будет памяти в куче для завершения выделения экземпляра, и куча больше не может быть расширена.
Спецификация виртуальной машины Java предусматривает, что куча Java может быть в физически прерывистом пространстве памяти, если она логически непрерывно, как и наше дисковое пространство. Он также может быть фиксированным размером или расширяемым в реализации, но текущие основные виртуальные машины являются расширяемыми и контролируются -xmx и -xms.
3.5 Область метода
Область методов используется для хранения таких данных, как информация о классе, константы, статические переменные и своевременно скомпилированный код, загруженный виртуальной машиной.
Миф: площадь метода не равна вечному поколению
Многие люди называют область методов "постоянной генерацией" по причинам. По сути, они не эквивалентны. Просто команда сборщика мусора виртуальной машины HotSpot расширила коллекцию поколений GC до области методов или используется для постоянная Область метода реализована только от имени области метода, что избавляет от необходимости писать код управления памятью для области метода, но «постоянная генерация» также удалена в Jdk8, и для реализации области метода используется собственная память. .
Особенность: Общий доступ к памяти
Спецификация исключения: OutOfMemoryError
Исключение OutofMemoryError брошено, когда метод не может соответствовать требованиям распределения памяти.
В-четвертых, расширить знания
Этот раздел расширит некоторые знания, связанные с распределением памяти.
4.1 Пул констант времени выполнения
Пул констант времени выполнения является частью области методов.В дополнение к информации описания версии класса, поля, метода, интерфейса и т. д. в файле класса существует также пул констант (таблица пула констант), используемый для хранения различные генерируемые во время компиляции Буквенные и символические ссылки, эта часть входит в область методов после загрузки класса и запускается в пуле констант, например метод intern() класса String.
4.2 Прямая память
Прямая память (прямая память) не является частью области данных выполнения виртуальной машины, но эта часть памяти также часто используется, и может привести к OutofMemoryError. В JDK 1.4 был вновь добавлен класс NIO, и был введен метод IO на основе канального и буфера буфера. Он использует объект DirectbyTeBuffer, хранящийся в кучи Java в качестве справочной операции для этой памяти, так что это более эффективно, это позволяет избежать Требуется время для обмена данными взад и вперед между кучей Java и родной кучей.
Уведомление:Прямое выделение памяти не ограничивается размером кучи Java, а ограничивается общим объемом памяти машины.При настройке параметров виртуальной машины прямую память нельзя игнорировать, а реальная память устанавливается в -Xmx, чтобы сумма областей памяти была больше физической памяти.Ограничение памяти, приводящее к исключению OutOfMemoryError при динамическом расширении.
V. Резюме
В этой статье рассказывается об основных компонентах jvm и составе самой важной области данных времени выполнения (Runtime Data Area) в компонентах.Счетчик программ, стек виртуальной машины и локальные методы — это приватная память, которая будет рождаться с потоками, и будет меняться вместе с потоком. Потоки умирают, и куча Java, как самая большая область памяти, будет областью памяти, на которой сосредоточатся разработчики, а также взаимосвязь между областью метода и областью констант времени выполнения и бессмертным поколением. Наконец, процесс реализации прямой памяти обязателен при ее использовании.Главный момент, надеюсь поможет вам лучше понять jvm.
6. Ссылки
Состав памяти виртуальной машины Java и введение в память кучи:t.cn/EqVvZui
Технический Q & A Основные моменты (15) Модель памяти JVM:t.cn/EqVvxOS
Серия JVM (2): структура памяти JVM:t.cn/RB8i3RN
Справочник: "Углубленное понимание виртуальной машины Java"
Наконец
Подпишитесь на официальный аккаунт автора, чтобы в будущем узнавать больше интересного контента:
Если вы считаете, что эта статья полезна для вас, вы можете переслать ее своим друзьям или поделиться ею напрямую со своими друзьями.