Приёмная комиссия 2024

Java Virtual Machine в деталях: как она работает изнутри

Java Virtual Machine в деталях: как она работает изнутри
Содержание

Java Virtual Machine (JVM) — это ключевой элемент экосистемы Java, который обеспечивает выполнение программ на любом устройстве независимо от операционной системы. Понимание внутренней работы JVM важно для разработчиков, стремящихся к максимальной производительности и надежности своих приложений. Как JVM загружает классы, интерпретирует и компилирует байт-код, управляет памятью и выполняет сборку мусора — расскажем в статье.

Подберите программу обучения и начните учиться бесплатно

Оставьте заявку и мы откроем бесплатный доступ к вводной части обучения

Что такое JVM и зачем она нужна

JVM (Java Virtual Machine) — это виртуальная машина, которая выполняет байт-код Java-программ. Она обеспечивает работу программ на разных платформах, то есть позволяет запускать Java-приложения на различных устройствах и операционных системах, где установлена эта программа.

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

Как писал Стив МакКоннел: «Good code is its own best documentation» («Хороший код сам по себе является лучшей документацией»). Это подчёркивает важность роли, которую играет JVM в разработке.

JVM используется в различных сферах, где требуется выполнение Java-программ. Вот несколько примеров:

  • Веб-разработка
    Серверы приложений, такие как Apache Tomcat, JBoss, и WebLogic, используют JVM для запуска Java-сервлетов, JSP и других веб-компонентов.
  • Мобильные приложения
    Android-приложения написаны на Java и исполняются с помощью Dalvik VM или ART (Android Runtime), которые основаны на концепциях JVM.
  • Большие корпоративные системы
    Множество корпоративных приложений и информационных систем написаны на Java и запускаются на JVM для обеспечения кроссплатформенности и надежности.
  • Научные и финансовые приложения
    Java часто используется для создания сложных финансовых и научных приложений, благодаря своей высокой производительности и надежности.
  • Интернет вещей (IoT)
    JVM используется в устройствах интернета вещей для выполнения Java-программ на различных платформах и устройствах с ограниченными ресурсами.

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

Источник: shutterstock.com

Как работает

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

Создадим файл HelloWorld. java с следующим содержимым:

public class HelloWorld {

public static void main (String[] args) {

System.out.println («Hello, World!»);

}

}

Более подробное описание работы программы:

  • Компиляция исходного кода

Программист создаёт исходный код на языке Java. Затем этот код компилируется с помощью компилятора javac, который преобразует его в байт-код (файлы с расширением. class). Байт-код является платформо-независимым и может выполняться на любой системе, где установлена JVM (Java Virtual Machine).

javac HelloWorld. java

После выполнения этой команды в текущем каталоге появится файл HelloWorld. class, который содержит байт-код.

  • Загрузка классов

JVM загружает класс HelloWorld и все его зависимости в память. Процесс загрузки классов включает три этапа: загрузка (loading), проверка (verification), инициализация (initialization).

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

  • Проверка байт-кода

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

  • Интерпретация и JIT-компиляция

На этом этапе виртуальная машина Java (JVM) начинает выполнять байт-код, последовательно интерпретируя его. Чтобы повысить производительность, используется технология JIT (Just-In-Time) компиляции.

JIT-компиляция преобразует часто используемый байт-код в машинный код непосредственно перед выполнением программы. Это позволяет ускорить работу программы, так как машинный код выполняется быстрее, чем байт-код.

  • Управление памятью

JVM управляет памятью с помощью двух основных областей: кучи (heap) и стека (stack). Эти области имеют свои уникальные функции и управляются разными способами для обеспечения эффективного выполнения программ.

Куча (Heap)

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

  1. Младшее поколение (New Generation):
    • Eden Space: Здесь создаются новые объекты. Когда Eden заполняется, выполняется младшая сборка мусора (Minor GC), которая перемещает выжившие объекты в Survivor Space.
    • Survivor Space: Существует два таких пространства (S1 и S2), которые чередуются. Объекты, пережившие несколько сборок мусора в Eden, перемещаются между этими пространствами до тех пор, пока не будут перемещены в старшее поколение.
  2. Старшее поколение (Old Generation):
    • Здесь хранятся объекты, которые существуют долгое время. Старшая сборка мусора (Major GC) или полная сборка мусора (Full GC) выполняется реже, но очищает больше памяти, чем младшая сборка мусора.
  3. Постоянная область (Permanent Generation или Metaspace):
    • Хранит метаданные классов, такие как информация о методах и полях. В современных JVM Permanent Generation заменена на Metaspace, которая использует память напрямую из операционной системы и динамически расширяется по мере необходимости.

Стек (Stack)

Стек используется для хранения состояния вызовов методов и локальных переменных. Каждый поток выполнения имеет свой собственный стек, что обеспечивает независимость потоков. Ключевые аспекты управления памятью в стеке включают:

  1. Фреймы стека (Stack Frames):
    • Каждый вызов метода создает новый фрейм стека, который содержит:
    • Локальные переменные: Переменные, объявленные внутри метода.
    • Операнды стека: Промежуточные данные для вычислений.
    • Ссылки на метод и класс: Информация, необходимая для возврата управления после завершения метода.
  2. Жизненный цикл фреймов стека:
    • Фреймы стека создаются при вызове метода и уничтожаются при его завершении. Это обеспечивает автоматическое управление памятью для локальных переменных, так как память освобождается сразу после выхода из метода.

  • Сборка мусора (Garbage Collection)

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

  1. Serial GC: Простой однопоточный сборщик, подходящий для небольших приложений.
  2. Parallel GC: Использует несколько потоков для выполнения сборки мусора, уменьшая время паузы.
  3. CMS (Concurrent Mark-Sweep) GC: Работает параллельно с потоками приложения, чтобы минимизировать паузы.
  4. G1 (Garbage First) GC: Современный сборщик, который разбивает кучу на регионы и очищает их по мере заполнения, обеспечивая прогнозируемую производительность.

Этапы сборки мусора:

  1. Маркирование (Marking): Сборщик мусора отмечает все живые объекты, начиная с корневых объектов.
  2. Удаление (Deletion): Неотмеченные объекты считаются мусором, и их память освобождается.
  3. Компактирование (Compaction): Живые объекты перемещаются, чтобы предотвратить фрагментацию памяти.
  • Исполнение кода

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

  • Многопоточность и синхронизация

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

  • Завершение программы

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

Какие основные компоненты

  • Class Loader Subsystem (Подсистема загрузки классов):

Загрузка (Loading): Загружает классы в память.

Связывание (Linking): Проверяет, объединяет и подготавливает классы к выполнению.

Инициализация (Initialization): Инициализирует статические переменные и выполняет статические блоки кода.

  • Runtime Data Areas (Области данных времени выполнения):

Method Area (Область методов): Хранит информацию о классах, включая полевые и методные данные, а также байт-код.

Heap (Куча): Область памяти, предназначенная для динамического распределения объектов.

Java Stacks (Java-стеки): Хранят фреймы, локальные переменные и частные данные методов для каждого потока.

PC Registers (Регистры PC): Хранит адрес текущей команды для каждого потока.

Native Method Stack (стек нативных методов): используется для выполнения нативных (написанных не на Java) методов.

  • Execution Engine (Исполнительный механизм):

Interpreter (Интерпретатор): Выполняет байт-код построчно.

JIT Compiler (Компилятор JIT): Компилирует часто исполняемый байт-код в машинный код для улучшения производительности.

Garbage Collector (Сборщик мусора): Автоматически освобождает память, удаляя объекты, которые больше не используются.

  • Java Native Interface (JNI):

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

Java Native Method Libraries (Библиотеки нативных методов Java):

Набор библиотек, содержащих нативные методы, которые можно вызывать из Java-кода с помощью JNI.

Источник: shutterstock.com

Как установить и настроить

  • Загрузите JAVA и JDK (Java Development Kit):

JVM является частью JDK. Перейдите на официальный сайт Oracle (или другой поставщика JDK, например, OpenJDK) и загрузите последнюю версию JDK, соответствующую вашей операционной системе.

  • Установите JDK:

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

  • Настройте переменные среды:

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

Для Windows:

  • Добавьте JAVA_HOME:
    1. Откройте «Панель управления» в поиске Windows, справа сверху включите режим отображения «Мелкие значки», откройте раздел «Система».
    2. Перейдите во вкладку «Дополнительные параметры системы».
    3. Нажмите на «Переменные среды».
    4. Нажмите «Создать» в разделе «Переменные среды пользователя».
    5. Введите JAVA_HOME в поле «Имя переменной».
    6. Введите путь к установленному JDK в поле «Значение переменной», например, C:\Program Files\Java\jdk-16.
  • Обновите PATH:
    1. В разделе «Системные переменные» найдите и выберите переменную Path, затем нажмите «Изменить».
    2. Нажмите «Создать» и добавьте путь к папке bin внутри каталога JDK, например, C:\Program Files\Java\jdk-16\bin.
    3. Нажмите «OK» для сохранения изменений.

Для macOS/Linux:

  • Откройте файл конфигурации оболочки (например, .bash_profile, .bashrc или. zshrc) в текстовом редакторе.
  • Добавьте следующие строки:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-16.jdk/Contents/Home

export PATH=$JAVA_HOME/bin:$PATH

  • Сохраните файл и примените изменения, запустив команду:

source ~/.bash_profile # или `source ~/.bashrc` или `source ~/.zshrc` в зависимости от используемой оболочки

Какие основные функции

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

  • Запуск приложений в облаке или на устройстве:

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

  • Преобразование байт-кода в машино-зависимый код:

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

  • Выполнение базовых функций Java:

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

  • Запуск программ с использованием JRE:

Функционирует совместно с Java Runtime Environment (JRE) — программным обеспечением, которое обеспечивает необходимые библиотеки и файлы для исполнения Java-приложений.

  • Интерпретация байт-кода:

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

  • Настраиваемость под специфические требования:

Вы можете задать минимальный и максимальный объём используемой памяти, а также другие параметры для оптимизации производительности.

  • Платформенная независимость:

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

Источник: shutterstock.com

Типичные ошибки и как их исправить

  • OutOfMemoryError:

Ошибка: Программа исчерпывает доступную память.

Исправление:

  1. Увеличьте размер кучи, используя параметры -Xms и -Xmx для установки начального и максимального размера кучи, например, java -Xms512m -Xmx4g MyApp.
  2. Оптимизируйте использование памяти в коде, избегая утечек памяти и улучшая алгоритмы.
  • StackOverflowError:

Ошибка: Программа исчерпывает размер стека.

Исправление:

  1. Увеличьте размер стека, используя параметр -Xss, например, java -Xss1m MyApp.
  2. Проверьте код на наличие бесконечной рекурсии или слишком глубоких рекурсивных вызовов и оптимизируйте его.
  • ClassNotFoundException:

Ошибка: Программа не может найти указанный класс.

Исправление:

  1. Убедитесь, что все необходимые классы находятся в класспате (classpath).
  2. Проверьте правильность имен классов и путей к ним.
  • NoClassDefFoundError:

Ошибка: Программа не может найти определение класса, который был доступен во время компиляции.

Исправление:

  1. Убедитесь, что все зависимости включены в класспат.
  2. Проверьте, что версии библиотек и классов совпадают с теми, которые использовались при компиляции.
  • UnsupportedClassVersionError:

Ошибка: Программа пытается загрузить класс, скомпилированный для более новой версии JVM.

Исправление:

  1. Обновите JVM до версии, используемой для компиляции классов.
  2. Перекомпилируйте классы с использованием текущей версии JVM.

Главное, что нужно знать

  • Что такое JVM и зачем она нужна

JVM, или Java Virtual Machine, — это виртуальная машина, которая позволяет запускать программы, написанные на языке Java. Она преобразует байт-код Java в машинный код, что даёт возможность запускать Java-приложения на любой платформе с установленной JVM. Это делает программы на Java независимыми от конкретной платформы.

  • Основные компоненты JVM:

JVM (Java Virtual Machine) состоит из нескольких компонентов: подсистемы загрузки классов, областей данных времени выполнения, исполнительного механизма, интерфейса нативных методов (JNI) и библиотек нативных методов. Все эти части работают вместе, чтобы загружать, проверять, интерпретировать и выполнять Java-программы.

  • Функции JVM:
    Основные функции JVM включают загрузку классов, проверку байт-кода, интерпретацию и JIT-компиляцию, управление памятью (включая сборку мусора) и поддержку многопоточности. Она также обеспечивает безопасность выполнения программ и независимость от аппаратного обеспечения и операционной системы.
  • Типичные ошибки и их исправление:

При работе с JVM часто возникают такие ошибки, как OutOfMemoryError («Ошибка нехватки памяти»), StackOverflowError («Ошибка переполнения стека»), ClassNotFoundException («Ошибка отсутствия класса») и NoClassDefFoundError («Ошибка отсутствия определения класса»).

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

Подберите программу обучения и начните учиться бесплатно

Оставьте заявку и мы откроем бесплатный доступ к вводной части обучения

alt

Всё для учебы доступно онлайн

Расписание, зачётку и домашние задания смотрите в приложении
Подберите программу обучения

ответьте на пять вопросов и узнайте, где будете учиться

Образование для карьеры
К каким профессиям вы более склонны?
ТехническимГуманитарнымТворческимМедицинским
Какой у вас уровень образования?
Без образованияШкола 9-11 классКолледжБакалавриатМагистратураАспирантура
Какой формат обучения вам подходит?
ОчноЗаочноОнлайнПо выходным дням
Интересует ли вас кредит на образование по ставке 3% в год?
ДаНет

Мы подобрали для вас программу обучения

Заполните форму, чтобы узнать больше о программе и наших предложениях

Подобрать программу и поступить

Политика конфиденциальности

Ваша конфиденциальность очень важна для нас. Мы хотим, чтобы Ваша работа в Интернет по возможности была максимально приятной и полезной, и Вы совершенно спокойно использовали широчайший спектр информации, инструментов и возможностей, которые предлагает Интернет. Персональные данные, собранные при регистрации (или в любое другое время) преимущественно используется для подготовки Продуктов или Услуг в соответствии с Вашими потребностями. Ваша информация не будет передана или продана третьим сторонам. Однако мы можем частично раскрывать личную информацию в особых случаях, описанных в данной Политике конфиденциальности.

Рамки Политики конфиденциальности

Настоящая Политика конфиденциальности (далее — «Политика») применяется к информации, полученной через данный сайт, иные сайты, виджеты и другие используемые интерактивные средства, на которых есть ссылка на данную Политику (далее — «Сайт») от пользователей Сайта (далее — «Пользователи»).

Нижеследующие правила описывают, как Университет «Синергия» обращается с любой информацией, относящейся к прямо или косвенно определенному или определяемому физическому лицу (субъекту персональных данных) (далее — «Персональные данные»), для целей оказания услуг с использованием Сайта.

Пользователи включают в себя всех физических лиц, которые подключаются к Сайту и используют Сайт.

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

Настоящая Политика конфиденциальности вступает в силу с момента ее размещения на Сайте, если иное не предусмотрено новой редакцией Политики конфиденциальности.

Контролирующие и обрабатывающие лица

Пользователи соглашаются с тем, что:

  • Пользуясь Сайтом, и принимая условия использования, опубликованные на Сайте, пользователь заявляет о своем однозначном согласии с обработкой его Персональных данных способами, описанными в настоящей Политике.
  • Обработка Персональных данных Пользователей осуществляется Оператором персональных данных — Университет «Синергия» (ИНН: 7729152149, ОГРН: 1037700232558).

С какой целью собираются эти данные

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

Сбор Персональных данных

При регистрации на Сайте Пользователи подтверждают свое согласие с условиями настоящей Политики и свое согласие на обработку своих Персональных данных в соответствии с условиями настоящей Политики, кроме того они соглашаются на обработку своих Персональных данных на серверах Университета «Синергия», расположенных на территории Российской Федерации.

Обработка Персональных данных осуществляется не дольше, чем этого требуют цели обработки Персональных данных, изложенные в настоящей Политике (за исключением случаев, предусмотренных законодательством Российской Федерации). Университет «Синергия» может обрабатывать следующие Персональные данные:

  • «Как к Вам обращаться» в форме обратной связи, в случае если посетитель указывает свои полные ФИО или только часть;
  • Электронный адрес;
  • Номер телефона;
  • Также на сайте происходит сбор и обработка обезличенных данных о посетителях (в т. ч. файлов «cookie») с помощью сервисов интернет-статистики (Яндекс Метрика и других).
  • Вышеперечисленные данные далее по тексту Политики объединены общим понятием Персональные данные.

Как эти данные используются

На сайте используются куки (Cookies) и данные о посетителях сервисов (Яндекс Метрика и других). При помощи этих данных собирается информация о действиях посетителей на сайте с целью улучшения его содержания, улучшения функциональных возможностей сайта и, как следствие, создания качественного контента и сервисов для посетителей. Вы можете в любой момент изменить настройки своего браузера так, чтобы браузер блокировал все файлы cookie или оповещал об отправке этих файлов. Учтите при этом, что некоторые функции и сервисы не смогут работать должным образом.

Как эти данные защищаются

Для защиты Вашей личной информации мы используем разнообразные административные, управленческие и технические меры безопасности. Наша Компания придерживается различных международных стандартов контроля, направленных на операции с личной информацией, которые включают определенные меры контроля по защите информации, собранной в Интернет. Наших сотрудников обучают понимать и выполнять эти меры контроля, они ознакомлены с нашим Уведомлением о конфиденциальности, нормами и инструкциями. Тем не менее, несмотря на то, что мы стремимся обезопасить Вашу личную информацию, Вы тоже должны принимать меры, чтобы защитить ее. Мы настоятельно рекомендуем Вам принимать все возможные меры предосторожности во время пребывания в Интернете. Организованные нами услуги и веб-сайты предусматривают меры по защите от утечки, несанкционированного использования и изменения информации, которую мы контролируем. Несмотря на то, что мы делаем все возможное, чтобы обеспечить целостность и безопасность своей сети и систем, мы не можем гарантировать, что наши меры безопасности предотвратят незаконный доступ к этой информации хакеров сторонних организаций.

В случае изменения данной политики конфиденциальности вы сможете прочитать об этих изменениях на этой странице или, в особых случаях, получить уведомление на свой e-mail.

Политика в отношении обработки персональных данных.pdf

В случае изменения данной политики конфиденциальности вы сможете прочитать об этих изменениях на этой странице или, в особых случаях, получить уведомление на свой e-mail.

Jivo

DMCA.com Protection Status