
Вопрос 2.
JVM и JDK. Установка, переменные окружения. Существующие реализации виртуальных машин. Принципы стандартизации, JCP. Высокоуровневая архитектура JVM, работа с памятью, heap, stack area.
Java Virtual Machine (сокращенно Java VM, JVM) — виртуальная машина Java — основная часть исполняющей системы Java, так называемой Java Runtime Environment (JRE). Виртуальная машина Java интерпретирует и исполняет Байт-код Java, предварительно созданный из исходного текста Java-программы компилятором Java (javac). JVM может также использоваться для выполнения программ, написанных на других языках программирования. Например, исходный код на языке Ada может быть откомпилирован в байт-код Java, который затем может выполниться с помощью JVM.
JVM является ключевым компонентом платформы Java. Так как виртуальные машины Java доступны для многих аппаратных и программных платформ, Java может рассматриваться и как связующее программное обеспечение, и как самостоятельная платформа, отсюда принцип «написано однажды, запускается везде» (write once, run anywhere). Использование одного байт-кода для многих платформ позволяет описать Java как «скомпилировано однажды, запускается везде» (compile once, run anywhere).
Среда исполнения
Программы, предназначенные для запуска на JVM должны быть скомпилированы в стандартизированном переносимом двоичном формате, который обычно представляется в виде файлов .class. Программа может состоять из множества классов, размещенных в различных файлах. Для облегчения размещения больших программ, часть файлов вида .class могут быть упакованы вместе в так называемый .jar файл (сокращение от Java Archive).
Виртуальная машина JVM исполняет файлы .class или .jar, эмулируя инструкции, написанные для JVM, путем интерпретирования или использования just-in-time компилятора (JIT), такого, как HotSpot от Sun microsystems. В наши дни JIT компиляция используется в большинстве JVM в целях достижения большей скорости. Существуют также ahead-of-time компиляторы, позволяющие разработчикам приложений прекомпилировать файлы классов в родной для конкретной платформы код.
Как и большинство виртуальных машин, Java Virtual Machine имеет stack-ориентированную архитектуру, свойственную микроконтроллерам и микропроцессорам.
JVM, которая является экземпляром JRE (Java Runtime Environment), вступает в действие при исполнении программ Java. После завершения исполнения, этот экземпляр удаляется сборщиком мусора. JIT является частью виртуальной машины Java, которая используется для ускорения времени выполнения приложений. JIT одновременно компилирует части байт-кода, которые имеют аналогичную функциональность, и, следовательно, уменьшает количество времени, необходимого для компиляции.
Java Development Kit (сокращенно JDK) — бесплатно распространяемый компанией Oracle Corporation (ранее Sun Microsystems) комплект разработчика приложений на языке Java, включающий в себя компилятор Java (javac), стандартные библиотеки классов Java, примеры, документацию, различные утилиты и исполнительную систему Java (JRE). В состав JDK не входит интегрированная среда разработки на Java, поэтому разработчик, использующий только JDK, вынужден использовать внешний текстовый редактор и компилировать свои программы, используя утилиты командной строки.
Все современные интегрированные среды разработки приложений на Java, такие, как NetBeans IDE, Sun Java Studio Creator, IntelliJ IDEA, Borland JBuilder, Eclipse, опираются на сервисы, предоставляемые JDK. Большинство из них для компиляции Java-программ используют компилятор из комплекта JDK. Поэтому эти среды разработки либо включают в комплект поставки одну из версий JDK, либо требуют для своей работы предварительной инсталляции JDK на машине разработчика.
Доступны полные исходные тексты JDK, включая исходные тексты самого Java-компилятора javac.
Переменные окружения.
В седьмой версии Unix 1979 года впервые появилась новая особенность операционной системы, известная как переменные окружения (environment variables). Переменные окружения имеются во всех современных системах Unix и в более поздних системах с интерфейсом командной строки (таких, как DOS, лежащая в основе MS-Windows), но отсутствуют в компьютерах Macintosh, Palm Pilot, SmartCard и других Java-средах. Переменные окружения повсеместно используются для настройки окружения выполняемой программы на компьютере, откуда и возникло такое название. Возьмем для примера случай, знакомый большинству читателей. В системах Unix или DOS переменная окружения PATH определяет область поиска системой выполняемых программ. Естественно, возникает вопрос - как получить переменные окружения из Java-программы?
Теоретически в некоторых версиях Java это возможно, но делать это не стоит. Исполнительная среда Java разрабатывалась с расчетом на переносимость программ, поэтому любое использование средств операционной системы, не поддерживаемых во всех Java-платформах, считается нежелательным. Выше упоминались некоторые Java-платформы, не имеющие переменных окружения.
В классе java.lang.System присутствует статический метод getenv().