Что такое JVM? Знакомство с виртуальной машиной Java

Виртуальная машина Java - это программа, предназначенная для выполнения других программ. Это простая идея, которая также является одним из лучших примеров кодирования кунг-фу . JVM нарушила статус-кво своего времени и сегодня продолжает поддерживать инновации в программировании.

Для чего используется JVM

JVM выполняет две основные функции: позволяет программам Java запускаться на любом устройстве или в любой операционной системе (известный как принцип «писать один раз, запускать где угодно») и управлять памятью программ и оптимизировать ее. Когда в 1995 году была выпущена Java, все компьютерные программы были написаны для конкретной операционной системы, а память программ управлялась разработчиком программного обеспечения. Так что JVM стала откровением.

JavaWorld /

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

  • Техническое определение : JVM - это спецификация программы, которая выполняет код и предоставляет среду выполнения для этого кода.
  • Повседневное определение : JVM - это то, как мы запускаем наши Java-программы. Мы настраиваем параметры JVM, а затем полагаемся на нее для управления ресурсами программы во время выполнения.

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

Кто разрабатывает и обслуживает JVM?

JVM широко развернута, активно используется и поддерживается некоторыми очень умными программистами, как корпоративными, так и открытыми. Проект OpenJDK является порождением решения Sun Microsystems в отношении Java с открытым исходным кодом. OpenJDK продолжил руководство Oracle над Java, при этом большая часть тяжелой работы в наши дни выполняется инженерами Oracle.

Управление памятью в JVM

Наиболее частое взаимодействие с работающей JVM - это проверка использования памяти в куче и стеке. Самая распространенная настройка - это настройка параметров памяти JVM.

Вывоз мусора

До Java всей программной памятью управлял программист. В Java программной памятью управляет JVM. JVM управляет памятью с помощью процесса, называемого сборкой мусора , который непрерывно определяет и удаляет неиспользуемую память в программах Java. Сборка мусора происходит внутри работающей JVM.

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

Что значит «близко к металлу»?

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

JVM из трех частей

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

1. Спецификация JVM

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

«Чтобы правильно реализовать виртуальную машину Java, вам нужно только уметь читать classформат файла и правильно выполнять указанные в нем операции».

Дж. С. Бах однажды описал создание музыки аналогичным образом:

«Все, что вам нужно сделать, это коснуться нужной клавиши в нужное время».

Итак, все, что нужно сделать JVM, - это правильно запускать программы Java. Звучит просто, может даже показаться простым со стороны, но это масштабное мероприятие, особенно с учетом мощности и гибкости языка Java.

JVM как виртуальная машина

JVM - это виртуальная машина, которая переносит файлы классов Java. Виртуальная машина означает, что JVM является абстракцией базовой реальной машины, например сервера, на котором работает ваша программа. Независимо от того, какая операционная система или оборудование фактически присутствует, JVM создает предсказуемую среду для запуска программ. Однако в отличие от настоящей виртуальной машины JVM не создает виртуальную операционную систему. Было бы точнее описать JVM как управляемую среду выполнения или как виртуальную машину процесса .

2. Реализации JVM

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

Почти все лицензированные JVM создаются как ответвления от OpenJDK и HotSpot JVM, включая лицензированный Oracle JDK. Разработчики, создающие лицензионную ветвь OpenJDK, часто мотивированы желанием добавить улучшения производительности для конкретных ОС. Обычно вы загружаете и устанавливаете JVM как составную часть Java Runtime Environment (JRE).

3. Экземпляр JVM.

После того, как спецификация JVM будет реализована и выпущена как программный продукт, вы можете загрузить и запустить ее как программу. Эта загруженная программа является экземпляром (или созданной версией) JVM.

В большинстве случаев, когда разработчики говорят о «JVM», мы имеем в виду экземпляр JVM, работающий в среде разработки программного обеспечения или производственной среде. Вы можете сказать: «Эй, Ананд, сколько памяти использует JVM на этом сервере?» или «Я не могу поверить, что создал циклический вызов, и ошибка переполнения стека привела к сбою моей JVM. Какая ошибка новичка!»

Что такое спецификация программного обеспечения?

Спецификация программного обеспечения (или спецификации) является человеком-читаемый дизайн документ , который описывает , как программная система должна работать. Цель спецификации - создать четкое описание и требования, которым должны следовать инженеры.

Загрузка и выполнение файлов классов в JVM

Мы говорили о роли JVM в запуске приложений Java, но как она выполняет свою функцию? Для запуска приложений Java JVM зависит от загрузчика классов Java и механизма выполнения Java.

Загрузчик классов Java в JVM

В Java все является классом, и все приложения Java построены из классов. Приложение может состоять из одного класса или тысяч. Чтобы запустить приложение Java, JVM должна загружать скомпилированные файлы .class в контекст, например сервер, где к ним можно получить доступ. JVM зависит от своего загрузчика классов для выполнения этой функции.

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

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

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

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

Выполнение кода включает управление доступом к системным ресурсам. Механизм выполнения JVM стоит между запущенной программой - с ее требованиями к файловым, сетевым и ресурсам памяти - и операционной системой, которая предоставляет эти ресурсы.

Как механизм выполнения управляет системными ресурсами

Системные ресурсы можно разделить на две большие категории: память и все остальное.

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

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

Эволюция JVM: прошлое, настоящее, будущее

В 1995 году JVM представила две революционные концепции, которые с тех пор стали стандартом для современной разработки программного обеспечения: «Пишите один раз, запускайте где угодно» и автоматическое управление памятью. В то время совместимость программного обеспечения была смелой концепцией, но немногие разработчики сегодня задумаются над этим дважды. Точно так же, в то время как наши предки-инженеры должны были сами управлять памятью программ, мое поколение выросло на сборке мусора.

Можно сказать, что Джеймс Гослинг и Брендан Эйх изобрели современное программирование, но тысячи других в последующие десятилетия усовершенствовали и развили свои идеи. В то время как виртуальная машина Java изначально предназначалась только для Java, сегодня она эволюционировала для поддержки многих языков сценариев и программирования, включая Scala, Groovy и Kotlin. Заглядывая вперед, трудно предвидеть будущее, в котором JVM не станет важной частью среды разработки.

Все о JVM

  • Претенденты на Java: поведение потоков в JVM
  • Претенденты на Java: перегрузка методов в JVM
  • Оптимизация производительности внутри JVM
  • Основы байт-кода: как JVM обрабатывает байт-код
  • Исключения Java: как JVM обрабатывает исключения
  • Представляем компактную виртуальную машину Java

Этот рассказ «Что такое JVM? Знакомство с виртуальной машиной Java» был первоначально опубликован JavaWorld.