Скомпилированная java программа может быть запущена на любой платформе где есть jvm

Обновлено: 06.07.2024

в чем разница между JVM, JDK, JRE & OpenJDK?

я программировал на Java, и я столкнулся с этими фразами, в чем разница между ними?

на виртуальная машина Java (JVM) - это виртуальная машина, на которой выполняются байт-коды Java. JVM не понимает исходный код Java, поэтому вы компилируете свой *.java файлы получить *.class файлы, содержащие байт-коды, понятные JVM. Это также сущность, которая позволяет Java быть "портативным языком" (написано Однажды, работает везде). Действительно, существуют конкретные реализации JVM для разных систем (Windows, Linux, В macOS, смотрите список Википедии), цель состоит в том, что с такой же байткод все они дают одинаковые результаты.

чтобы объяснить разницу между JDK и JRE, лучше всего прочитать документация Oracle и обратитесь к диаграмме:

Java Development Kit (JDK)

JDK является надмножеством JRE и содержит все, что находится в JRE, а также такие инструменты, как компиляторы и отладчики, необходимые для разработки апплетов и приложений.

обратите внимание, что Oracle не единственный, кто предоставляет JDKs.

в OpenJDK является реализацией Java SE 7 JSR с открытым исходным кодом (JSR 336). Теперь почти нет разницы между Oracle JDK и OpenJDK. В прошлом году Oracle приняла это решение : переход к OpenJDK в качестве официальной реализации ссылки Java SE 7

различия изложены в этом блог :

Q: в чем разница между исходным кодом, найденным в Репозиторий OpenJDK и код, который вы используете для создания Oracle JDK?

A: это очень близко - наш процесс сборки для выпусков Oracle JDK строится на OpenJDK 7, добавляя только пару частей, таких как код развертывания, который включает в себя реализацию Oracle плагина Java и Java WebStart, а также некоторые компоненты с закрытым исходным кодом, такие как графический растризатор, некоторые компоненты с открытым исходным кодом, такие как Rhino, и несколько бит и частей здесь и там, как дополнительная документация или сторонние шрифты. Продвигаясь вперед, мы намерены открыть исходный код всех частей Oracle JDK, за исключением тех, которые мы рассматриваем коммерческие функции, такие как JRockit Mission Control (еще не доступны в Oracle JDK), и заменить обремененные компоненты третьей стороны альтернативами с открытым исходным кодом для достижения более близкого паритета между кодовыми базами.

в зависимости от используемой версии VM может отличаться:соответствие между Sun / Oracle JDK, OpenJDK и HotSpot VM версии

  • JVM-это виртуальная машина Java - JVM фактически запускает байт-код Java.
  • JDK - это Java Developer Kit -- JDK-это то, что вам нужно для компиляции исходного кода Java.
  • JRE-это среда выполнения Java - это то, что вам нужно для запуска Java-программы и содержит JVM, среди прочего.

OpenJDK-это конкретная реализация JDK.

пакета JDK (комплект разработки Java)

Java Developer Kit содержит инструменты, необходимые для разработки программ Java, и JRE для запуска программ. Инструменты включают компилятор (javac.exe), Java application launcher (java.exe), Appletviewer, etc.

компилятор преобразует код Java в байт-код. Java application launcher открывает JRE, загружает класс и вызывает его основной метод.

вам нужен JDK, если вы вообще хотите писать свои собственные программы и компилировать их. Для запуска java-программ достаточно JRE.

JRE предназначен для выполнения Java-файлов

то есть JRE = jvm + java Packages Classes (например, util, math, lang,awt, swing и т. д.)+библиотеки времени выполнения.

JDK в основном предназначен для разработки java. Т. е. Вы можете создать файл Java (с помощью пакетов Java), скомпилировать файл Java и запустить файл java.

JRE (среда выполнения Java Среды)

среда выполнения Java содержит JVM, библиотеки классов и другие вспомогательные файлы. Он не содержит никаких средств разработки, таких как компилятор, отладчик и т. д. На самом деле JVM запускает программу, и она использует библиотеки классов и другие вспомогательные файлы, предоставленные в JRE. Если вы хотите запустить любую программу java, вам нужно установить JRE в системе

виртуальная машина Java предоставляет независимый от платформы способ выполнения кода; Это значит скомпилируйте один раз на любой машине и запустите ее где угодно(на любой машине).

JVM (виртуальная машина Java)

Как мы все знаем, когда мы компилируем файл Java, вывод не является "exe", но это".файл класса. ‘.файл class ' состоит из Java byte codes, которые понятны JVM. Виртуальная машина Java интерпретирует байт-код в машинный код в зависимости от базовой операционной системы и оборудования. Он отвечает за все такие вещи, как сбор мусора, проверка границ массива и т. д. JVM зависит от платформы.

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

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

A виртуальная машина Java (JVM) - это виртуальная машина, которая может выполнять байт-код Java. Это компонент выполнения кода программной платформы Java.

на Java Development Kit (JDK) - продукт корпорации Oracle, предназначенный для разработчиков Java. С момента появления Java это был наиболее широко используемый Java Software Development Kit (SDK).

Среда Выполнения Java, также упоминается как Java Среда Выполнения, Среда Выполнения

OpenJDK (Open Java Development Kit) - это бесплатная реализация языка программирования Java с открытым исходным кодом. Это результат усилий Sun Microsystems, начатых в 2006 году. Реализация лицензируется под лицензией GNU General Public License (GPL) с исключением ссылок.

просто:

JDK (Java Development Kit):

  • содержит инструменты, необходимые для разработки программ на Java.
  • вам нужен JDK, если вы вообще хотите писать свои собственные программы и компилировать их.
  • JDK в основном предназначен для разработки java.

JRE (Среда Выполнения Java)

среда выполнения Java содержит JVM, библиотеки классов и другие файлы поддержки. JRE предназначен для выполнения файлов Java.

JVM (Виртуальная Машина Java)

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

JVM является ли код Java виртуальной машины выполняется на

JRE является ли среда (стандартные библиотеки и JVM), необходимая для запуска приложений Java

JDK является JRE с инструментами разработчика и документацией

OpenJDK является версией JDK с открытым исходным кодом, в отличие от обычного JDK, принадлежащего Oracle

JDK - компилирует java в байтовый код. Состоит из отладчики, компиляторы и т. д.

JVM - выполняет байт-код. JVM - это тот, который делает платформу java независимой. Но JVM варьируется для платформ.

JRE - JVM вместе с библиотеками времени выполнения java для выполнения программ java.

еще один аспект, о котором стоит упомянуть:

пакета JDK (комплект разработки Java)

Он понадобится вам для целей разработки, таких как имя suggest.

например: компания программного обеспечения будет иметь установку JDK на своем компьютере, потому что им нужно будет разработать новое программное обеспечение, которое включает в себя компиляцию и запуск своих программ Java.

поэтому мы можем сказать, что JDK = JRE + JVM.

JRE (время выполнения java среды)

это необходимо для запуска программ Java. Вы не можете компилировать с ним Java-программы .

например: обычный пользователь компьютера, который хочет запустить некоторые онлайн-игры, тогда понадобится JRE в его системе для запуска программ Java.

JVM (виртуальная машина java)

Как вы знаете, он запускает байт-коды. Это делает платформу Java независимой, потому что она выполняет .class файл, который вы получаете после компиляции программы Java независимо от того, компилируете ли вы его на Windows, Mac или Linux.

открыть JDK

Ну, как я уже сказал выше. Теперь JDK производится другой компанией, один из них, который является открытым исходным кодом и бесплатным для публичного использования, - OpenJDK, а некоторые другие-JRockit JDK корпорации Oracle или IBM JDK.

однако все они могут показаться одинаковыми для общего пользователя.

вывод

Если вы программист Java вам понадобится JDK в вашей системе, и этот пакет будет включать JRE и JVM, но если вы обычный пользователь, который любит играть в онлайн-игры, вам понадобится только JRE, и в этом пакете не будет JDK.

другими словами, JDK-это дедушка, JRE-отец, а JVM-их сын.

JRE - означает время выполнения Java, и это необходимо для запуска приложения Java.

JDK - означает Java development kit и предоставляет инструменты для разработки Java-программы, например Java compiler. Он также содержит JRE.

JVM - означает виртуальную машину Java, и это процесс, ответственный за запуск приложения Java.

JIT - стоит Для как раз вовремя компиляции и помогает повысить производительность Java-приложения путем преобразования байтового кода Java в собственный код при пересечении определенного порога, т. е. в основном горячий код преобразуется в собственный код.


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

платформа Java 2, Standard Edition, также известная как J2SE, относится к платформе и включает классы в java.Lang и Java.Ио пакетов, среди других. Это был строительный блок Java-приложений, построенных на.

виртуальная машина Java, или JVM, является виртуальной машиной программного обеспечения, которая выполняет скомпилированный код Java. Потому что скомпилированная Java код-это просто байт-код, JVM отвечает за компиляцию этого байт-кода в машинный код перед его запуском. (Это часто называют компилятором Just In Time или компилятором JIT.), То JVM также заботится об управлении памятью, так что код приложения не должен.

Java Development Kit, или JDK, был и остается частью программного обеспечения, которое разработчики Java используют для создания приложений Java. Содержит компилятор языка Java, генератор документации, инструменты для работы с родным языком код и (как правило) исходный код Java для платформы для включения отладки классов платформы.

среда выполнения Java, или JRE, была и остается частью программного обеспечения, загружаемого конечными пользователями для запуска скомпилированных приложений Java. Он включает JVM, но не содержит никаких инструментов разработки, включенных в JDK. Однако JDK содержит JRE.

JVM: спецификация, которая описывает способ / ресурсы для запуска программы java. Фактически выполняет байтовый код и делает платформу java независимой. При этом он отличается для разных платформ. JVM для windows не может работать как JVM для UNIX.

JDK: JRE + Java компилятор и другие необходимые инструменты для создания java программа с нуля

JVM: на самом деле это означает интерпретатор байтового кода .Это зависит от платформы. Например: в платформе Windows 'java.exe' или 'javaw, который.exe' precess-это процесс jvm.

JDK: это инструментарий, содержащий необходимые библиотеки и утилиты для разработки и выполнения java-программы/приложения

JVM: виртуальная машина java. говорит машине, что делать с кодом Java. Вы не можете загрузить JVM как есть. Он поставляется упакованным в какой-то другой компонент.

JDK: содержит JRE (который, в свою очередь, содержит JVM). После получения JDK вам не нужно устанавливать JRE и JVM отдельно. Он содержит компилятор, который компилирует .Java-файлов для .class files

JVM

JVM (виртуальная машина Java) является абстрактной машиной. Это спецификация, которая предоставляет среду выполнения, в которой байт-код java может быть выполнен. Виртуальные машины Java доступны для многих аппаратных и программных платформ.

JRE

JRE-это аббревиатура для среды выполнения Java.Он используется для обеспечения среды выполнения.Это реализация СПМ.Она физически существует.Он содержит набор библиотек + другие файлы что JVM использует во время выполнения.

JDK

JDK является аббревиатурой для Java Development Kit.Она физически существует.Он содержит инструменты разработки JRE+.

JRE выполняет приложение, но JVM читает инструкции строка за строкой, поэтому это интерпретатор.

JDK=JRE + инструменты разработки

JRE=JVM + классы библиотеки

JVM виртуальная машина Java исполняет байт-код Java. Это блок выполнения на платформе JAVA. Он преобразует байт-код в машинный код.

JRE среда выполнения Java предоставляет минимальные требования для выполнения приложения Java; она состоит из виртуальной машины Java (JVM), основных классов и поддерживающих файлов.

JDK Java Development Kit, он имеет все инструменты для разработки прикладное программное обеспечение. Это как JRE+JVM

открыть JDK - это бесплатная реализация платформы Java с открытым исходным кодом.

с точки зрения обывателя:- JDK = JRE + инструменты разработки/отладки, где JDK - наш полный пакет для работы с Java, от создания компиляции до ее запуска.С другой стороны, JRE-это просто запуск кода(байтового кода).

Примечание: - устанавливаем ли мы JDK или JRE, JVM будет поставляться в комплекте с пакетами, а JVM-это часть, где JIT-компилятор преобразует байтовый код в машинный код.

просто прочитайте статью на JDK,JRE , JVM и JIT

JDK: полный пакет, который вам нужно написать и запустить java code

OpenJDK: независимая реализация JDK для того, чтобы сделать его намного лучше

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

Ни для кого не секрет, что на данный момент Java — один из самых популярных языков программирования в мире. Дата официального выпуска Java — 23 мая 1995 года.

Эта статья посвящена основам основ: в ней изложены базовые особенности языка, которые придутся кстати начинающим “джавистам”, а опытные Java-разработчики смогут освежить свои знания.

* Статья подготовлена на основе доклада Евгения Фраймана — Java разработчика компании IntexSoft.
В статье присутствуют ссылки на внешние материалы
.




1. JDK, JRE, JVM

Java Development Kit — комплект разработчика приложений на языке Java. Он включает в себя Java Development Tools и среду выполнения Java — JRE (Java Runtime Environment).

Java development tools включают в себя около 40 различных тулов: javac (компилятор), java (лаунчер для приложений), javap (java class file disassembler), jdb (java debugger) и др.

Среда выполнения JRE — это пакет всего необходимого для запуска скомпилированной Java-программы. Включает в себя виртуальную машину JVM и библиотеку классов Java — Java Class Library.

JVM — это программа, предназначенная для выполнения байт-кода. Первое преимущество JVM — это принцип “Write once, run anywhere”. Он означает, что приложение, написанное на Java, будет работать одинаково на всех платформах. Это является большим преимуществом JVM и самой Java.

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

Существует множество реализаций JVM, как коммерческих, так и с открытым кодом. Одна из целей создания новых JVM — увеличение производительности для конкретной платформы. Каждая JVM пишется под платформу отдельно, при этом есть возможность написать ее так, чтобы она работала быстрее на конкретной платформе. Самая распространённая реализация JVM — это JVM Hotspot от OpenJDK. Также есть реализации IBM J9, Excelsior JET.

2. Выполнение кода на JVM

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

  • Загрузка байт-кода и создание экземпляра класса Class
    Грубо говоря, чтобы попасть на JVM, класс должен быть загружен. Для этого существуют отдельные класс-загрузчики, к ним мы вернемся чуть позже.
  • Связывание или линковка
    После загрузки класса начинается процесс линковки, на котором байт-код разбирается и проверяется. Процесс линковки в свою очередь происходит в 3 шага:

3. Загрузчики классов и их иерархия

Вернемся к загрузчикам классов — это специальные классы, которые являются частью JVM. Они загружают классы в память и делают их доступными для выполнения. Загрузчики работают со всеми классами: и с нашими, и с теми, которые непосредственно нужны для Java.

Представьте ситуацию: мы написали свое приложение, и помимо стандартных классов там есть наши классы, и их очень много. Как с этим будет работать JVM? В Java реализована отложенная загрузка классов, иными словами lazy loading. Это значит, что загрузка классов не будет выполняться до тех пор, пока в приложении не встретится обращение к классу.

Иерархия загрузчиков классов


Первый загрузчик классов — это Bootstrap classloader. Он написан на C++. Это базовый загрузчик, который загружает все системные классы из архива rt.jar. При этом, есть небольшое отличие между загрузкой классов из rt.jar и наших классов: когда JVM загружает классы из rt.jar, она не выполняет все этапы проверки, которые выполняются при загрузке любого другого класс-файла т.к. JVM изначально известно, что все эти классы уже проверены. Поэтому, включать в этот архив какие-либо свои файлы не стоит.

Следующий загрузчик — это Extension classloader. Он загружает классы расширений из папки jre/lib/ext. Допустим, вы хотите, чтобы какой-то класс загружался каждый раз при старте Java машины. Для этого вы можете скопировать исходный файл класса в эту папку, и он будет автоматически загружаться.

Еще один загрузчик — System classloader. Он загружает классы из classpath’а, который мы указали при запуске приложения.

Процесс загрузки классов происходит по иерархии:

  • В первую очередь мы запрашиваем поиск в кэше System Class Loader (кэш системного загрузчика содержит классы, которые уже были им загружены);
  • Если класс не был найден в кэше системного загрузчика, мы смотрим кэш Extension class loader;
  • Если класс не найден в кэше загрузчика расширений, класс запрашивается у загрузчика Bootstrap.

4. Структура Сlass-файлов и процесс загрузки

Перейдем непосредственно к структуре Class-файлов.

Один класс, написанный на Java, компилируется в один файл с расширением .class. Если в нашем Java файле лежит несколько классов, один файл Java может быть скомпилирован в несколько файлов с расширением .class — файлов байт-кода данных классов.

Все числа, строки, указатели на классы, поля и методы хранятся в Сonstant pool — области памяти Meta space. Описание класса хранится там же и содержит имя, модификаторы, супер-класс, супер-интерфейсы, поля, методы и атрибуты. Атрибуты, в свою очередь, могут содержать любую дополнительную информацию.

Таким образом, при загрузке классов:

  • происходит чтение класс-файла, т.е проверка корректности формата
  • создается представление класса в Constant pool (Meta space)
  • грузятся супер-классы и супер-интерфейсы; если они не будут загружены, то и сам класс не будет загружен

5. Исполнение байт-кода на JVM

В первую очередь, для исполнения байт-кода, JVM может его интерпретировать. Интерпретация — довольно медленный процесс. В процессе интерпретации, интерпретатор “бежит” построчно по класс-файлу и переводит его в команды, которые понятны JVM.

Также JVM может его транслировать, т.е. скомпилировать в машинный код, который будет исполняться непосредственно на CPU.

Команды, которые исполняются часто, не будут интерпретироваться, а сразу будут транслироваться.

6. Компиляция

Компилятор — это программа, которая преобразует исходные части программ, написанные на языке программирования высокого уровня, в программу на машинном языке, “понятную” компьютеру.

Компиляторы делятся на:

  • Не оптимизирующие
  • Простые оптимизирующие (Hotspot Client): работают быстро, но порождают неоптимальный код
  • Сложные оптимизирующие (Hotspot Server): производят сложные оптимизирующие преобразования прежде чем сформировать байт-код

Также компиляторы могут классифицироваться по моменту компиляции:

  • Динамические компиляторы
    Работают одновременно с программой, что сказывается на производительности. Важно, чтобы эти компиляторы работали на коде, который часто исполняется. Во время исполнения программы JVM знает, какой код выполняется чаще всего, и, чтобы постоянно не интерпретировать его, виртуальная машина сразу переводит его в команды, которые уже будут исполняться непосредственно на процессорe.
  • Статические компиляторы
    Дольше компилируют, но порождают оптимальный код для исполнения. Из плюсов: не требуют ресурсов во время исполнения программы, каждый метод компилируется с применением оптимизаций.

7. Организация памяти в Java

Стек — это область памяти в Java, которая работает по схеме LIFO — “Last in — Fisrt Out” или “Последним вошел, первым вышел”.


Он нужен для того, чтобы хранить методы. Переменные в стеке существуют до тех пор, пока выполняется метод в котором они были созданы.

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

Ключевые особенности стека:

  • Стек заполняется и освобождается по мере вызова и завершения новых методов
  • Доступ к этой области памяти осуществляется быстрее, чем к куче
  • Размер стека определяется операционной системой
  • Является потокобезопасным, поскольку для каждого потока создается свой отдельный стек

Куча разбита на несколько более мелких частей, называемых поколениями:

  • Young generation — область, где размещаются недавно созданные объекты
  • Old (tenured) generation — область, где хранятся “долгоживущие” объекты
  • До Java 8 существовала ещё одна область — Permanent generation — которая содержит метаинформацию о классах, методах, статических переменных. После появления Java 8 было решено хранить эту информацию отдельно, вне кучи, а именно в Meta space


Почему отказались от Permanent generation? В первую очередь, это из-за ошибки, которая была связана с переполнением области: так как Perm имел константный размер и не мог расширяться динамически, рано или поздно память заканчивалась, кидалась ошибка, и приложение падало.

Meta space же имеет динамический размер, и во время исполнения он может расширяться до размеров памяти JVM.

Ключевые особенности кучи:

  • Когда эта область памяти заполняется полностью, Java бросает java.lang.OutOfMemoryError
  • Доступ к куче медленнее, чем к стеку
  • Для сбора неиспользуемых объектов работает сборщик мусора
  • Куча, в отличие от стека, не является потокобезопасной, так как любой поток может получить к ней доступ

Основываясь на информации выше, рассмотрим, как происходит управление памятью на простом примере:

У нас есть класс App, в котором единственный метод main состоит из:

— примитивной переменой id типа int со значением 23
— ссылочной переменной pName типа String со значением Jon
— ссылочной переменной p типа person


Как уже упоминалось, при вызове метода на вершине стека создаётся область памяти, в которой хранятся данные, необходимые этому методу для выполнения.
В нашем случае, это ссылка на класс person: сам объект хранится в куче, а в стеке хранится ссылка. Также в стек кладется ссылка на строку, а сама строка хранится в куче в String pool. Примитив хранится непосредственно в стеке.

Для вызова конструктора с параметрами Person (String) из метода main() в стеке, поверх предыдущего вызова main() создается в стеке отдельный фрейм, который хранит:

— this — ссылка на текущий объект
— примитивное значение id
— ссылочную переменную personName, которая указывает на строку в String Pool.

После того, как мы вызвали конструктор, вызывается setPersonName(), после чего снова создается новый фрейм в стеке, где хранятся те же данные: ссылка на объект, ссылка на строку, значение переменной.

Таким образом, когда выполнится метод setter, фрейм пропадет, стек очистится. Далее выполняется конструктор, очищается фрейм, который был создан под конструктор, после чего метод main() завершает свою работу и тоже удаляется из стека.

Если будут вызваны другие методы, для них будут также созданы новые фреймы с контекстом этих конкретных методов.

8. Garbage collector

В куче работает Garbage collector — программа, работающая на виртуальной машине Java, которая избавляется от объектов, к которым невозможно получить доступ.

Разные JVM могут иметь различные алгоритмы сборки мусора, также существуют разные сборщики мусора.

Мы поговорим о самом простом сборщике Serial GC. Сборку мусора мы запрашиваем при помощи System.gc().


Как уже было упомянуто выше, куча разбита на 2 области: New generation и Old generation.

New generation (младшее поколение) включает в себя 3 региона: Eden, Survivor 0 и Survivor 1.

Old generation включает в себя регион Tenured.

Что происходит, когда мы создаем в Java объект?

В первую очередь объект попадает в Eden. Если мы создали уже много объектов и в Eden уже нет места, срабатывает сборщик мусора и освобождает память. Это, так называемая, малая сборка мусора — на первом проходе он очищает область Eden и кладёт “выжившие” объекты в регион Survivor 0. Таким образом регион Eden полностью высвобождается.

Если произошло так, что область Eden снова была заполнена, garbage collector начинает работу с областью Eden и областью Survivor 0, которая занята на данный момент. После очищения выжившие объекты попадут в другой регион — Survivor 1, а два остальных останутся чистыми. При последующей сборке мусора в качестве региона назначения опять будет выбран Survivor 0. Именно поэтому важно, чтобы один из регионов Survivor всегда был пустым.

JVM следит за объектами, которые постоянно копируются и перемещаются из одного региона в другой. И для того, чтобы оптимизировать данный механизм, после определённого порога сборщик мусора перемещает такие объекты в регион Tenured.

Когда в Tenured места для новых объектов не хватает, происходит полная сборка мусора — Mark-Sweep-Compact.


Во время этого механизма определяется, какие объекты больше не используются, регион очищается от этих объектов, и область памяти Tenured дефрагментируется, т.е. последовательно заполняется нужными объектами.

Что такое 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 имеет две основные функции:

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

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

Существует два основных определения JVM — техническое и повседневное:

  • Техническое определение: JVM — это софт, который выполняет код и предоставляет среду для его выполнения.
  • Повседневное определение: JVM — это способ запуска наших Java-приложений. Мы настраиваем параметры 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 — классы, и все Java-приложения состоят из классов. Любое приложение может состоять из одного или многих тысяч классов. Чтобы запустить Java-приложение, JVM должна загрузить скомпилированные .class-файлы в контекст — например, в сервер, где они будут доступны. 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 на Хекслете Вступайте в профессию и изучайте один из самых востребованных в энтерпрайзе языков программирования.

I am ready for a long road flight for working with a week- or months-long projects.

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

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

Java virtual machine (JVM) — это программа, предназначенная для выполнения других программ. В ее основу заложена простая идея, которая всегда будет одним из величайших примеров кодирования в стиле «kung fu».

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

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


Существует техническое определение JVM, а также его повседневная формулировка:

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

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

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

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

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

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

Глобально JVM состоит из трех частей: спецификация, реализация и экземпляр. Рассмотрим каждую из них.

Первая часть JVM — спецификация в которой не определены детали реализации JVM, что обеспечивает максимальную свободу творчества при ее создании:

«Для правильной реализации виртуальной машины Java, вам лишь необходимо уметь читать class-файлы и правильно выполнять указанные в нем операции»

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как только загрузчик классов выполнил свою работу, JVM начинает выполнять код каждого класса.

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

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

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

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

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

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

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

Читайте также: