Основные программисты Java: как работает код Java?

Java

предисловие

Как программист Java, мы должны знать, как работает код Java. Недавно я просматривал книгу "Глубокое понимание виртуальной машины Java" и сделал некоторые заметки. Надеюсь, она будет полезна всем. Если есть какие-то неправильные места, пожалуйста, не стесняйтесь выдвигать их и быть благодарным.

Код Java запускает основной процесс

Эта статья в основном объясняет процесс следующим образом:

  • Исходные файлы Java компилируются в байт-код класса
  • Загрузчик классов загружает байт-код в область методов виртуальной машины.
  • Создание объектов во время выполнения
  • Вызовы методов, интерпретируемые механизмом выполнения как машинный код
  • CPU выполняет инструкции
  • Многопоточность для переключения контекстов

компилировать

Все мы знаем, что код Java выполняется на виртуальной машине Java. Но Java — это объектно-ориентированный язык высокого уровня, у него не только очень сложный синтаксис, но и очень высокая степень абстракции, и он не может работать непосредственно на компьютерном оборудовании.

Виртуальная машина Java (виртуальная машина Java для краткости JVM) — это абстрактный компьютер, на котором выполняются все программы Java и который является средой выполнения языка Java.

Поэтому перед запуском Java-программы компилятору необходимо скомпилировать код в программу инструкций, которую может распознать виртуальная машина Java, которая представляет собой байт-код Java, то есть файл класса.

Таким образом, первым шагом в запуске кода Java является компиляция исходного кода Java в файл байт-кода .class.

загрузка класса

Различная информация, описанная в файле класса, должна быть загружена в виртуальную машину, прежде чем ее можно будет запустить и использовать. Поэтому файл байт-кода класса необходимо загрузить в виртуальную машину Java.

Виртуальная машина загружает данные, описывающие класс, из файла Class в память, проверяет, преобразует, анализирует и инициализирует данные и, наконец, формирует тип Java, который может быть непосредственно использован виртуальной машиной.загрузка классамеханизм.

нагрузка

существуетфаза загрузки, виртуальная машина должна сделать следующие 3 вещи:

  • Получите двоичный поток байтов, определяющий этот класс по его полному имени.
  • Преобразуйте статическую структуру хранения, представленную этим потоком байтов, в структуру данных времени выполнения области метода.
  • Создайте объект java.lang.Class, представляющий этот класс в памяти в качестве записи доступа к различным данным этого класса в области методов.

нагрузкаПосле завершения этапа эти двоичные потоки байтов сохраняются в формате, требуемом виртуальной машиной.область методасреди.

проверять

Чтобы гарантировать, что информация, содержащаяся в потоке байтов файла Class, соответствует требованиям текущей виртуальной машины и не будет угрожать безопасности виртуальной машины, виртуальная машина Java удаляет входной поток байтов.проверятьпроцесс.

Этап проверки состоит из четырех этапов: проверка формата файла, проверка метаданных, проверка байт-кода и проверка ссылки на символ.

  • Проверка формата файла:Проверьте, соответствует ли поток байтов спецификации формата файла класса, например, начинается ли он с магического числа 0xCAFEBABE.
  • Проверка метаданных:Семантический анализ информации, описываемой байт-кодом, такой как: наследует ли родительский класс этого класса классы, которые не разрешено наследовать (классы, модифицированные конечным);
  • Проверка байт-кода:Основная цель состоит в том, чтобы определить, является ли семантика программы законной и логичной, посредством анализа потока данных и потока управления. Например, убедитесь, что инструкция перехода не переходит к инструкции байт-кода за пределами тела метода.
  • Проверка символической ссылки:Происходит, когда виртуальная машина преобразует символическую ссылку в прямую ссылку, например, проверяет, может ли полное имя, описанное строкой в ​​символьной ссылке, найти соответствующий класс.

Подготовить

Подготовительный этап заключается в формальном выделении памяти для переменных класса и установке начального значения переменных класса, а память, используемая этими переменными, будет выделена в области методов. как:

public static int value =123;

Начальное значение переменной value после этапа подготовки равно 0 вместо 123.

Разобрать

Фаза синтаксического анализа — это виртуальная машина для замены ссылки на символ в пуле констант на прямую ссылку.

Например, класс COM.user ссылается на класс com.tool.При компиляции класс User не знает фактического адреса памяти класса Tool, поэтому он может быть представлен только символическим com.tool. Когда класс загружается с классом User, фактический адрес памяти класса Tool может быть получен через виртуальную машину, поэтому символ COM.TOOL может быть заменен фактическим адресом памяти класса Tool, т.е. прямо упоминается.

Действие синтаксического анализа в основном относится к классу или интерфейсу, полю, методу класса, методу интерфейса, типу метода, дескриптору метода и квалификатору сайта вызова. 7 типов ссылок на символы.

инициализация

На этапе инициализации фактически выполняется байт-код Java, определенный в классе. На этом этапе переменные класса и другие ресурсы инициализируются в соответствии с субъективным планом, составленным программистом через программу.

создать объект

Как виртуальная машина Java выполняет байт-код? Давайте сначала рассмотрим создание объектов во время выполнения.

Java — это объектно-ориентированный язык программирования, и работа программы основана на объекте как вызывающей единице.

  • После загрузки файла байт-кода в область методов виртуальной машины соответствующая информация об объекте создается через файл байт-кода класса в процессе выполнения программы. .
  • Существуют способы создания объектов: новое ключевое слово, отражение и т. д.
  • Память кучи Java — это область, совместно используемая потоками, и информация о созданных объектах хранится в памяти кучи Java.

вызов метода

Вызывающей единицей JVM является объект, но фактическим функциональным кодом по-прежнему является метод объекта.

Во время выполнения процесса всякий раз, когда вызов входит в метод Java, виртуальная машина Java создает кадр стека в стеке методов Java текущего потока для хранения локальных переменных и операндов байт-кода. Память стека методов является частной для потока, и каждый поток имеет свой собственный стек методов. Если соответствующий метод является собственным методом, соответствующий метод является стеком собственных методов.

Область данных среды выполнения Java выглядит следующим образом:

объяснять

Когда вызывается метод объекта Java, исполнительный механизм JVM преобразует файл байт-кода метода в машинный код, который может быть распознан компьютером, и информация о машинном коде сохраняется в области метода. Существует два типа трансляции: интерпретируемое выполнение и своевременная компиляция.

Разница между двумя методами перевода заключается в следующем:
объяснить исполнение

Подойдите к строке кода, объясните строку, большая часть кода, который обычно не используется, написана таким образом.

даже компилировать

Для некоторых горячих кодов все байт-коды, содержащиеся в методе, преобразуются в машинные инструкции для повышения эффективности работы виртуальной машины Java.

Своевременная компиляция построена на классическомПравило двадцати восьми, то есть 20% кода занимают 80% вычислительных ресурсов.

выполнить инструкцию

  • После загрузки Java-программы в память инструкции также находятся в памяти.
  • Регистр инструкций IP указывает на адрес следующей выполняемой инструкции.
  • Блок управления ЦП загружает инструкции из основной памяти в регистр инструкций в соответствии с направлением регистра IP.Эти загруженные инструкции представляют собой строку двоичных кодов, для декодирования которых также требуется декодер.
  • После декодирования, если необходимо получить операнд, данные извлекаются из памяти и вызывается операционный блок для вычисления.

Многопоточное переключение контекста

После включения ЦП он снова и снова будет извлекать, декодировать и выполнять инструкции из памяти.

  • Для поддержки многозадачности ЦП делит ресурс времени выполнения на временные интервалы, и каждая программа выполняется в течение определенного периода времени.
  • Многопоточность виртуальной машины java реализуется путем переключения потоков и распределения времени выполнения обработки, в каждый момент времени процессор (для многоядерного процессора — ядро) будет выполнять только время выполнения одна программа.инструкция.
  • Предполагая, что текущий поток выполняется и время, выделенное ЦП, было выполнено, вы должны сохранить информацию о результате выполнения, иначе предыдущая работа будет потрачена впустую.Поэтому отражается функция счетчика программ (регистр ПК) , это небольшой кусок пространства памяти потока, приватный для потока, который можно рассматривать как индикатор номера строки байт-кода, выполняемого текущим потоком. Когда ЦП выделяет время для повторного запуска, данные могут быть восстановлены, а затем выполнение может быть продолжено с того места, где оно было выполнено в последний раз.

Ссылка и спасибо

Личный публичный аккаунт

  • Если вы считаете, что это хорошо написано, пожалуйста, поставьте лайк + подпишитесь, спасибо~
  • Если что-то не так, укажите на это, большое спасибо.
  • В то же время, я очень жду, что мои друзья обратят внимание на мой официальный аккаунт, и позже я постепенно представлю более качественные галантерейные товары~ хи хи