«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 GC Tenured Space — это также известно как пространство старого поколения. В нем хранятся долгоживущие объекты. По сути, для объектов «Молодое поколение» устанавливается пороговое значение, и при достижении этого порога эти объекты перемещаются в постоянное пространство.

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

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

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

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

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

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

Регистры ПК

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

Стеки нативных методов

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

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

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

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

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

Интерпретатор

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

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

JIT-компилятор

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

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

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

Garbage Collector

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

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. JDK

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

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

    Средства разработки JRE

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

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

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

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

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

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

4.2. Инструменты безопасности

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    «rmic — создает классы-заглушки, скелеты и привязки для удаленных объектов с использованием протокола Java Remote Method Protocol (JRMP) или протокола Inter-Orb Internet (IIOP) rmiregistry — создает и запускает реестр удаленных объектов rmid — запускает активацию системный демон. Это позволяет регистрировать и активировать объекты в сериализаторе виртуальной машины Java — возвращает 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. Демон и так далее

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

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

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

4.7. Java Plug-in Tool

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

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

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

4.8. Java Web Start Tool

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.

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