Что такое jvm jdk jre
Вопросы по Java на собеседовании (5)
1. JRE, JVM и JDK |
2. Загрузчики классов, динамическая загрузка классов |
3. Области памяти Heap и Stack |
4. Сборщик мусора Garbage Collector |
5. Рефлексия кода, reflection |
6. Определение свойств класса в run-time |
7. Определение интерфейсов и конструкторов класса в режиме run-time |
8. Определение полей класса в режиме run-time |
9. Определение методов класса в режиме run-time |
10. Вызов метода класса в режиме run-time |
1. JRE, JVM и JDK
JRE (Java Runtime Environment) представляет минимальную реализацию виртуальной машины, необходимую для исполнения Java-приложений. JRE состоит из виртуальной машины JVM (Java Virtual Machine) и библиотек Java-классов, но не включает компилятор и средства разработки Java приложений.
2. Загрузчики классов, динамическая загрузка классов
Если в программе создаются пользовательские загрузчики, то они должны быть унаследованы от класса java.lang.ClassLoader.
Статическая и динамическая загрузка класса
Статическая загрузка класса происходит при использовании оператора «new». Динамическая загрузка происходит в режиме «run-time» с помощью статического метода класса Class.forName(className).
Подробное описание загрузчиков класса представлено здесь.
3. Области памяти Heap и Stack
4. Сборщик мусора Garbage Collector
Сборщик мусора имеет несколько алгоритмов очистки памяти. В первую очередь, он может быть вызван, когда объем свободной памяти в области Eden Space становится критичным. В этом случае, Garbage Collector просто переносит объекты, имеющие ссылки, из области Eden Space в область Survivor Space, а объекты без ссылок удаляет. Эта, так называемая minor’ная очистка, выполняется быстро.
Если при очистке мусора памяти в области Survivor Space недостаточно, то долгоживущие объекты переносятся в область Tenured Generation, где они могут хранится до конца работы приложения. Вся остальная куча очищается от мусора.
Следует отметить, что сборщик мусора периодически вызывается виртуальной машиной, а не только тогда, когда не хватает памяти.
Более подробное описание распределения памяти в виртуальной машине JVM и о Garbage Collector’e представлено здесь.
5. Рефлексия кода, reflection
Интерфейс Java Reflection API состоит из классов пакетов java.lang и java.lang.reflect.
6. Определение свойств класса в режиме run-time
В работающем приложении для получения класса используется метод forName (String className) :
Наименование класса, включающего пакет (package), извлекается методом getName() объекта Class :
Для получения значения модификатора класса используется метод getModifiers(). Класс java.lang.reflect.Modifier содержит статические методы, возвращающие логическое значения проверки модификатора класса :
Для получения суперкласса рефлексированного объекта (класса) необходимо использовать метод getSuperclass () :
Поскольку в Java отсутствет множественное наследование, то для получения всех предков следует рекурсивно вызвать метод getSuperclass () в цикле, пока не будет достигнут Object, являющийся родителем всех классов. Object не имеет родителей, поэтому вызов его метода getSuperclass () вернет null.
7. Определение интерфейсов и конструкторов класса в режиме run-time
Для получения в режиме run-time списка интерфейсов, реализующих классом, необходимо получить Class и использовать его метод getInterfaces(). Следующий пример демонстрирует получение списка интерфейсов класса ArrayList :
Чтобы IDE (Eclipse) не предупреждала о необходимости определения типа класса
Class is a raw type. References to generic type Class should be parameterized
в коде используются generic’и. В консоль будут выведены следующие интерфейсы, реализуемые классом ArrayList :
Метод класса getConstructors () позволяет получить массив открытых конструкторов типа java.lang.reflect.Constructor. После этого, можно извлекать информацию о типах параметров конструктора и генерируемых исключениях. Пример :
8. Определение полей класса в режиме run-time
Метод getFields() объекта Class возвращает массив открытых полей типа java.lang.reflect.Field. Эти поля могут быть определены не только в классе, но также и в его родителях (суперклассе), либо интерфейсах, реализованных классом или его родителями. Класс Field позволяет получить имя поля, тип и модификаторы.
Если известно наименование поля, то можно получить о нем информацию с помощью метода getField() объекта Class.
Методы getField() и getFields() возвращают только открытые члены данных класса. Чтобы получить все поля класса необходимо использовать методы getDeclaredField() и getDeclaredFields(). Данные методы работают точно также, как и их аналоги getField() и getFields(), за исключением того, что они возвращают все поля, включая закрытые и защищенные.
Определение значение полей класса
Класс Field содержит специализированные методы для получения значений примитивных типов: getInt(), getFloat(), getByte() и др. Для установки значения поля, используется метод set(). Для примитивных типов имеются методы setInt(), setFloat(), setByte() и др.
9. Определение методов класса в режиме run-time
Метод getMethods() объекта Class возвращает массив открытых методов типа java.lang.reflect.Method. Эти методы могут быть определены не только в классе, но также и в его родителях (суперклассе), либо интерфейсах, реализованных классом или его родителями. Класс Method позволяет получить имя метода, тип возвращаемого им значения, типы параметров метода, модификаторы и генерируемые исключения.
Если известно имя метода и типы его параметров, то можно получить отдельный метод класса :
10. Вызов метода класса в режиме run-time
Допустим, что имеется класс Reflect, включающий два закрытых поля id и name и несколько методов для определения значений этих полей. Нас будут интересовать только метод setData для определения значений и метод toString для печати значений.
Сначала получаем метод класса. Для этого формируем массив типов параметров метода и вызываем getMethod с наименованием метода класса и списком его параметров params. После этого формируем массив новых значение полей класса args и вызываем метод invoke объекта Method с указанием объекта класса и аргументами. В заключение получаем ссылку на метод toString и распечатываем значения.
Различия между 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?
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Java для начинающих. Часть 1 из 4
Данные статьи помогут легко и быстро разобраться в концепциях и программировании на Java.
Даже при нулевых знаниях о программировании на Java трудностей в освоении этих материалов не возникнет. А опытные Java-разработчики смогут освежить свои знания.
JVM, JRE и JDK
Вот так и происходит вся магия: логика (т.е. код) прописывается в java файле, который затем преобразуется в файл класса. Машина его читает и выполняет.
А теперь подробнее:
Выделение памяти
Коротко о том, как происходит выделение памяти со стороны кода в фоновом режиме:
Таблица ниже перечисляет различные типы данных и их диапазоны хранимых значений:
ООП — Инкапсуляция, наследование, полиморфизм и абстракция
Объектно-ориентированное программирование (ООП) — это концепция программирования, основанная на 4 базовых принципах.
1. Инкапсуляция
Инкапсуляция — это объединение данных и функциональных средств в единый компонент. Функциональные средства — это «методы», а данные — это «переменные». Все они объединяются в «класс». Это некая схема или набор инструкций.
Класс — это некий прообраз или прототип, который определяет переменные и методы. Пример:
Класс: Машина Переменные-члены или объекты: цвет, тип, модель и т.д. Методы: остановка, ускорение, предельная скорость.
Объект — это экземпляр класса. В примере выше моя машина будет экземпляром общего класса Машина.
Переменные: локальные, статические и переменные экземпляра. Локальные переменные объявляются в теле метода. Переменные экземпляра объявляются вне метода и являются специфичными для конкретного объекта. Статические переменные инициализируются только один раз при запуске программы. Статические переменные инициализируются первыми, но об этом чуть позже.
Методы— это различные функциональные средства. То есть, не что иное, как набор кода, на который поименно ссылаются или вызывают из любой части программы. Вы передаете несколько значений в метод и он их возвращает.
Пакет— это набор связанных классов. Используется для организации классов в структуру папок, а также для быстрого нахождения и повторного использования этих классов.
2. Абстракция
Абстракция — это выбор данных из большого пула по определенным критериям объекта. Ниже показаны различные модификаторы доступа и то, как они ограничивают данные из класса.
3. Наследование
Наследование — это процедура, при которой один класс приобретает свойства другого. Например, потомок наследует признаки своего родителя.
4. Полиморфизм
Полиморфизм — это концепция ООП, при которой одно имя принимает множество форм, (другое название — перегрузка). Динамический полиморфизм — это механизм, с помощью которого несколько методов определяются одним именем и сигнатурой подкласса или суперкласса (другое название — переопределение).
Загрузка статического и динамического класса
Абстрактный класс и интерфейс
Java Packages
Ниже даны примеры библиотек из пакетов Java которые помогут при написании правильного кода. О них мы еще поговорим.
Java Packages
Конструкторы
Приватный конструктор:
Вопрос: Можно ли синхронизировать конструкторы в Java?
Нет. В Java запрещен многопоточный доступ к конструкторам объекта, поэтому необходимость в синхронизации отсутствует.
Вопрос: Наследуются ли конструкторы? Может ли подкласс вызывать конструктор родительского класса?
Конструкторы не наследуются. При переопределении конструктора суперклассов нарушается инкапсуляция языка. Конструктор родительского класса вызывается ключевым словом super.
Static
Статичный родитель → Статичный потомок → Экземпляр родитель → Конструктор родитель → Экземпляр потомок → Конструктор потомок.
Final, Finalize и Finally
Класс Object
В каждом классе есть суперкласс Object. В нем присутствуют следующие не конечные методы:
Конечные методы суперкласса:
Equals и hashСode
Clone
Не обращайте внимание на оператора try — к нему мы вернемся позже.
Агрегация и композиция
Примитивы и оболочки типов
Класс-оболочка — это класс, объект которого оборачивает или содержит примитивные типы данных. При создании объекта в классе-оболочкепоявляется поле для хранения примитивных типов данных, а также других поддерживающих и операционных методов. Если использовать не сами примитивы, а Object-оболочки для примитивных типов данных, то процесс выполняется медленнее. Дополнительные ресурсы тратятся на создание экземпляра объекта, вызовы методов и т.д. За каждым из этих примитивных типов закреплен свой класс: Byte, Short, Integer, Long, String, Boolean, Float и Double.
Автоупаковка и распаковка
Кастинг
byte → short → int → long → float → double
Разница между JVM, JRE и JDK
Руководство по пониманию разницы между JVM, JRE и JDK в Java.
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 создает область кучи, как только она запускается. Все потоки JVM разделяют эту область. Память для области кучи не обязательно должна быть непрерывной.
Хранит данные в виде кадров, и каждый кадр хранит локальные переменные, частичные результаты и вызовы вложенных методов. JVM создает область стека всякий раз, когда создает новый поток. Эта область является частной для каждого потока.
Каждая запись в стеке называется кадром стека или записью активации. Каждый кадр состоит из трех частей:
Память для стека JVM не обязательно должна быть непрерывной.
Каждый поток JVM имеет отдельный регистр ПК, в котором хранится адрес выполняемой в данный момент инструкции. Если выполняемая в данный момент инструкция является частью собственного метода, то это значение не определено.
Собственные стеки методов
Собственные методы-это те, которые написаны на языках, отличных от Java.
JVM предоставляет возможности для вызова этих собственных методов. Собственные стеки методов также известны как “стеки C”. Они хранят информацию о собственном методе. Всякий раз, когда собственные методы компилируются в машинные коды, они обычно используют собственный стек методов для отслеживания их состояния.
JVM создает эти стеки всякий раз, когда создает новый поток. И, таким образом, потоки JVM не разделяют эту область.
2.3. Механизм выполнения
Механизм выполнения выполняет инструкции, используя информацию, присутствующую в областях памяти. Он состоит из трех частей:
Как только загрузчики классов загружают и проверяют байт-код, интерпретатор выполняет байт-код построчно. Это выполнение довольно медленное. Недостатком интерпретатора является то, что при многократном вызове одного метода каждый раз требуется новая интерпретация.
Однако JVM использует JIT-компилятор, чтобы смягчить этот недостаток.
Компилятор Just-In-Time (JIT)
JIT-компилятор компилирует байт-код часто вызываемых методов в машинный код во время выполнения. Следовательно, он отвечает за оптимизацию программ Java.
JVM автоматически отслеживает, какие методы выполняются. Как только метод становится пригодным для JIT-компиляции, он запланирован для компиляции в машинный код. Этот метод затем известен как горячий метод. Эта компиляция в машинный код происходит в отдельном потоке JVM.
В результате он не прерывает выполнение текущей программы. После компиляции в машинный код он работает быстрее.
Java заботится об управлении памятью с помощью сборки мусора. Это процесс просмотра памяти кучи, определения того, какие объекты используются, а какие нет, и, наконец, удаления неиспользуемых объектов.
2.4. Собственный интерфейс Java
Он действует как интерфейс между кодом Java и собственными библиотеками (C/C++).
Существуют ситуации, в которых Java сама по себе не отвечает потребностям вашего приложения, например, реализация функции, зависящей от платформы.
В этих случаях мы можем использовать JNI, чтобы разрешить вызов кода, запущенного в JVM. И наоборот, он позволяет собственным методам вызывать код, выполняемый в JVM.
2.5. Собственные библиотеки
Это библиотеки, специфичные для платформы, и они содержат реализацию собственных методов.
3. JRE
Среда выполнения Java (JRE) – это набор программных компонентов, используемых для запуска приложений Java.
Основные компоненты JRE включают в себя:
Мы обсуждали JVM в предыдущем разделе. Здесь мы сосредоточимся на основных классах и файлах поддержки.
3.1. Классы начальной загрузки
Мы найдем классы начальной загрузки в разделе jre/lib/|/. Этот путь также известен как путь к классу начальной загрузки. Он включает в себя:
Загрузчик загрузочных классов загружает эти классы при запуске JVM.
3.2. Классы расширения
3.3. Настройки свойств
Платформа Java использует эти параметры свойств для поддержания своей конфигурации. В зависимости от их использования они находятся в разных папках внутри /jre/lib/|/. К ним относятся:
3.4. Другие файлы
Помимо вышеупомянутых файлов и классов, JRE также содержит файлы для других вопросов:
4. JDK
Java Development Kit (JDK) предоставляет среду и инструменты для разработки, компиляции, отладки и выполнения программы Java.
Основные компоненты JDK включают в себя:
Мы обсудили JRE в предыдущем разделе.
Теперь мы сосредоточимся на различных инструментах разработки. Давайте классифицируем эти инструменты в зависимости от их использования:
4.1. Основные инструменты
Эти инструменты закладывают основу JDK и используются для создания и сборки приложений Java. Среди этих инструментов мы можем найти утилиты для компиляции, отладки, архивирования, генерации Javadoc и т. Д.
Они включают в себя:
4.2. Средства обеспечения безопасности
К ним относятся инструменты управления ключами и сертификатами, которые используются для управления хранилищами ключей Java.
Хранилище ключей Java – это контейнер для сертификатов авторизации или сертификатов открытого ключа. Следовательно, он часто используется приложениями на базе Java для шифрования, аутентификации и обслуживания по протоколу HTTPS.
Кроме того, они помогают устанавливать политики безопасности в нашей системе и создавать приложения, которые могут работать в рамках этих политик в рабочей среде. К ним относятся:
Некоторые инструменты безопасности также помогают в управлении билетами Kerberos.
Kerberos-это протокол сетевой аутентификации.
Он работает на основе билетов, чтобы позволить узлам, взаимодействующим по небезопасной сети, безопасно подтверждать свою личность друг другу:
4.3. Инструмент интернационализации
Интернационализация-это процесс разработки приложения таким образом, чтобы оно могло быть адаптировано к различным языкам и регионам без технических изменений.
Для этой цели JDK приносит native2ascii. Этот инструмент преобразует файл с символами, поддерживаемыми JRE, в файлы, закодированные в escape-кодах ASCII или Unicode.
4.4. Инструменты удаленного вызова методов (RMI)
Инструменты RMI обеспечивают удаленную связь между Java-приложениями, тем самым предоставляя возможности для разработки распределенных приложений.
RMI позволяет объекту, работающему в одной JVM, вызывать методы для объекта, работающего в другой JVM. Эти инструменты включают в себя:
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).
Эти инструменты включают в себя:
4.6. Инструменты развертывания Java
Эти инструменты помогают в развертывании приложений и апплетов Java в Интернете. Они включают в себя:
4.7. Инструмент плагина Java
JDK предоставляет нам конвертер html. Кроме того, он используется в сочетании с плагином Java.
С одной стороны, плагин Java устанавливает связь между популярными браузерами и платформой Java. В результате этого соединения апплеты на веб-сайте могут запускаться в браузере.
4.8. Инструмент веб-запуска Java
JDK приносит javaws. Мы можем использовать его в сочетании с веб-запуском Java.
Этот инструмент позволяет нам загружать и запускать Java-приложения одним щелчком мыши из браузера. Следовательно, нет необходимости запускать какой-либо процесс установки.
4.9. Инструменты мониторинга и управления
Это отличные инструменты, которые мы можем использовать для мониторинга производительности JVM и потребления ресурсов. Вот некоторые из них::
4.10. Средства устранения неполадок
Это экспериментальные инструменты, которые мы можем использовать для устранения неполадок :
5. Заключение
В этой статье мы определили, что основное различие между JVM, JRE и JDK заключается в их использовании.
Во-первых, мы описали, как JVM является абстрактной вычислительной машиной, которая фактически выполняет байт-код Java.
Затем мы объяснили, как просто запускать Java-приложения, мы используем JRE.
И, наконец, мы поняли, как разрабатывать Java-приложения, мы используем JDK.
Мы также потратили некоторое время на изучение инструментов и фундаментальных концепций этих компонентов.