Рубрики
Без рубрики

Разница между JVM, JRE и JDK

Руководство по пониманию разницы между JVM, JRE и JDK в Java.

Автор оригинала: baeldung.

1. Обзор

В этой статье мы обсудим различия между JVM, JRE и JDK, рассмотрев их компоненты и использование.

2. СПМ

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

JVM сначала интерпретирует байт-код. Затем он сохраняет информацию о классе в области памяти. Наконец, он выполняет байт-код, сгенерированный компилятором java.

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

Компонентами JVM являются:

  • Погрузчики класса
  • Области данных во время выполнения
  • Механизм выполнения

2.1. Класс Погрузчиков

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

У нас есть подробная статья специально о классовых погрузчиках .

2.2. Области данных во время выполнения

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

Давайте рассмотрим эти области одну за другой:

Область метода

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

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

Площадь кучи

JVM выделяет память для всех экземпляров класса и массивов из этой области.

Сборщик мусора (GC) освобождает память кучи для объектов. В принципе, GC имеет три этапа для восстановления памяти от объектов, а именно. два второстепенных ГК и один крупный ГК.

Память кучи состоит из трех частей:

  • Пространство Эдема – это часть пространства молодого поколения. Когда мы создаем объект, JVM выделяет память из этого пространства
  • Пространство выживших – это также часть пространства молодого поколения. Пространство выживших содержит существующие объекты, которые пережили незначительные фазы GC GC
  • Арендованное пространство – это также известно как пространство старого поколения. В нем хранятся давно уцелевшие предметы. В принципе, для объектов молодого поколения устанавливается порог, и когда этот порог соблюдается, эти объекты перемещаются в арендуемое пространство.

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

Область стека

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

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

  • Массив локальных переменных – содержит все локальные переменные и параметры метода
  • Стек операндов – используется в качестве рабочей области для хранения результатов промежуточных вычислений
  • Данные фрейма – используются для хранения частичных результатов, возвращаемых значений для методов и ссылки на таблицу Exception , которая предоставляет соответствующую информацию о блоке catch в случае исключений

Память для стека JVM не обязательно должна быть непрерывной.

Регистры ПК

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

Собственные стеки методов

Собственные методы-это те, которые написаны на языках, отличных от Java.

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

JVM создает эти стеки всякий раз, когда создает новый поток. И, таким образом, потоки JVM не разделяют эту область.

2.3. Механизм выполнения

Механизм выполнения выполняет инструкции, используя информацию, присутствующую в областях памяти. Он состоит из трех частей:

Переводчик

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

Однако JVM использует JIT-компилятор, чтобы смягчить этот недостаток.

Компилятор Just-In-Time (JIT)

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

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

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

Сборщик мусора

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

GC-это поток демона. Он может быть вызван явно с помощью System. метод gc () , однако, он не будет выполнен немедленно, и JVM решает, когда вызывать GC.

2.4. Собственный интерфейс Java

Он действует как интерфейс между кодом Java и собственными библиотеками (C/C++).

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

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

2.5. Собственные библиотеки

Это библиотеки, специфичные для платформы, и они содержат реализацию собственных методов.

3. JRE

Среда выполнения Java (JRE) – это набор программных компонентов, используемых для запуска приложений Java.

Основные компоненты JRE включают в себя:

  • Реализация виртуальной машины Java (JVM)
  • Классы, необходимые для запуска программ Java
  • Файлы свойств

Мы обсуждали JVM в предыдущем разделе. Здесь мы сосредоточимся на основных классах и файлах поддержки.

3.1. Классы начальной загрузки

Мы найдем классы начальной загрузки в разделе jre/lib/|/. Этот путь также известен как путь к классу начальной загрузки. Он включает в себя:

  • Классы времени выполнения в rt.jar
  • Классы интернационализации в i18n.jar
  • Классы преобразования символов в charsets.jar
  • Другие

Загрузчик загрузочных классов загружает эти классы при запуске JVM.

3.2. Классы расширения

Мы можем найти классы расширений в jre/lib/ext/ , который действует как каталог для расширений платформы Java. Этот путь также известен как путь к классу расширения.

Он содержит библиотеки времени выполнения JavaFX в jfxrt.jar и данные локали для java.text и java.util пакетов в localedata.jar . Пользователи также могут добавлять пользовательские банки в этот каталог.

3.3. Настройки свойств

Платформа Java использует эти параметры свойств для поддержания своей конфигурации. В зависимости от их использования они находятся в разных папках внутри /jre/lib/|/. К ним относятся:

  • Конфигурации календаря в calendar.properties
  • Конфигурации ведения журнала в logging.properties
  • Сетевые конфигурации в net.properties
  • Свойства развертывания в /jre/lib/deploy/
  • Свойства управления в /jre/lib/management/

3.4. Другие файлы

Помимо вышеупомянутых файлов и классов, JRE также содержит файлы для других вопросов:

  • Управление безопасностью в jre/lib/security
  • Каталог для размещения классов поддержки апплетов в jre/lib/applet
  • Файлы, связанные с шрифтами, находятся в jre/lib/fonts и другие

4. JDK

Java Development Kit (JDK) предоставляет среду и инструменты для разработки, компиляции, отладки и выполнения программы Java.

Основные компоненты JDK включают в себя:

  • JRE
  • Инструменты разработки

Мы обсудили JRE в предыдущем разделе.

Теперь мы сосредоточимся на различных инструментах разработки. Давайте классифицируем эти инструменты в зависимости от их использования:

4.1. Основные инструменты

Эти инструменты закладывают основу JDK и используются для создания и сборки приложений Java. Среди этих инструментов мы можем найти утилиты для компиляции, отладки, архивирования, генерации Javadoc и т. Д.

Они включают в себя:

  • javac – считывает определения классов и интерфейсов и компилирует их в файлы классов
  • java – запускает приложение Java
  • javadoc – генерирует HTML-страницы документации API из исходных файлов Java
  • apt – находит и выполняет процессоры аннотаций на основе аннотаций, присутствующих в наборе указанных исходных файлов
  • appletviewer – позволяет запускать Java-апплеты без веб – браузера
  • jar – пакеты Java-апплетов или приложений в один архив
  • jdb – инструмент отладки командной строки, используемый для поиска и исправления ошибок в приложениях Java
  • джава – создает заголовочные и исходные файлы C из класса Java
  • javap – разбирает файлы классов и отображает информацию о полях, конструкторах и методах, присутствующих в файле класса
  • extcheck – обнаруживает конфликты версий между целевым файлом архива Java (JAR) и установленными в данный момент файлами расширения JAR

4.2. Средства обеспечения безопасности

К ним относятся инструменты управления ключами и сертификатами, которые используются для управления хранилищами ключей Java.

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

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

  • keytool – помогает в управлении записями хранилища ключей, а именно криптографическими ключами и сертификатами
  • jarsigner – генерирует файлы JAR с цифровой подписью, используя информацию о хранилище ключей
  • policytool – позволяет нам управлять файлами конфигурации внешней политики, которые определяют политику безопасности установки

Некоторые инструменты безопасности также помогают в управлении билетами Kerberos.

Kerberos-это протокол сетевой аутентификации.

Он работает на основе билетов, чтобы позволить узлам, взаимодействующим по небезопасной сети, безопасно подтверждать свою личность друг другу:

  • kinit – используется для получения и кэширования билетов Kerberos-предоставление билетов
  • ktab – управляет именами принципов и парами ключей в таблице ключей
  • klist – отображает записи в локальном кэше учетных данных и таблице ключей

4.3. Инструмент интернационализации

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

Для этой цели JDK приносит native2ascii. Этот инструмент преобразует файл с символами, поддерживаемыми JRE, в файлы, закодированные в escape-кодах ASCII или Unicode.

4.4. Инструменты удаленного вызова методов (RMI)

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

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

  • rmic – генерирует классы stub, skeleton и tie для удаленных объектов с использованием протокола удаленного метода Java (JRMP) или протокола Internet Inter-Orb (IIOP)
  • rmiregistry – создает и запускает реестр удаленных объектов
  • rmid – s запускает демон системы активации. Это позволяет регистрировать и активировать объекты в виртуальной машине Java
  • сериалвер – возвращает UID серийной версии для указанных классов

4.5. Инструменты Java IDL и RMI-IIOP

Язык определения интерфейса Java (IDL) добавляет в платформу Java возможности общей архитектуры брокера запросов на основе объектов (CORBA).

Эти инструменты позволяют распределенным веб – приложениям Java вызывать операции в удаленных сетевых службах с помощью отраслевой стандартной группы управления объектами (OMG) – IDL.

Аналогично, мы могли бы использовать протокол Internet Inter ORB Protocol (IIOP).

RMI-IIOP, т. е. RMI поверх IIOP, позволяет программировать серверы и приложения CORBA через API RMI. Таким образом, обеспечивается соединение между двумя приложениями, написанными на любом языке, совместимом с CORBA, через протокол Internet InterORB (IIOP).

Эти инструменты включают в себя:

  • tnameserv – Служба временных имен, предоставляющая древовидный каталог для ссылок на объекты
  • idlj – компилятор IDL-to-Java для создания привязок Java для указанного файла IDL
  • orbd – разрешить клиентам прозрачно находить и вызывать постоянные объекты на сервере в среде CORBA
  • servertool – предоставляет интерфейс командной строки для регистрации или отмены регистрации постоянного сервера с демоном ORB ( orbd ), запуска и выключения постоянного сервера, зарегистрированного с демоном ORB, и т. Д.

4.6. Инструменты развертывания Java

Эти инструменты помогают в развертывании приложений и апплетов Java в Интернете. Они включают в себя:

  • pack200 – преобразует файл JAR в файл pack200 с помощью Java gzip компрессора
  • unpack200 – преобразует pack200 файл в файл JAR

4.7. Инструмент плагина Java

JDK предоставляет нам конвертер html. Кроме того, он используется в сочетании с плагином Java.

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

С другой стороны, html converter -это утилита для преобразования HTML-страницы, содержащей апплеты, в формат для плагина Java.

4.8. Инструмент веб-запуска Java

JDK приносит javaws. Мы можем использовать его в сочетании с веб-запуском Java.

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

4.9. Инструменты мониторинга и управления

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

  • jconsole – предоставляет графическую консоль, которая позволяет отслеживать приложения Java и управлять ими
  • jps – перечисляет инструментальные JVM в целевой системе
  • jstat – отслеживает статистику JVM
  • jstatd – контролирует создание и завершение инструментальных JVM

4.10. Средства устранения неполадок

Это экспериментальные инструменты, которые мы можем использовать для устранения неполадок :

  • информация – генерирует информацию о конфигурации для указанного процесса Java
  • jmap – печатает карты памяти общих объектов или сведения о памяти кучи указанного процесса
  • jsadebugd – подключается к процессу Java и действует как сервер отладки
  • jstack – выводит трассировки стека Java потоков Java для данного процесса Java

5. Заключение

В этой статье мы определили, что основное различие между JVM, JRE и JDK заключается в их использовании.

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

Затем мы объяснили, как просто запускать Java-приложения, мы используем JRE.

И, наконец, мы поняли, как разрабатывать Java-приложения, мы используем JDK.

Мы также потратили некоторое время на изучение инструментов и фундаментальных концепций этих компонентов.