Что такое JRE? Введение в среду выполнения Java

Набор инструментов разработки на Java (JDK), виртуальная машина (JVM) и среда выполнения (JRE) образуют вместе мощную тройку компонентов платформы для разработки и запуска Java-приложений. В этом кратком руководстве вы узнаете о JRE — среде выполнения Java.
Фактически, среда выполнения — это часть программного обеспечения, предназначенная для запуска другого программного обеспечения. Как среда выполнения для Java, JRE содержит библиотеки классов, загрузчик классов и виртуальную машину Java. В этой системе:
  • Загрузчик классов отвечает за правильную загрузку классов и их связь с основными библиотеками классов Java
  • JVM отвечает за обеспечение Java-приложений ресурсами, необходимыми для их запуска и эффективной работы на устройстве или в облачной среде
  • JRE в основном является контейнером для этих компонентов и отвечает за организацию их деятельности
Мы углубимся в то, как эти компоненты работают вместе в следующих разделах.
Что такое среда выполнения?
Для запуска и исполнения программы необходима специальная среда выполнения. Она загружает файлы классов, обеспечивает доступ к памяти и другим системным ресурсам. В прошлом, большинство программ использовали операционную систему (ОС) в качестве среды выполнения. Программы запускались на любом компьютере, но для доступа к ресурсам полагались на параметры ОС. В качестве ресурсов выступали память, программные файлы и зависимости. С появлением среды выполнения Java все изменилось, по крайней мере, для Java-программ.
Среда выполнения Java
Программное обеспечение можно рассматривать как набор слоев, расположенных поверх системного оборудования. Каждый слой предоставляет службы, которые будут использоваться (и запрашиваться) слоями над ним. Среда выполнения Java — это уровень программного обеспечения, работающий поверх ОС и предоставляющий дополнительные службы, специфичные для Java.
JRE сглаживает разнообразие ОС, гарантируя, что программы Java могут работать практически на любой ОС без изменений. Также автоматическое управление памятью — одна из самых важных функций JRE, гарантирующая, что программистам не придется вручную управлять распределением памяти.
Если коротко, то JRE — это мета-OS для Java-программ. Это классический пример абстракции — абстрагирование базовой ОС в согласованную платформу для запуска приложений Java.
Как JRE работает с JVM
Виртуальная машина Java — программное обеспечение, отвечающее за выполнение Java-программ. JRE — это программа, которая берет ваш Java-код, объединяет его с необходимыми библиотеками и запускает JVM для его выполнения.
JRE содержит программное обеспечение и библиотеки, которые требуются для работы вашей программы. Например, загрузчик классов Java является частью JRE. Эта важная часть программного обеспечения загружает скомпилированный Java-код в память и соединяет с соответствующими библиотеками.
В этом многоуровневом представлении JVM создается средой выполнения Java. С точки зрения пакета, JRE содержит JVM, как показано на рисунке:
Установка и использование JRE
Несмотря на концептуальную сторону JRE, в реальной практике — это просто программное обеспечение, установленное на компьютере для запуска Java-программ. Как разработчик вы будете работать с JDK и JVM, т.к. эти компоненты необходимы для разработки и запуска ваших приложений. Как пользователь вы будете использовать JRE для их запуска.
В большинстве случаев компьютеры поставляются с установленной Java, включающей в себя JRE. Если вам когда-либо понадобится установить или обновить JRE вручную, вы можете загрузить актуальную версию JRE с сайта Oracle.
После того, как JRE установлена, вы можете узнать ее версию с помощью командной строки, введя в терминале команду java -version. В POSIX-системах вы всегда можете проверить место установки с помощью which java (работает и в win).
JRE в devops
JRE не очень заметна на стадии разработки, где она просто запускает ваши приложения в ОС или IDE. JRE играет более заметную роль в devops и системном администрировании, потому что тут она используется для мониторинга и конфигурации.
JRE предоставляет инструменты, которые вы можете использовать для настройки и управления характеристиками Java-приложения. Использование памяти является самым ярким примером. Использование памяти наиболее важно в облачных системах, а devops это облачная технология. Если вы работаете в devops-сфере или собираетесь перейти в devops, неплохо было бы разобраться с тем, как работает память в Java и как она контролируется через JRE.
Память и JRE
Память в Java состоит из трех компонентов: куча (Heap space), стек (Stack space) и метапространство (Metaspace):
    • Metaspace: тут Java хранит неизменяемую информацию программы, например классы
    • Heap space: в этой области хранится изменяемый контент
    • Stack space: в стеке хранятся переменные, созданные в методах, и ссылки на переменные
    Управление памятью в Java 8
    До Java 8 metaspace был известен, как permgen. Помимо более крутого имени, metaspace представляет собой значительное изменение в отношении взаимодействия разработчиков с пространством памяти Java. Раньше вы использовали бы команду java -XX: MaxPermSize для контроля размера permgen пространства. Начиная с Java 8, Java автоматически увеличивает размер metaspace, чтобы удовлетворить потребности вашей программы. В 8 версии также появился новый флаг MaxMetaspaceSize, который можно использовать для ограничения размера metaspace.
    Куча, стек и другие параметры памяти в Java 8 остались без изменений.
    Настройка пространства кучи
    Пространство кучи — это наиболее динамическая часть системы памяти в Java. Вы можете использовать флаги -Xms и -Xmx, чтобы задать начальный и максимальный размер кучи. Понимание того, как настроить эти флаги для конкретных программных потребностей, является важным аспектом управления памятью в Java. Необходимо сделать кучу достаточно большой, чтобы обеспечить наиболее эффективную сборку мусора. То есть, вы должны обеспечит достаточно памяти для запуска программы, но чтобы она не была больше, чем необходимо.
    Настройка стека
    В пространстве стека находятся вызовы методов и ссылки на переменные. Пространство стека является источником ошибки: the stack overflow exception. Stack overflow exception указывает на то, что у вас закончилось пространство стека, потому что слишком большая его часть была зарезервирована. Как правило, переполнение стека происходит когда метод или методы обращаются друг к другу зацикленным способом, тем самым выделяя постоянно растущее число вызовов в стек.
    Вы можете использовать -Xss для настройки начального размера стека. Затем стек динамически растет в соответствии с потребностями программы.
    Мониторинг Java-приложения
    Хотя мониторинг приложений является функцией JVM, JRE предоставляет параметры конфигурации, которые являются необходимой базой для мониторинга. Для мониторинга приложений Java доступны различные инструменты, от классических (например Unix команда top) до сложных решений удаленного мониторинга, таких как мониторинг инфраструктуры Oracle.
    Также существуют инструменты с графическим интерфейсом, такие как VisualVM, которые позволяют проверять работающую JVM. Эти инструменты дают возможность отслеживать проблемные места и утечки памяти, а также общее потребление памяти в системе.
    Вывод
    Среда выполнения Java является программой, которая загружает Java-приложения для выполнения на JVM. JRE включен по умолчанию в загружаемый вами Java Development Kit. JRE содержит основные библиотеки Java, загрузчик классов Java и виртуальную машину. Полезно понимать, как взаимодействуют JVM, JDK и JRE, особенно при работе в облачных средах и средах devops. В этих средах JRE занимает более сильную роль, чем в традиционной разработке приложений Java, за счет мониторинга и конфигурации.
    Оцените статью, если она вам понравилась!