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

Java виртуалната машина (Java Virtual Machine) – това е абстрактна изчислителна машина, която позволява на компютър да стартирате Java програма. Има три концепции за JVM: Спецификация, имплементация и инстанция. Спецификацията е документ, който формално описва, това което е необходимо за имплентацията на JVM. Имайки само една спецификация, осигурява че всички имплементации на JVM са оперативно съвместими. Имплементация на Java виртуалната машина прилагането е всъщност компютърна програма, която отговаря на изискванията на JVM спецификация. Инстанция на JVM е имплементация работеща в даден процес , който изпълнява компютърна програма компилирана до java байткод.

Преглед на архитектурата на Java виртуалната машина (jvm) на базата на Java Virtual Machine Specification Java SE 7 Edition

Среда за изпълнение на java (Java Runtime Environment) – това е софтуерен пакет, който съдържа това, което се изисква за стартиране на Java програми. Тя включва в себе си имплементация Java виртуална машина(JVM) заедно с имплементация на библиотеките от класове на java(Java Class Library). Корпорацията Oracle, която е собственик на търговска марка на Java, разпространява средата за изпълнение на Java(JRE) с тяхната java виртуална машина(JVM) наречена HotSpot(Java HotSpot Performance Engine).

Java Development Kit (JDK) е надграждане на JRE и съдържа инструменти за разработката на Java приложения, като например компилатора на java код - javac. JDK се предоставя безплатно или директно от Oracle Corporation, или OpenJDK отворен проект, който се надзирава от компанията Oracle.

Java виртуалната машина (JVM) е абстрактен (виртуален) компютър, определен от спецификацията. Тази Спецификация намалява детайлите на имплементацията, които не са от съществено значение за постигане на оперативна съвместимост: в областтите на паметта отговорни за динамичните данни, garbage-collection(Система за почистване на паметта) алгоритми, и всяка вътрешна оптимизация на инструкциите на Java виртуалната машина (превеждането в машинен код). Основната причина за този пропуск е да не се ограничават излишно имплементаторите на JVM. Всяко java-базирано приложение може да работи само в рамките на някаква конкретна реализация на абстрактната спецификация на Java виртуалната машина.[1]

Започвайки с Java Standard Edition (j2se) 5.0, промените в спецификациите на JVM са разработени спрямо Java Community Process(обществен процес за разработка на Java спецификации) като JSR 924.[2] към 2006 годинаКъм 2006 промените в спецификацията подкрепят промените, предлагани за формата на .java файла (JSR 202)[3] се извършва, като релийз за поддръжка – JSR 924. Спецификацията за JVM е публикуванакато „синя книга“,[4] в предговора се казва:

Ние твърдим, че тази спецификация би трябвало много добре да документира Java виртуалната машина, за да направи възможно съвместими clean-room имплементации. Oracle предоставя тестове, които ще определят правилните операции на имплементациите на JVM.

Една от виртуалните машини на Oracle е с името HotSpot, другата, наследена от BEA Systems е Jrockit. Имлементациите на Java с Clean-Room дизайн включват в Kaffe и IBM J9. Oracle притежава търговската марка Java и може да разреши използването ѝ за сертифициране на имплементации, напълно съвместим с Oracle спецификация.

Една от организационните единици за JVM е класа. Имплементацията на Class loader, трябва да бъде в състояние да разпознават и зарежда(load) всичко, което отговаря на клас формата в Java. Всяка имплементация може да разпознава други двоични файлове, различни от .class файловете, но задължително трябва да може да разпознава .class файлове.

Class Loader изпълнява три основни действие в строга последователност:

  1. Loading(Зареждане): открива и добавя(import-ва) двоичните данни за типа
  2. Свързване(Linking): извършва се проверка, подготовка и резолюция (ако е необходимо)
    • Проверка(verification): проверява се коректността на добавения(import-натия) тип
    • Приготвяне(Preparation): заделя (алокира) памет за променливи на класа и инициализира паметта до стойностите по подразбиране(default values)
    • Резолюция(Resolution): трансформира символните референции от даден тип в директни референции.
  3. Инициализация(Initialization): извиква Java код, който инициализира променливите на класа с техните начални стойности.

В крайна сметка, има два вида Class Loader-и bootstrap class loader и дефиниран от потребителя Class Loader.

Всяка имплементация на Java виртуална машина трябва да има bootstrap class loader, който да зареди надеждните класове. Спецификацията на Java виртуалната машина не специфицира как точно Class Loader-а трябва да намери класове.

JVM има инструкции за следните групи задачи:

Целта е binary съвместимост. Всеки конкретен хост - операционна система се нуждае от собствена имплементация на JVM и среда за изпълнение. Тези Java виртуални машини интерпретират байт-код семантично (т.е има еднакво значение/резултата е един и същ), но реалната имплементация може да бъде различна. По-сложно, отколкото просто да се емулира байт-код е имплементацията на Java Core API да е съвместима и ефективна.

Тези инструкции се изпълняват върху множество от общи Шаблон:Vanchor, както и на процесорен код за конкретна процесорна архитектура.

JVM езици редактиране

Език за JVM е всеки език, с функционалност, която може да се изрази по отношение на валиден class файл, който може да бъде поставен на Java виртуалната машина. Файл клас съдържа JVM инструкции (Java байт код) и Таблица на знаците, както и друга помощна информация. Форматът на .class файла е хардуер и операционна система от независими двоичен Формат, използван, за да представи съставен класове и интерфейси.[5]

Има множество JVM езици, както старите езици, пренесени на JVM, така и напълно нови езици. JRuby и Jython са може би, най-известните пренесени на JVM, съществуващи езици, съответно Ruby и python. От новите езици, които бяха създадени от нулата, за да се компилират в байт код на java, Clojure, groovy и и Scala може би са най-популярните от тях. Забележителна черта на JVM езиците е, че те са съвместими един с друг, така че, например, Scala библиотека може да се използва с Java-програми и обратно.[6]

Байт-код интерпретатори и JIT (компилатор в реално време) редактиране

За всяка хардуерна архитектура различен java интерпретатор е нужен. Когато компютърът има инсталиран java байт код интерпретатор, той може да изпълни всички java байт код програми, и една и съща програма може да работи на всеки компютър, който има такъв преводач.

Когато java байт-код се изпълнява с помощта на интерпретатор, изпълнението винаги ще бъде по-бавно, отколкото на изпълнението на същата програма компилирано в машинен език. Този проблем се решава с JIT (just-in time compilers), като се стартира java-байткод. JIT компилаторът може да преведе байт код на java в машинен език по време на изпълнението на програмата. Преведената част от програмата може да се изпълни много по-бързо, отколкото може да се интерпретира. Тази техника се прилага в тези части от програмата, които често се изпълняват. По този начин, JIT компилаторът може значително да ускори общото време за изпълнение.

Java байт-кода е проектиран да бъде независим от платформата и сигурен.[7] В някои реализации на jvm-машини не включват интерпретатор, а се състоят само от JIT компилатор.[8]

JVM в браузър редактиране

Още в началото на процеса на разработка, Java (и jvm) се промотира като уеб-технология за създаване на Rich Internet Applications.

Java-аплети редактиране

От страна на клиента, уеб браузърът може да бъде разширен с NPAPI Java plug-in, който изпълнява така наречените java-аплети вградени в HTML страница. Аплета позволява да се рисува в правоъгълна област на страницата, използвайки ограничен набор от API, които позволяват, например, достъп до потребителя микрофон или 3D ускорение. Java-аплетите са били по-добри от JavaScript, както в производителността и функционалността до около 2011 година, когато JavaScript engine в браузърите стават значително по-бързи и HTML 5 набора от уеб технологии, започна разширяването на JavaScript с нови API-та. Java-аплети, не могат да променят страница извън правоъгълна област, което не е вярно за JavaScript.

Източници редактиране

  1. Bill Venners, Inside the Java Virtual Machine Chapter 5
  2. The Java Community Process(SM) Program – JSRs: Java Specification Requests – detail JSR# 924 // Jcp.org. Посетен на 26 юни 2015.
  3. The Java Community Process(SM) Program – JSRs: Java Specification Requests – detail JSR# 202 // Jcp.org. Посетен на 26 юни 2015.
  4. The Java Virtual Machine Specification (the first and second editions are also available online).
  5. The Java Virtual Machine Specification: Java SE 7 Edition (PDF) // Docs.oracle.com. Посетен на 26 юни 2015.
  6. Frequently Asked Questions – Java Interoperability // Посетен на 18 ноември 2015.
  7. David J. Eck, Introduction to Programming Using Java, Seventh Edition, Version 7.0, August 2014 at Section 1.3 „The Java Virtual Machine“
  8. Oracle JRockit Introduction Архив на оригинала от 2015-09-06 в Wayback Machine. Release R28 at 2.
    Тази страница частично или изцяло представлява превод на страницата Java virtual machine в Уикипедия на английски. Оригиналният текст, както и този превод, са защитени от Лиценза „Криейтив Комънс – Признание – Споделяне на споделеното“, а за съдържание, създадено преди юни 2009 година – от Лиценза за свободна документация на ГНУ. Прегледайте историята на редакциите на оригиналната страница, както и на преводната страница, за да видите списъка на съавторите. ​

ВАЖНО: Този шаблон се отнася единствено до авторските права върху съдържанието на статията. Добавянето му не отменя изискването да се посочват конкретни източници на твърденията, които да бъдат благонадеждни.​