Виртуальная машина jvm это
Внутренности JVM, Часть 1 — Загрузчик классов
Перевод статьи подготовлен специально для студентов курса «Разработчик Java».
В этой серии статей я расскажу о том, как работает Java Virtual Machine. Сегодня мы рассмотрим механизм загрузки классов в JVM.
Виртуальная машина Java — это сердце экосистемы Java-технологий. Она делает для Java-программ возможность реализации принципа «написано один раз, работает везде» (write once run everywhere). Как и другие виртуальные машины, JVM представляет собой абстрактный компьютер. Основная задача JVM — загружать class-файлы и выполнять содержащийся в них байт-код.
В состав JVM входят различные компоненты, такие как загрузчик классов (Classloader), сборщик мусора (Garbage Collector) (автоматическое управление памятью), интерпретатор, JIT-компилятор, компоненты управления потоками. В этой статье рассмотрим загрузчик классов (Class loader).
Загрузчик классов загружает class-файлы как для вашего приложения, так и для Java API. В виртуальную машину загружаются только те class-файлы Java API, которые действительно требуются при выполнении программы.
Байт-код выполняется подсистемой исполнения (execution engine).
Что такое загрузка классов?
Загрузка классов — это поиск и загрузка типов (классов и интерфейсов) динамически во время выполнения программы. Данные о типах находятся в бинарных class-файлах.
Этапы загрузки классов
Подсистема загрузчика классов отвечает не только за поиск и импорт бинарных данных класса. Она также выполняет проверку правильности импортируемых классов, выделяет и инициализирует память для переменных класса, помогает в разрешении символьных ссылок. Эти действия выполняются в следующем порядке:
Примечание — загрузчик классов, помимо загрузки классов, также отвечает за поиск ресурсов. Ресурс — это некоторые данные (например, “.class” файл, данные конфигурации, изображения), которые идентифицируются с помощью абстрактного пути, разделенного символом «/». Ресурсы обычно упаковываются вместе с приложением или библиотекой для того, чтобы их можно было использовать в коде приложения или библиотеки.
Механизм загрузки классов в Java
Platform class loader — загружает выбранные (на основе безопасности / разрешений) модули Java SE и JDK. Например, java.sql.
Bootstrap class loader — загружает основные модули Java SE и JDK.
Эти три встроенных загрузчика классов работают вместе следующим образом:
Запустив этот код на установленном у меня Amazon Corretto 11.0.3, получим следующий результат:
Подробнее изучить ClassLoader API вы можете здесь (JDK 11).
Архитектура JVM: обзор архитектуры JVM и JVM
Привет читатели! В этом руководстве мы поймем и изучим виртуальную машину Java (JVM) и ее архитектуру. Этот урок поможет вам правильно ответить на следующие вопросы:
1. Введение
Виртуальная машина Java (JVM) — это абстрактная виртуальная машина, которая находится на вашем компьютере и предоставляет среду выполнения для выполнения байт-кода Java. JVM доступна для многих аппаратных и программных платформ, но немногие Java-разработчики знают, что Java Runtime Environment (JRE) — это виртуальная машина Java (JVM). JVM анализирует байт-код, интерпретирует его и выполняет тот же байт-код для отображения выходных данных.
Рис. 1: Обзор виртуальной машины Java
1.1 Что делает JVM?
Виртуальная машина Java выполняет следующие операции:
Рис. 2: компоненты JVM
1.2 Типы виртуальных машин Java
Редакция Java имеет две разные реализации виртуальной машины Java (JVM), т.е.
1.3 Внутренняя архитектура JVM
На схеме показаны ключевые внутренние компоненты виртуальной машины Java, соответствующие спецификации JVM.
Рис. 3: Архитектура виртуальной машины Java
Компоненты, показанные на рис. 3, поясняются ниже.
1.3.1 Класс Loader
1.3.2 Области данных времени выполнения
Эта подсистема разделена на пять основных компонентов, т.е.
Эта область играет важную роль во время вызова метода и возврата.
1.3.3 Механизм исполнения
Этот компонент выполняет байт-код, который назначается областям данных времени выполнения и имеет три основных подкомпонента, а именно:
Java Blog
Как работает JVM
Java-приложения называются WORA (Write Once Run Anywhere, Пиши однажды запускай везде). Это означает, что программист может разрабатывать код Java в одной системе и ожидать, что он будет работать в любой другой системе с поддержкой Java без каких-либо настроек. Это все возможно благодаря JVM.
Подсистема загрузчика классов (Class Loader Subsystem)
В основном подсистема загрузчика классов отвечает за три вида деятельности.
Связывание (Linking): выполняет проверку, подготовку и (необязательно) разрешение.
Инициализация (Initialization): на этом этапе всем статическим переменным присваиваются их значения, определенные в коде и статическом блоке (если есть). Это выполняется сверху вниз в классе и от родителя к потомку в иерархии классов.
В общем, есть три загрузчика классов:
Примечание: JVM следует принципу делегирования-иерархии для загрузки классов. Загрузчик классов системы делегирует запрос на загрузку в загрузчик классов расширения и загрузчик классов расширения делегирует запрос в загрузчик класса начальной загрузки. Если класс найден в пути начальной загрузки, класс загружается, в противном случае запрос снова передается загрузчику классов расширения, а затем загрузчику классов системы. Наконец, если загрузчик классов системы не может загрузить класс, мы получаем исключение java.lang.ClassNotFoundException во время выполнения.
Память JVM
Область метода: в области метода хранится вся информация уровня класса, такая как имя класса, имя непосредственного родительского класса, информация о методах и переменных и т. д., включая статические переменные. В JVM есть только одна область методов, и это общий ресурс.
Область кучи (heap): информация обо всех объектах хранится в области кучи. Существует также одна область кучи на JVM. Это также общий ресурс.
Область стека: для каждого потока (thread) JVM создает один стек времени исполнения, который хранится здесь. Каждый блок этого стека называется активационной записью/кадром стека, в котором хранятся вызовы методов. Все локальные переменные этого метода хранятся в соответствующем кадре. После завершения потока стек его выполнения будет уничтожен JVM. Это не общий ресурс.
Регистры компьютера: хранить адрес текущей инструкции исполнения потока. Очевидно, что каждый поток имеет отдельные регистры компьютера.
Стеки нативного метода: для каждого потока создается отдельный нативный стек. Он хранит информацию о нативных методах.
Среда исполнения
Нативный интерфейс Java (JNI)
Это интерфейс, который взаимодействует с библиотеками нативных методов и предоставляет нативные библиотеки (C, C++), необходимые для выполнения. Это позволяет JVM вызывать библиотеки C/C++ и вызываться библиотеками C/C++, которые могут быть специфичными для аппаратного обеспечения.
Библиотеки нативных методов
Это коллекция нативных библиотек (C, C++), которые требуются для механизма исполнения.
Что такое JVM? Знакомство с виртуальной машиной Java
Java virtual machine (JVM) — это программа, которая разработана для выполнения и запуска других программ на основе Java. В основе JVM лежит простая и гениальная идея, которая всегда останется одним из величайших примеров программирования в стиле кунг-фу. JVM может также использоваться для выполнения программ, написанных на других языках программирования. Подробно рассказываем, как работает JVM, для чего используется эта технология и почему она является одним из главных компонентов в платформе Java. Материал основан на статье Java-разработчика Matthew Tyson «What is the JVM? Introducing the Java Virtual Machine».
Для чего используется Java virtual machine
JVM имеет две основные функции:
Во время выхода первой версии Java в 1995 году все программы писались для конкретной операционной системы, а памятью управлял разработчик программного обеспечения. Поэтому появление JVM стало революцией на рынке.
Существует два основных определения JVM — техническое и повседневное:
Когда разработчики говорят о JVM, обычно имеется в виду процесс, который выполняется на нашем устройстве, особенно на сервере — он управляет и контролирует использование ресурсов Java-приложения.
Кто разрабатывает и обслуживает JVM?
На сегодняшний день JVM массово используется и развивается в разных проектах — как коммерческих, так и Open Sourse. Например, существует проект OpenJDK, который представляет собой полностью совместимый Java Development Kit, состоящий исключительно из свободного и открытого исходного кода. При этом, несмотря на открытость кода этого проекта, его разработкой практически полностью занимается корпорация Oracle.
Сборка мусора
В Java памятью управляет JVM с помощью процесса, который называется сборкой мусора — он непрерывно определяет и удаляет неиспользуемую память в Java-приложениях. Сборка мусора происходит внутри работающей JVM.
В начале существования Java подвергалась серьезной критике за то, что не была «Close to the metal» как C++, поэтому не была такой быстрой. Особенно спорным критики называли процесс сборки мусора. С тех пор были предложены и использованы различные алгоритмы и подходы, которые значительно улучшили и оптимизировали сборку мусора.
Три главные части JVM
JVM состоит из трех основных частей: спецификация, реализация и экземпляр. Рассмотрим каждую из них.
Спецификация JVM
Первая часть JVM — спецификация, которая до конца не определяет все детали реализации виртуальной машины. Это значит, что остается максимальная свобода творчества для разработчика, который работает с ней. Чтобы правильно реализовать виртуальную машину Java, вам нужно всего лишь уметь читать class-файлы и правильно выполнять указанные в них операции.
И так, все, что должна делать JVM — правильно запускать Java-программы. Это может показаться достаточно простым процессом, однако это очень масштабная задача, учитывая мощность и гибкость языка Java.
Реализация JVM
Реализация спецификации JVM приводит к созданию реальной программы, которая и является реализацией JVM. По сути, существует огромное количество реализаций спецификации JVM — как коммерческих, так и с открытым кодом.
Экземпляр JVM
После того, как спецификация JVM реализована и выпущена в качестве самостоятельной программы, вы можете загрузить ее как приложение. Эта загруженная программа является экземпляром виртуальной машины.
Чаще всего, когда разработчики говорят о JVM, они имеют ввиду экземпляр JVM, который работает в среде разработки. Вы можете сказать: «Привет, сколько памяти использует JVM на этом сервере?» или «Я не могу поверить, что сделал зацикленный вызов, а переполнение стека сломало мою JVM. А ведь это просто ошибка новичка!»
Загрузка и выполнение class-файлов в JVM
Мы говорили о роли JVM в запуске Java-приложений, но как виртуальная машина выполняет свою функцию? Для запуска Java-приложений JVM зависит от загрузчика классов и механизма выполнения Java.
Загрузчик классов в JVM
Загрузчик классов Java является частью JVM — он загружает классы в память и делает их доступными для выполнения. Загрузчик классов использует технику ленивой загрузки (lazy-loading) и кэширование, чтобы сделать загрузку классов максимально эффективной. При этом использование таких методов считается достаточно простым процессом.
Все виртуальные машины Java включают в себя загрузчики классов. Спецификация JVM описывает стандартные методы для запроса и управления загрузчиком во время работы, но за выполнение этих возможностей отвечает конкретная реализация JVM. С точки зрения разработчика, механизмы, лежащие в основе загрузчика классов, обычно представляют собой черный ящик.
Механизм выполнения в JVM
После того, как загрузчик классов завершил свою работу, JVM начинает выполнять код каждого класса. Механизм выполнения — компонент JVM, который обрабатывает функции, и он необходим для корректной работы любой виртуальной машины Java.
Выполнение кода включает управление доступом к системным ресурсам. Механизм выполнения JVM находится между работой программы, с ее запросами на файловые, сетевые ресурсы и ресурсы памяти, и операционной системой, которая предоставляет эти ресурсы.
Управление системными ресурсами
Системные ресурсы могут быть разделены на две больших категории: память и все остальное.
JVM отвечает за очистку неиспользуемой памяти, при этом сборщик мусора — это механизм, который и осуществляет этот процесс. JVM также отвечает за распределение и поддержание ссылочной структуры, которую любой разработчик принимает как само собой разумеющееся. Например, механизм выполнения JVM отвечает за то, что при использовании ключевого слова new происходит запрос к операционной системе на выделение памяти.
Помимо памяти, механизм выполнения управляет ресурсами файловой системы и сети. Поскольку JVM совместима с различными операционными системами, то эта задача считается достаточно сложной. Помимо потребностей каждого приложения в ресурсах, механизм выполнения должен корректно работать с каждой операционной системой.
Эволюция JVM: прошлое, настоящее, будущее
В 1995 году разработчики JVM представили две революционные концепции, которые с тех пор стали стандартом в разработке: «Написал один раз, запускай везде» и автоматическое управление памятью. В то время совместимость софта была смелой концепцией, но сейчас это стало нормой. Точно так же, как современное поколение живет с автоматической сборкой мусора.
Можно сказать, что если Джеймс Гослинг и Брендан Эйх изобрели современное программирование, то тысячи других разработчиков усовершенствовали и развили их идеи в последующие десятилетия. Изначально виртуальная машина Java предназначалась только для Java, но сегодня она эволюционировала до поддержки многих языков программирования, включая Scala, Groovy и Kotlin.
Изучайте Java на Хекслете Вступайте в профессию и изучайте один из самых востребованных в энтерпрайзе языков программирования.
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
JVM (Java Virtual Machine)
Java Virtual Machine — виртуальная машина Java — основная часть исполняющей системы Java, так называемой Java Runtime Environment (JRE). Виртуальная машина Java исполняет байт-код Java, предварительно созданный из исходного текста Java-программы компилятором Java (javac). JVM может также использоваться для выполнения программ, написанных на других языках программирования. Например, исходный код на языке Ada может быть откомпилирован в байт-код Java, который затем может выполниться с помощью JVM.
JVM является ключевым компонентом платформы Java. Так как виртуальные машины Java доступны для многих аппаратных и программных платформ, Java может рассматриваться и как связующее программное обеспечение, и как самостоятельная платформа. Использование одного байт-кода для многих платформ позволяет описать Java как «скомпилировано однажды, запускается везде» (compile once, run anywhere).
Виртуальные машины Java обычно содержат Интерпретатор байт-кода, однако, для повышения производительности во многих машинах также применяется JIT-компиляция часто исполняемых фрагментов байт-кода в машинный код. [1]
Содержание
Спецификация JVM
В 1996-м году компания Sun выпустила первую версию документа «Голубая книга JVM», в котором описана спецификация виртуальной машины Java, ставшего де-факто отраслевым стандартом платформы Java. Благодаря этому документу появились альтернативные реализации JVM, являющиеся «разработками с чистого листа» (англ. clean room design). В качестве примера можно привести Kaffe.
Начиная с версии J2SE 5.0 изменения в спецификации JVM вырабатываются в соответствии с формализованными пожеланиями заинтересованных сторон. Процесс внесения изменений в спецификации JVM называется Java Community Process.
JVM, доступная в исходных текстах на Си от фирмы Sun, называется KVM (Kilo Virtual Machine) и доступна на их сайте.
Конфликты
Конкуренция между Sun и Microsoft
В начале развития платформы «Java», существовали две конкурирующие реализации Java VM:
Однако «Microsoft Java VM» не была полностью совместима со спецификацией, описанной Sun в «голубой книге JVM», и имела существенные проблемы с производительностью при работе под большими нагрузками (при большом числе одновременно выполняемых потоков) и с безопасностью.
Компания «Sun» посчитала такую ситуацию недопустимой и решила, что Microsoft занимается намеренной дискредитацией и профанацией платформы «Java» путём распространения своей версии виртуальной машины Java, обладающей вышеперечисленными недостатками. На этом основании, Sun неоднократно подавала в суд на Microsoft — и Microsoft была лишена следующих прав на реализацию:
Некоторые обозреватели компьютерных изданий полагают, что жёсткая позиция, занятая Sun по вопросу Java, могла послужить дополнительным стимулом для разработки компанией «Microsoft» собственного Windows-решения: «.NET Framework». [2]
Разногласия между Sun и IBM
В 2001 году, с целью разработки стандарта кросс-платформенных Desktop-приложений, IBM стартовала открытый проект: «Eclipse».
Фреймворк «Eclipse» был основан на предыдущей закрытой разработке: IBM «VisualAge». IBM удалось сбалансировать интересы свободного сообщества и интересы бизнеса (свои интересы) в лицензии «Eclipse Public License», признанной организацией «Free Software Foundation».
Проект успешно развивается, используется в индустрии, в значительной степени отделился от IBM в самостоятельный (см. «Eclipse Foundation»).
Sun остаётся в оппозиции к Eclipse Foundation, так же, как и к Microsoft. Формально основной причиной противоречий остаётся библиотека «Standard Widget Toolkit» (SWT), которая противоречит Sun-концепции виртуальной машины и переносимости Java-приложений.
Среда исполнения
Программы, предназначенные для запуска на JVM, должны быть скомпилированы в стандартизированном переносимом двоичном формате, который обычно представляется в виде файлов «.class». Программа может состоять из множества классов, размещённых в различных файлах. Для облегчения размещения больших программ, часть файлов вида «.class» может быть упакована вместе в так называемом «.jar»-файле (сокращение от «Java Archive»).
Виртуальная машина JVM исполняет файлы «.class» и «.jar», эмулируя данные в них инструкции следующими путями:
В наши дни, JIT-компиляция используется в большинстве JVM для достижения большей скорости. Существуют также ahead-of-time компиляторы, позволяющие разработчикам приложений перекомпилировать файлы классов в родной для конкретной платформы код.
Как и большинство виртуальных машин, Java Virtual Machine имеет stack-ориентированную архитектуру, свойственную микроконтроллерам и микропроцессорам.
JVM — экземпляр JRE (Java Runtime Environment), вступающий в действие при исполнении программ Java; по завершении исполнения, этот экземпляр удаляется сборщиком мусора. JIT — та часть виртуальной машины Java, которая используется для ускорения выполнения приложений; JIT одновременно компилирует те части байт-кода, функциональность которых аналогична, — что сокращает время, необходимое для проведения компиляции. [3]
Загрузка и установка виртуальной машины Java
Для программирования на Java можно подобрать себе IDE, хорошим выбором будет NetBeans или Eclipse.
Для начала проверим, установлена ли Java платформа на вашем компьютере. Для этого запустите удобным для вас способом утилиту для работы с командной строкой. Например, перейдите в меню «Пуск» пункт «Выполнить», в появившемся окошке введите команду «cmd» без кавычек и нажмите «ОК».
Если на компьютере уже установлена исполняемая среда Java, вывод будет примерно таким:
java version «1.6.0_18»
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode)
Если вывод будет сообщать об ошибке или неизвестной команде, вам безусловно необходима установка виртуальной машины. Также рекомендуется обновить установку, если версия Java на вашем компьютере ниже чем 1.6.
Есть два продукта для загрузки: