Topjava – онлайн-школа по обучению программированию на самом популярном в мире языке Java

*Открытые вступительные занятия с выполнением домашнего задания
Что такое JVM? Знакомство с виртуальной машиной Java
JVM управляет системной памятью и обеспечивает переносимую среду выполнения для приложений на Java
Java virtual machine (JVM ) – это программа, предназначенная для выполнения других программ. В ее основу заложена простая идея, которая всегда будет одним из величайших примеров кодирования в стиле "kung fu". JVM в свое время нарушила всеобщий статус-кво и продолжила поддержку инноваций в программировании сегодня
Использование и определения для JVM
JVM имеет две основные функции:

  1. Позволяет запускать Java приложения на любых устройствах или операционных системах (принцип – «Написал один раз, запускай везде»)
  2. Управляет и оптимизирует память, используемую приложением

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

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

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

        В ранний период Java подвергалась критике, так как не была "Close to the metal" как C++ и поэтому не была такой быстрой. Процесс сборки мусора был особенно спорным. С тех пор для сборки мусора были предложены и использованы различные алгоритмы и подходы. Благодаря последовательной разработке и оптимизации сборка мусора значительно улучшилась
          JVM в трех частях
          Можно сказать, что у JVM есть три составляющих: спецификация, реализация и экземпляр. Рассмотрим каждую из них
          1. Спецификация JVM
          Первая часть JVM – спецификация программного обеспечения в которой не определены детали реализации JVM, чтобы обеспечить максимальную свободу творчества при ее создании:

          "Для правильной реализации виртуальной машины Java, вам нужно только прочитать файл формата class и правильно выполнить операции, указанные в нем"

          Себастьян Бах однажды писал о создании музыки похожим образом:

          "Все что вам нужно делать, это нажимать нужную клавишу в нужное время"

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

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

          В большинстве случаев, говоря о JVM, имеют в виду экземпляр JVM, который работает в среде разработки или производства программного обеспечения. Вы можете сказать: «Привет Макс, сколько памяти использует JVM на этом сервере?» или «Я не могу поверить, я сделал зацикленный вызов, и переполнение стека сломало мою JVM. Ошибка новичка!»
          Загрузка и выполнение class-файлов в JVM
          Мы говорили о роли JVM в запуске Java-приложений, но как она выполняет свою функцию? При выполнении Java-приложений JVM зависит от загрузчика класса Java и механизма выполнения Java
          Загрузчик классов в JVM
          Все в Java является классом, и все Java приложения состоят из классов. Приложение может состоять из одного или тысячи классов. Для запуска Java-приложения JVM должна загрузить скомпилированные .class-файлы в контекст, такой как сервер, где они будут доступны. JVM зависит от своего загрузчика класса во время выполнения этой функции

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

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

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

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

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

          Изначально виртуальная машина Java предназначалась только для Java, но сегодня она может поддерживать разные скриптовые и другие языки программирования, включая Scala, Groovy и Kotlin. Глядя вперед, трудно увидеть будущее, в котором JVM не является заметной частью развития разработки программного обеспечения