Перейти к основному содержимому

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

· 11 мин. чтения

Задача: Медиана двух отсортированных массивов

Даны два отсортированных массива размерами n и m. Найдите медиану слияния этих двух массивов.
Временная сложность решения должна быть O(log(m + n)) ...

ANDROMEDA

1. Обзор

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

2. JVM

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

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

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

Компоненты JVM:

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

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

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

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

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

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

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

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

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

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

Площадь кучи

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

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

Куча памяти состоит из трех частей:

  • Eden Space – это часть пространства Young Generation. Когда мы создаем объект, JVM выделяет память из этого пространства
  • Survivor Space – это тоже часть пространства Young Generation. Пространство выживших содержит существующие объекты, которые пережили второстепенные фазы GC.
  • Tenured Space — это также известное как пространство старого поколения. В нем хранятся долгоживущие объекты. По сути, для объектов «Молодое поколение» устанавливается пороговое значение, и при достижении этого порога эти объекты перемещаются в постоянное пространство.

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

Площадь стека

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

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

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

Память для стека 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 решает, когда вызывать сборщик мусора.

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

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

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

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

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

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

3. JRE

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

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

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

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

3.1. Начальные классы

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

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

Bootstrap ClassLoader загружает эти классы при запуске JVM.

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

Мы можем найти классы расширения в jre/lib/extn/ , который действует как каталог для расширений для платформы 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. ДДК

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

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

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

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

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

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

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

Они включают:

  • javac — читает определения классов и интерфейсов и компилирует их в файлы классов
  • java — запускает Java-приложение
  • javadoc — генерирует HTML-страницы документации API из исходных файлов Java.
  • apt — находит и выполняет обработчики аннотаций на основе аннотаций, присутствующих в наборе указанных исходных файлов.
  • appletviewer — позволяет нам запускать апплеты Java без веб-браузера
  • jar — упаковывает Java-апплеты или приложения в один архив
  • jdb — инструмент отладки командной строки, используемый для поиска и исправления ошибок в приложениях Java.
  • javah — создает заголовочные и исходные файлы C из класса Java.
  • javap — дизассемблирует файлы классов и отображает информацию о полях, конструкторах и методах, присутствующих в файле класса.
  • extcheck — обнаруживает конфликты версий между целевым файлом Java Archive (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 - генерирует классы-заглушки, скелеты и связи для удаленных объектов с использованием протокола удаленных методов Java (JRMP) или протокола Internet Inter-Orb (IIOP).
  • rmiregistry — создает и запускает реестр удаленных объектов
  • rmid – запускает демон системы активации. Это позволяет регистрировать и активировать объекты в виртуальной машине Java.
  • serialver — возвращает UID серийной версии для указанных классов

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

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

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

Точно так же мы могли бы использовать Интернет-протокол InterORB (IIOP).

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

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

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

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

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

  • pack200 — преобразует файл JAR в файл pack200 с помощью сжатия Java gzip .
  • unpack200 — преобразует файл pack200 в файл JAR.

4.7. Подключаемый модуль Java

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

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

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

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

JDK приносит javaws. Мы можем использовать его вместе с Java Web Start.

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

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

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

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

4.10. Инструменты устранения неполадок

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

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

5. Вывод

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

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

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

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

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