Различия между JDK, JRE и JVM
JAVA DEVELOPMENT KIT
Java Development Kit (JDK) — это среда разработки программного обеспечения, используемая для разработки приложений и апплетов Java. Он включает в себя среду выполнения Java (JRE), интерпретатор / загрузчик (Java), компилятор (javac), архиватор (jar), генератор документации (Javadoc) и другие инструменты, необходимые для разработки Java.
JAVA RUNTIME ENVIRONMENT
Разница между JDK, JRE и JVM
Чтобы понять разницу между этими тремя, давайте рассмотрим следующую диаграмму.
Примечание: JDK используется только разработчиками Java.
Как работает JRE и JDK?
Из чего состоит JRE?
JRE состоит из следующих компонентов:
Загрузчик классов загружает все необходимые классы, необходимые для выполнения программы. Он обеспечивает безопасность, отделяя пространства имен локальной файловой системы от импортированной через сеть. Эти файлы загружаются либо с жесткого диска, сети или из других источников.
JVM пропускает код с помощью Byte Code Verifier, который проверяет формат и проверяет наличие недопустимого кода. Например, незаконный код — это код, который нарушает права доступа к объектам или нарушает реализацию указателей.
Верификатор байт-кода гарантирует, что код соответствует спецификации JVM и не нарушает целостность системы.
Во время выполнения Байт-код загружается, проверяется и запускается интерпретатором. Переводчик имеет следующие две функции:
Обе операции могут быть показаны как: 
Чтобы понять взаимодействие между JDK и JRE, рассмотрите следующую диаграмму.
Как работает JVM?
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
68) JDK против JRE против JVM
Что такое JDK?
JDK — это среда разработки программного обеспечения, используемая для создания апплетов и приложений Java. Полная форма JDK — Java Development Kit. Разработчики Java могут использовать его в Windows, macOS, Solaris и Linux. JDK помогает им кодировать и запускать программы на Java. На одном компьютере можно установить более одной версии JDK.
В этом уроке вы узнаете:
Что такое JRE?
JRE — это часть программного обеспечения, предназначенная для запуска другого программного обеспечения. Он содержит библиотеки классов, класс загрузчика и JVM. Проще говоря, если вы хотите запустить Java-программу, вам нужна JRE. Если вы не программист, вам не нужно устанавливать JDK, а просто JRE для запуска программ на Java. Тем не менее, все версии JDK поставляются в комплекте с Java Runtime Environment, поэтому вам не нужно загружать и устанавливать JRE отдельно на вашем ПК. Полная форма JRE — Java Runtime Environment.
Что такое JVM?
JVM — это механизм, обеспечивающий среду выполнения для управления Java-кодом или приложениями. Он преобразует байт-код Java в машинный язык. JVM является частью Java Run Environment (JRE). Его нельзя отдельно загрузить и установить. Чтобы установить JVM, вам нужно установить JRE. Полная форма JVM — виртуальная машина Java.
Во многих других языках программирования компилятор создает машинный код для конкретной системы. Однако компилятор Java создает код для виртуальной машины, которая называется JVM.
Зачем использовать JDK?
Вот важные причины использования JDK:
Зачем использовать JRE?
Вот важные причины использования JRE:
Why JVM?
Here are the important reasons of using JVM:
Features of JDK
Here are the important features of JDK:
Features of JRE
Here are the important features of JRE:
Features of JVM
Here are the important features of JVM:
How JDK Functions?
Here are the important components of JDK:
Как функционирует JRE?

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

Вот важные компоненты JVM:
1) Класс Loader
Загрузчик классов — это подсистема, используемая для загрузки файлов классов. Он выполняет три основные функции, а именно. Загрузка, связывание и инициализация.
2) Область метода
Область методов JVM хранит структуру класса, такую как метаданные, код для методов Java и постоянный пул времени выполнения.
3) куча
Все объекты, массивы и переменные экземпляра хранятся в куче. Эта память распределяется между несколькими потоками.
4) Языковые стеки JVM
Стеки языка Java хранят локальные переменные и их частичные результаты. Каждый поток имеет свой собственный языковой стек JVM, создаваемый одновременно с созданием потока. Новый кадр создается при вызове метода и удаляется по завершении процесса вызова метода.
5) ПК Регистры
Регистры ПК хранят адрес инструкции виртуальной машины Java, которая в данный момент выполняется. В Java каждый поток имеет свой отдельный регистр ПК.
6) Стеки родного метода
Стеки нативных методов содержат инструкцию нативного кода, зависит от нативной библиотеки. Он распределяет память по собственным кучам или использует любой тип стека.
7) Исполнение двигателя
Это тип программного обеспечения, который используется для тестирования программного обеспечения, оборудования или комплектных систем. Механизм выполнения теста никогда не несет никакой информации о тестируемом продукте.
8) интерфейс родного метода
Интерфейс Native Method представляет собой среду программирования. Он позволяет коду Java, который выполняется в JVM, вызываться библиотеками и собственными приложениями.
9) Библиотеки нативных методов
Собственные библиотеки — это коллекция Собственных библиотек (C, C ++), которые необходимы для механизма исполнения.
Разница между JDK, JRE и JVM
Вот основные различия между JDK против JRE и JVM:
JVM vs. JRE vs. JDK: What’s the Difference?
30 June 2021 6 min read
IBM Cloud Education, IBM Cloud Education
How do JVM, JRE and JDK relate and work together in the Java development process?
Java is one of the most popular programming languages used in developing environments today. It is primarily used for back-end development projects, game development and desktop and mobile computing. Read on and find out how Java Virtual Machine (JVM), Java Runtime Environment (JRE) and Java Development Kit (JDK) each play a role in the Java development process, their relationship to each other and the differences that set them apart.
What is Java Virtual Machine (JVM)?
Java Virtual Machine, or JVM, loads, verifies and executes Java bytecode. It is known as the interpreter or the core of Java programming language because it executes Java programming.
The role of JVM in Java
JVM is specifically responsible for converting bytecode to machine-specific code and is necessary in both JDK and JRE. It is also platform-dependent and performs many functions, including memory management and security. In addition, JVM can run programs written in other programming languages that have been translated to Java bytecode.
Java Native Interface (JNI) is often referred to in connection with JVM. JNI is a programming framework that enables Java code running in JVM to communicate with (i.e., to call and be called by) applications associated with a piece of hardware and specific operating system platform. These applications are called native applications and can often be written in other languages. Native methods are used to move native code written in other languages into a Java application.
JVM components
JVM consists of three main components or subsystems:
What is Java Runtime Environment (JRE)?
Java Runtime Environment, or JRE, is a set of software tools responsible for execution of the Java program or application on your system.
JRE uses heap space for dynamic memory allocation for Java objects. JRE is also used in JDB (Java Debugging).
The role of JRE in Java
If a programmer would like to execute a Java program using the Java command, they should install JRE. If they are only installing (and not developing or compiling code), then only JRE is needed.
JRE components
Besides the Java Virtual Machine, JRE is composed of a variety of other supporting software tools and features to get the most out of your Java applications.
What is Java Development Kit (JDK)?
Java Development Kit, or JDK, is a software development kit often called a superset of JRE. It is the foundational component that enables Java application and Java applet development. It is platform-specific, so separate installers are needed for each operating system (e.g., Mac, Unix and Windows).
The role of JDK in Java
JDK contains all the tools required to compile, debug and run a program developed using the Java platform. (It’s worth noting that Java programs can also be run using command line.)
JDK components
JDK includes all the Java tools, executables and binaries needed to run Java programs. This includes JRE, a compiler, a debugger, an archiver and other tools that are used in Java development.
Java SE vs. Java EE
Java is synonymous with Java Standard Edition (Java SE) or Core Java. All three euphemisms refer to the basic Java specification that includes the act of defining types and objects. Java EE, on the other hand, provides APIs and is typically used to run larger applications. The content of this blog focuses on Java SE.
How JVM, JRE and JDK work together
Let’s first look at how the three core components of Java work together, and then we can examine the differences. The diagram below provides an image of how JVM, JRE and JDK fit together in the Java landscape.
If you envision a baseball sliced open, it contains three main components: the round cushioned core, the wool and cotton midsection and the cowhide exterior. A ball without all three of these layers will not perform its intended function. Much like the three basic parts of a baseball, JVM, JRE and JDK all have very specific functions. Without all three, Java will not operate successfully.
JDK vs. JRE vs. JVM: Key differences
And now, for the differences:
Complementary technologies
There are many complementary technologies that can be used to enhance JVM, JRE or JDK. The following technologies are among the most frequently used:
JVM and container technology
Java Virtual Machine (JVM) is used to create — you guessed it — virtual machines (VMs). VMs are servers that allow multiple applications to run on the same underlying physical hardware without impacting one another. This provides better use of resources and makes it much easier and cost-effective to scale than traditional infrastructure. VMs are also easily disposable because of their independence. When you no longer need the application, you simply take the VM down.
Containers take this abstraction to the next level and virtualize the OS kernel. The absence of the OS renders containers even more lightweight, fast and flexible than VMs.
Java, JVM, JDK, JDK and IBM
For many organizations, Java continues to be a vital part of application development and provides a solid foundation when creating portable and scalable solutions. It can also serve a key role in modernizing applications on the journey to cloud.
Take the next step by explore OpenJDK and IBM Runtimes for Business, which provides reliable and cost-effective commercial support for implementing, monitoring and managing Java applications.
Get started with an IBM Cloud account today.
Руководство по возможностям Java версий 8-14
Здесь есть все, что вам нужно знать о различных версиях и функциях Java.
Java 8, Java 11, Java 13, Java 14 — какая разница?
Вы можете использовать это руководство, чтобы получить практическую информацию о том, как найти и установить последнюю версию Java, понять различия между дистрибутивами Java (AdoptOpenJdk, OpenJDK, OracleJDK и т.д.), А также получить обзор возможностей языка Java, включая версии Java 8-14.
Примечание переводчика
17 февраля был опубликован перевод Руководство по версиям и возможностям Java
В комментарии к нему Julegg написал
Там у Марко уже описание java-14 добавилось. Будет ли тут перевод добавлен?
Вашему вниманию предлагается обновленная версия руководства от 09 апреля 2020 г.
Практическая информация
Во-первых, давайте взглянем на некоторые общие практические вопросы, которые возникают у людей при попытке выбрать правильную версию Java для своего проекта.
TL;DR Я только хочу скачать ссылку и знаю обо всем остальном. Куда мне следует идти?
Перейдите на сайт AdoptOpenJDK, выберите последнюю версию Java, загрузите и установите ее. Затем вернитесь к этому руководству, чтобы, возможно, еще кое-что узнать о версиях Java.
TL;DR (англ. too long; didn’t read — слишком длинно, не читал)
Какая последняя версия Java?
По состоянию на март 2020 года Java 14 является последней выпущенной версией Java.
Какую версию Java я должен использовать?
Новые версии Java теперь выходят каждые 6 месяцев. Следовательно, Java 15 запланирована на сентябрь 2020 года, Java 16 на март 2021 года и так далее. В прошлом циклы выпуска Java были намного длиннее, до 3-5 лет. Этот график демонстрирует это:
С появлением такого количества новых версий в действительности имеются следующие основные сценарии использования:
Почему компании все еще застряли на Java 8?
Существует множество разных причин, по которым компании все еще придерживаются Java 8. Вот некоторые из них:
Подводя итог, у вас есть сочетание практических вопросов (обновление ваших инструментов, библиотек, фреймворков) и политических проблем.
Почему некоторые версии Java называются 1.X?
Это просто означает Java 8. С переходом к основанным на времени выпускам с Java 9 также изменилась схема именования, и версии Java больше не имеют префикса 1.x. Теперь номер версии выглядит так:
В чем разница между версиями Java?
Должен ли я изучать конкретную?
Придя из других языков программирования с большими перерывами между выпусками, как, например, Python 2–3, вы можете спросить, применимо ли это к Java.
Java особенная в этом отношении, поскольку она чрезвычайно обратно совместима. Это означает, что ваша программа на Java 5 или 8 гарантированно будет работать с виртуальной машиной Java 8-14 — с некоторыми исключениями, о которых вам сейчас не нужно беспокоиться.
Очевидно, что это не работает наоборот, скажем, ваша программа использует функции Java 14, которые просто недоступны в Java 8 JVM.
Это означает несколько вещей:
Каковы примеры этих новых возможностей новых версий Java?
Взгляните на раздел «Возможности Java 8-14» ниже.
Но, как правило: старые, более длинные циклы выпуска (3-5 лет, вплоть до Java 8) означали множество новых функций в каждом выпуске.
Шестимесячный цикл выпуска означает меньшее количество функций на выпуск, поэтому вы можете быстро освоить языковые функции Java 9-14.
В чем разница между JRE и JDK?
До сих пор мы говорили только о Java. Но что именно означает «Java»?
Во-первых, вам нужно провести различие между JRE (Java Runtime Environment) и JDK (Java Development Kit).
Исторически, вы загружали только JRE, если вас интересовали только программы Java. JRE включает, помимо прочего, виртуальную машину Java (JVM) и инструмент командной строки «java».
Для разработки новых программ на Java вам нужно было загрузить JDK. JDK включает в себя все, что есть в JRE, а также компилятор javac и несколько других инструментов, таких как javadoc (генератор документации Java) и jdb (отладчик Java).
Теперь, почему я говорю в прошедшем времени?
Вплоть до Java 8 веб-сайт Oracle предлагал JRE и JDK в качестве отдельных загрузок, хотя JDK также всегда включал JRE в отдельной папке. В Java 9 это различие практически исчезло, и вы всегда загружаете JDK. Структура каталогов JDK также изменилась, так как в ней больше не было явной папки JRE.
Таким образом, хотя некоторые дистрибутивы (см. Раздел «Дистрибутивы Java») по-прежнему предлагают отдельную загрузку JRE, похоже, существует тенденция предлагать только JDK. Следовательно, теперь мы будем использовать Java и JDK взаимозаменяемо.
Как мне установить Java или JDK?
Поэтому все, что вам нужно сделать, чтобы установить Java на свой компьютер, — это разархивировать файл jdk-<5-14>.zip. Вам даже не нужны права администратора для этого.
Ваш распакованный файл Java будет выглядеть так:
Магия происходит в каталоге /bin, который в Windows выглядит следующим образом:
Поэтому все, что вам нужно сделать, это разархивировать этот файл и поместить каталог /bin в переменную PATH, чтобы вы могли вызывать команду java из любого места.
В случае, если вам интересно, установщики с графическим интерфейсом, такие как Oracle или AdoptOpenJDK, выполняет распаковку и изменение переменной PATH вместо вас.
Дистрибутивы Java
Существует множество сайтов, предлагающих загрузку Java (читай: JDK), и неясно, «кто что предлагает и с каким лицензированием». Этот раздел проливает свет на это.
Проект OpenJDK
С точки зрения исходного кода Java (читай: исходный код вашего JRE / JDK) есть только один — на сайте проекта OpenJDK.
Вот почему на практике есть несколько поставщиков, которые фактически создают эти сборки, сертифицируют (см. TCK) и затем распространяют их.
И хотя поставщики не могут, скажем, удалить метод из класса String перед созданием новой сборки Java, они могут добавить брэндинг (вay!) или добавить некоторые другие утилиты (например, CLI), которые они считают полезными. Но в остальном исходный код одинаков для всех дистрибутивов Java.
Сборки OpenJDK (от Oracle) и OracleJDK
Один из поставщиков, который создает Java из исходного кода, — это Oracle. Это приводит к двум разным дистрибутивам Java, что поначалу может казаться очень запутанными.
Исторически (до Java 8) существовали реальные исходные различия между сборками OpenJDK и сборками OracleJDK, при этом можно было сказать, что OracleJDK был «лучше». Но на сегодняшний день обе версии практически одинаковы, с небольшими отличиями.
Впрочем все сводится к тому, требуется ли вам коммерческая поддержка (номер телефона) для используемой версии Java.
AdoptOpenJDK
В 2017 году группа участников, разработчиков и поставщиков Java User Group (Amazon, Microsoft, Pivotal, Red Hat и другие) создала сообщество под названием AdoptOpenJDK.
Они предоставляют бесплатные надежные сборки OpenJDK с более длительной доступностью / обновлениями и даже предлагают вам выбор из двух разных виртуальных машин Java: HotSpot и OpenJ9.
Я очень рекомендую ее, если вы хотите установить Java.
Azul Zulu, Amazon Corretto, SAPMachine
Полный список сборок OpenJDK вы найдете на сайте OpenJDK Wikipedia. Среди них Azul Zulu, Amazon Corretto, а также SapMachine и многие другие. Упрощенно говоря, различия сводятся к тому, что у вас есть различные варианты поддержки/ гарантии обслуживания.
Но не забудьте проверить на сайтах дистрибьюторов, чтобы узнать о преимуществах каждого отдельного дистрибутива.
Полный обзор дистрибутива OpenJDK
Рафаэль Винтерхальтер (Rafael Winterhalter) собрал большой список всех доступных сборок OpenJDK, включая их описания: ОС, архитектуру, окна лицензирования, поддержки и обслуживания.
Рекомендация
Повторим с еще раз, что с 2019 года, если у вас нет особых требований, найдите файл jdk.zip (.tar.gz/.msi/.pkg) по адресу https://adoptopenjdk.net или выберите пакет, предоставленный вашим поставщиком ОС.
Возможности Java 8-14
Как уже упоминалось в самом начале этого руководства: в сущности все (если вы не будьте слишком требовательны) функции языка Java 8 работают в Java 14. То же самое касается всех других версий Java между ними.
В свою очередь, это означает, что знание всех языковых возможностей Java 8 создает хорошую базу в изучении Java, а все остальные версии (Java 9-14) в значительной степени дают дополнительные функции поверх этого базового уровня.
Вот краткий обзор того, что конкретные версии могут предложить:
Java 8 была массовым выпуском, и вы можете найти список всех функций на веб-сайте Oracle. Здесь я хотел бы упомянуть два основных набора функций:
Особенности языка: лямбды и т.д.
До Java 8 всякий раз, когда вы хотели создать экземпляр, например, нового Runnable, вы должны были написать анонимный внутренний класс, например, так:
С лямбдами тот же код выглядит так:
Вы также получили ссылки на методы, повторяющиеся аннотации, методы по умолчанию для интерфейсов и некоторые другие языковые функции.
Коллекции и потоки
В Java 8 вы также получили операции в функциональном стиле для коллекций, также известные как Stream API. Живой пример:
До Java 8, вам нужно было написать циклы for, чтобы что-то сделать с этим списком.
С помощью API Streams вы можете сделать следующее:
Если вы хотите больше практики на Java 8
Очевидно, что в рамках этого руководства я могу только дать краткий обзор каждого недавно добавленного Stream, Lambda или Optional метода в Java 8. Если вам нужен более детальный, подробный обзор — включая упражнения — вы можете взглянуть на мой курс по основным функциям Java 8.
Java 9 также была довольно большой версией, с несколькими дополнениями:
Коллекции
Коллекции получили несколько новых вспомогательных методов для простого создания списков, наборов и карт.
Streams
Потоки получили несколько дополнений, в виде методов takeWhile, dropWhile и iterate.
Optionals
Optionals получили метод ifPresentOrElse, которого крайне не хватало.
Интерфейсы
Интерфейсы получили private методы:
Другие возможности языка
И пара других улучшений, таких как улучшенный оператор try-with-resources или расширения diamond оператора.
JShell
Наконец, в Java появилась оболочка, в которой вы можете попробовать простые команды и получить немедленные результаты.
HTTPClient
Java 9 принес первоначальную предварительную версию нового HttpClient. До этого встроенная поддержка Http в Java была довольно низкоуровневой, и вам приходилось использовать сторонние библиотеки, такие как Apache HttpClient или OkHttp (кстати, отличные библиотеки).
В Java 9 у Java появился собственный современный клиент — хотя он находится в режиме превью, что означает, что он может быть изменен в более поздних версиях Java.
Проект Jigsaw: модули Java и файлы Jar с несколькими выпусками
Java 9 получила Jigsaw Module System, которая чем-то напоминает старую добрую спецификацию OSGI. Целью данного руководства не является подробное описание Jigsaw — посмотрите предыдущие ссылки, чтобы узнать больше.
В Java 10 было несколько изменений, таких как сборка мусора и т.д. Но единственное реальное изменение, которое вы, как разработчик, вероятно, заметите, — это введение ключевого слова var, также называемого выводом типа локальной переменной.
Вывод типа локальной переменной: ключевое слово var
Чувствуете себя как в Javascript-е, не так ли? Однако Java все еще строго типизирован и var применяется только к переменным внутри методов (спасибо, dpash, за то, что снова указал на это).
Java 11 также была несколько меньшей версией с точки зрения разработчика.
Строки и файлы
Строки и файлы получили несколько новых методов (не все перечислены здесь):
Запустить исходные файлы
Начиная с Java 10, вы можете запускать исходные файлы Java без предварительной компиляции. Шаг к написанию сценариев.
Вывод типа локальной переменной (var) для лямбда-параметров
В заголовке все сказано:
HttpClient
HttpClient из Java 9, но уже в окончательной, а не превью версии.
Другие вкусности
Flight Recorder (Регистратор полетов), сборщик мусора No-Op, Nashorn-Javascript-Engine объявлен deprecated (устаревшим) и т.д.
В Java 12 появилось несколько новых функций и исправлений, но здесь стоит упомянуть только поддержку Unicode 11 и превью нового выражения switch, о котором вы узнаете в следующем разделе.
Вы можете найти полный список возможностей здесь, но, по сути, вы получаете поддержку Unicode 12.1, а также две новые или улучшенные превью функции (могут быть изменены в будущем):
Switch выражение (Preview — предварительная версия)
Switch выражения теперь могут возвращать значение. И вы можете использовать лямбда-стиль синтаксиса для своих выражений, без проблем с ошибками:
Старые операторы switch выглядели так:
В то время как в Java 13 операторы switch могут выглядеть так:
Многострочные строки (превью)
Наконец-то вы можете сделать это на Java:
Java 14 и далее
Switch выражения (стандартное)
Switch выражения, которые были предварительным просмотром в версиях 12 и 13, теперь стандартизированы.
Records (превью)
В настоящее время существуют классы Records (записей), которые помогают облегчить задачу написания большого количества шаблонов с использованием Java. Взгляните на этот класс до Java 14, который содержит только данные, (потенциально) методы получения / установки, equals / hashcode, toString.
Теперь с записями это можно записать так:
Опять же, это функция предварительного просмотра и может быть изменена в будущих версиях.
Полезные исключения NullPointerException
Наконец, NullPointerExceptions точно описывает, какая переменная была null.
Сопоставление с образцом для InstanceOf (превью)
В то время как ранее вы должны были выполнять (cast) ваших объектов внутри instanceof, как здесь:
Теперь вы можете сделать это, более эффективно, удалив cast.
Инструмент упаковки (инкубатор)
Существует инструмент jpackage (инкубатор), который позволяет упаковать ваше Java-приложение в пакеты для конкретной платформы, включая все необходимые зависимости.
Сборщики мусора
Сборщик мусора Concurrent Mark Sweep (CMS) был удален, а добавлен экспериментальный сборщик мусора Z.
Java 15 и далее
Будет рассмотрено здесь, как только их выпустят. Зайдите в ближайшее время!
Заключение
К настоящему времени у вас должен быть довольно хорошее представление о нескольких вещах:
Обратная связь, исправления и ваш вклад всегда приветствуются! Просто оставьте комментарий внизу.
Спасибо за прочтение!
Благодарности
Стивен Колебурн написал фантастическую статью о различных доступных дистрибутивах Java. Спасибо, Стивен!







