Cum se configurează smartphone-uri și PC-uri. Portal informativ

Instalarea unei mașini java. JVM (mașină virtuală Java)

Poate fi compilat în bytecode Java, care poate fi apoi executat de JVM.

JVM-ul este o componentă cheie a platformei Java. Deoarece mașinile virtuale Java sunt disponibile pentru multe platforme hardware și software, Java poate fi considerat atât ca middleware, cât și ca o platformă în sine, de unde principiul „scrie o dată, rulează oriunde”. Utilizarea unui bytecode pentru multe platforme permite ca Java să fie descris ca „compilați o dată, rulați oriunde”.

Specificația JVM

Confruntare dintre Sun și IBM

În 2001, cu scopul de a dezvolta un standard pentru aplicații desktop multiplatforme, Eclipse.

IBM VisualAge. IBM a reușit să echilibreze interesele comunității libere și interesele afacerilor (interesele acesteia) în Eclipse Public License, recunoscută de FSF.

Proiectul se dezvoltă cu succes, este recunoscut de industrie și s-a separat în mare măsură de IBM în fundația independentă Eclipse.


Fundația Wikimedia. 2010.

Vedeți ce este „Mașina virtuală Java” în alte dicționare:

    mașină virtuală Java- Partea principală a spectacolului sisteme Java(Java Runtime Environment; JRE). Java Virtual Machine interpretează și execută codul de octeți Java generat anterior din codul sursă al unui program Java de către un compilator Java. JVM poate fi folosit pentru... - dezvoltat de JavaSoft. Aplicațiile web create folosindu-l pot rula nativ în sistemul de operare sau browser web, sau într-un mediu de emulare cunoscut sub numele de Java Virtual Machine... Dicţionar E-Business

    - (JPF) un instrument gratuit pentru testarea programelor Java multi-threaded. În esență, este o mașină virtuală Java pe baza căreia sunt implementate metode de verificare a modelului. Aceasta înseamnă că... ... Wikipedia

    mașină virtuală Java- Interpret de cod byte pentru programe Java. O mașină virtuală concepută pentru a executa applet-uri Java. JVM-ul este încorporat în majoritatea browserelor web. Acest lucru vă permite să executați aplicații Java pe partea client, ale căror apeluri sunt furnizate în ... ... Ghidul tehnic al traducătorului

    Un alt nume pentru acest concept este „Java”; vezi și alte sensuri. A nu se confunda cu JavaScript. Clasa de limbaj Java... Wikipedia

    Este necesar să verificați calitatea traducerii și să aduceți articolul în conformitate cu regulile stilistice ale Wikipedia. Puteți ajuta la îmbunătățirea acestui articol prin corectarea erorilor. Original n... Wikipedia

JVM-ul este o componentă cheie a platformei Java. Java Virtual Machine interpretează și execută bytecode Java pregenerat din textul sursă al unui program Java de către compilatorul Java (javac).

Deoarece mașinile virtuale Java sunt disponibile pentru multe platforme hardware și software, Java poate fi considerat atât ca middleware, cât și ca o platformă în sine, de unde principiul „scrie o dată, rulează oriunde”. Utilizarea unui singur bytecode pe mai multe platforme permite ca Java să fie descris ca „compilați o dată, rulați oriunde”.

Programele destinate să ruleze pe JVM trebuie să fie compilate într-un format binar portabil standardizat, care este de obicei reprezentat ca fișiere .class. Un program poate consta din mai multe clase situate în fișiere diferite. Pentru a facilita găzduirea de programe mari, unele fișiere .class pot fi împachetate într-un așa-numit fișier .jar (prescurtare de la Java Archive).

Mașina virtuală JVM execută fișiere .clasă sau .borcan, emulând instrucțiunile scrise pentru JVM prin interpretarea sau utilizarea unui compilator just-in-time (JIT), cum ar fi HotSpot de la microsistemele Sun. În zilele noastre, compilarea JIT este utilizată în majoritatea JVM-urilor pentru a obține o viteză mai mare. Există, de asemenea, compilatoare anticipate care permit dezvoltatorilor de aplicații să precompileze fișierele de clasă în cod nativ specific platformei.

JVM, care este o instanță a JRE (Java Runtime Environment), intră în joc atunci când este executat programe Java. După finalizarea execuției, această instanță este ștearsă de colectorul de gunoi. JIT este o parte a mașinii virtuale Java care este utilizată pentru a accelera timpul de execuție a aplicațiilor. JIT compilează simultan părți ale bytecode care au funcționalități similare și, prin urmare, reduce timpul necesar pentru compilare.

JVM-ul este o mașină de stivă. Aceasta înseamnă că nu există registre de uz general, iar operațiunile sunt efectuate pe datele aflate pe stivă. Acest scop este servit de o stivă de operanzi alocată în cadrul fiecărui cadru. Când sunt executate comenzi Java bytecode care modifică datele, operanzii acelor comenzi sunt scoși din stiva de operanzi, iar rezultatele comenzilor sunt împinse în aceeași stivă.

Timpul de execuție al unei metode conține informațiile necesare pentru legarea dinamică, returnarea metodei și gestionarea excepțiilor. Codul clasei (găzduit în domeniul de aplicare al clasei) accesează metode și variabile externe folosind legături simbolice. Legătura dinamică convertește legăturile simbolice în legături reale. Mediul de execuție conține referințe la tabelul simbol al metodei, prin care se fac apeluri la metode și variabile externe.

Runtime-ul conține, de asemenea, informațiile necesare pentru a reveni dintr-o metodă: un pointer către cadrul metodei apelante, valoarea registrului computerului de returnat, conținutul registrelor metodei apelante și un pointer către zona pentru a scrie valoarea returnată.

Informațiile de tratare a excepțiilor conțin referințe la secțiunile de tratare a excepțiilor ale unei metode de clasă.

Runtime face, de asemenea, referințe la datele conținute în zona de clasă, inclusiv constante și variabile de clasă.

Instrucțiunile JVM constau dintr-un cod operațional de un bit și pot conține, de asemenea, operanzi. Numărul și dimensiunea operanzilor sunt determinate de codul operațional; unele instrucțiuni nu au operanzi

Ce este JVM?

JVM este un motor care oferă un mediu de rulare pentru a conduce codul sau aplicațiile Java. Acesta convertește bytecode Java în limbaj de mașini. JVM face parte din JRE (Java Run Environment). Aceasta înseamnă Java Virtual Machine

  • În alte limbaje de programare, compilatorul produce cod de mașină pentru un anumit sistem. Cu toate acestea, compilatorul Java produce cod pentru o mașină virtuală cunoscută sub numele de mașină virtuală Java.
  • În primul rând, codul Java este compilat în bytecode. Acest bytecode este interpretat pe diferite mașini
  • Între gazdă sistem și Sursă Java, Bytecode este un limbaj intermediar.
  • JVM este responsabil pentru alocarea spațiului de memorie.

În acest tutorial, veți învăța-

Arhitectura JVM

Să înțelegem Arhitectura JVM. Acesta conține classloader, zonă de memorie, motor de execuție etc.

1) ClassLoader

Încărcătorul de clasă este un subsistem folosit pentru încărcarea fișierelor de clasă. Îndeplinește trei funcții majore și anume. Încărcare, conectare și inițializare.

2) Zona Metodă

Zona de metode JVM stochează structuri de clasă, cum ar fi metadate, pool-ul constant de rulare și codul pentru metode.

Toate obiectele, variabilele de instanță aferente acestora și matricele sunt stocate în heap. Această memorie este comună și partajată în mai multe fire.

4) Stive de limbaj JVM

Stivele de limbaj Java stochează variabile locale și sunt rezultate parțiale. Fiecare thread are propria sa stivă JVM, creată simultan pe măsură ce este creat firul. Un nou cadru este creat ori de câte ori este invocată o metodă și este șters când procesul de invocare a metodei este finalizat.

5) Registre PC

Registrul PC stochează adresa instrucțiunii mașinii virtuale Java care se execută în prezent. În Java, fiecare fir are un registru PC separat.

6) Stive de metode native

Stivele de metode native dețin instrucțiunile codului nativ depinde de biblioteca nativă. Este scris într-o altă limbă în loc de Java.

7) Motor de execuție

Este un tip de software folosit pentru a testa hardware, software sau sisteme complete. Motorul de execuție a testului nu conține niciodată informații despre produsul testat.

8) Interfață Native Method

Interfața Native Method este un cadru de programare. Permite apelarea codului Java care rulează într-un JVM de către biblioteci și aplicații native.

9) Biblioteci cu metode native

Native Libraries este o colecție de Native Libraries (C, C++) care sunt necesare pentru Execution Engine.

Procesul de compilare și execuție a codului software

Pentru a scrie și a executa un program software, aveți nevoie de următoarele

1) Editor– Pentru a introduce programul, ar putea fi folosit un bloc de note

2) Compilator– Pentru a converti programul în limbaj înalt în cod nativ de mașină

3) Linker– Pentru a combina diferite fișiere de program referință în programul principal împreună.

4) Încărcător– Pentru a încărca fișierele de pe dispozitivul de stocare secundar, cum ar fi Hard disk, Flash Drive, CD în RAM pentru execuție. Încărcarea se face automat când executați codul.

5) Executarea– Execuția efectivă a codului care este gestionată de sistemul de operare și procesorul dumneavoastră.

Cu acest fundal, consultați următorul videoclip și aflați funcționarea și arhitectura mașinii virtuale Java.

Procesul de compilare și execuție a codului C

Pentru a înțelege procesul de compilare Java în Java. Să luăm mai întâi un o privire rapida la procesul de compilare și legare în C.

Să presupunem că, în principal, ați apelat două funcții f1 și f2. Funcția principală este stocată în fișierul a1.c.

Funcția f1 este stocată într-un fișier a2.c

Funcția f2 este stocată într-un fișier a3.c

Toate aceste fișiere, adică a1.c, a2.c și a3.c, sunt transmise compilatorului. A cărui ieșire sunt fișierele obiect corespunzătoare care sunt codul mașinii.

Următorul pas este integrarea tuturor acestor fișiere obiect într-un singur fișier .exe cu ajutorul linkerului. Linker-ul va combina toate aceste fișiere și va produce fișierul .exe.

În timpul rulării programului, un program de încărcare va încărca a.exe în RAM pentru execuție.

Compilarea și execuția codului Java în VM Java

Să ne uităm la proces pentru JAVA. În principal, aveți două metode f1 și f2.

  • Metoda principală este stocată în fișierul a1.java
  • f1 este stocat într-un fișier ca a2.java
  • f2 este stocat într-un fișier ca a3.java

Compilatorul va compila cele trei fișiere și va produce 3 fișiere .class corespunzătoare care constă din codul BYTE. Spre deosebire de C, nu se face nicio legătură.

Java VM sau Java Virtual Machine se află pe RAM. În timpul execuției, folosind încărcătorul de clasă, fișierele de clasă sunt aduse pe RAM. Codul BYTE este verificat pentru orice încălcare a securității.

Apoi, motorul de execuție va converti Bytecode în cod nativ de mașină. Aceasta este compilarea la timp. Este unul dintre motivele principale pentru care Java este relativ lent.

NOTĂ: JIT sau Compilatorul Just-in-time face parte din Java Virtual Machine (JVM). Acesta interpretează o parte din codul octet care are o funcționalitate similară în același timp.

De ce este Java atât limbajul interpretat, cât și limbajul compilat?

Limbajele de programare sunt clasificate ca
  • Limbaj de nivel superior Ex. C++, Java
  • Limbi de nivel mediu Ex. C
  • Limbaj de nivel scăzut Ex Assembly
  • în cele din urmă cel mai de jos nivel ca Limbajul Mașinii.

A compilator este un program care convertește un program de la un nivel de limbaj la altul. Exemplu de conversie a programului C++ în cod mașină.

Compilatorul java convertește codul java de nivel înalt în bytecode (care este, de asemenea, un tip de cod de mașină).

Un interpret este un program care convertește un program la un nivel într-un alt limbaj de programare la acelasi nivel. Exemplu de conversie a programului Java în C++

În Java, generatorul Just In Time Code convertește bytecode în codul mașină nativ care se află la aceleași niveluri de programare.

Prin urmare, Java este atât limbaj compilat, cât și interpretat.

De ce Java este lent?

Cele două motive principale din spatele încetinirii Java sunt

  1. Legătura dinamică: Spre deosebire de C, legarea se face în timpul execuției, de fiecare dată când programul este rulat în Java.
  2. Interpret de rulare: Conversia codului de octeți în cod de mașină nativ se face în timpul rulării în Java, ceea ce încetinește viteza

Cu toate acestea, cea mai recentă versiune de Java a abordat blocajele de performanță într-o mare măsură.

rezumat:

  • JVM sau Java Virtual Machine este motorul care conduce codul Java. Acesta convertește bytecode Java în limbaj de mașini.
  • În JVM, codul Java este compilat în bytecode. Acest bytecode este interpretat pe diferite mașini
  • JIT sau compilatorul Just-in-time face parte din Java Virtual Machine (JVM). Este folosit pentru a accelera timpul de execuție
  • În comparație cu alte mașini de compilare, Java poate fi lentă în execuție.
JVM (Java Virtual Machine) - baza limbajului Programare Java. Mediul Java constă din cinci elemente:
■ Limbajul Java
■ Definiția bytecode
■ Biblioteci de clase Java/Sun
■ Mașină virtuală Java
■ Structura fișierului .class

Dintre toate aceste cinci elemente, elementele care au dus la succesul Java
■ Definirea bytecode,
■ file structure.class,
■ și Java Virtual Machine.

Astfel, „scrieți o dată și rulați oriunde” a fost de fapt posibil prin portabilitatea fișierului .class, care facilitează execuția pe orice computer sau chipset folosind Java Virtual Machine.

1.3.1 Ce este Java Virtual Machine?

O mașină virtuală este un software bazat pe conceptele și ideea unui computer imaginar care are un set logic de instrucțiuni și comenzi care definesc operațiunile computerului respectiv. Este, s-ar putea spune, un sistem de operare mic. Ea modelează nivelul cerut abstracții în care se realizează independența față de platforma și echipamentele utilizate.

Compilatorul convertește text originalîn cod care se bazează pe setul de instrucțiuni imaginare al computerelor și nu depinde de specificul procesorului. Un interpret este o aplicație care înțelege aceste fluxuri de comandă și traduce aceste comenzi pentru hardware-ul utilizat, căruia îi aparține interpretul. JVM creează un sistem de rulare intern care ajută codul să se execute când
■ încărcarea fișierelor .class,
■ managementul memoriei
■ efectuarea tratării excepţiilor.

Din cauza inconsecvenței platformelor hardware, o mașină virtuală folosește conceptul de stivă, care conține următoarea informație:
■ Descriptori de stare a metodei
■ Operanzi la coduri de octet
■Parametrii metodei
■ Variabile locale

Când codul este executat folosind JVM, există un registru special care este folosit ca numărător, indicând comenzile care se execută în prezent. Dacă este necesar, comenzile modifică programul, schimbând fluxul de execuție, în caz contrar fluxul este secvențial și trece de la o comandă la alta.

Un alt concept care devine popular este utilizarea unui compilator Just In Time (JIT). Browsere precum Netscape Navigator 4.0 și Internet Explorer 4.0 includ compilatoare JIT care măresc viteza de execuție a codului Java. Scopul principal al JIT este de a converti setul de instrucțiuni bytecode în instrucțiuni de cod de mașină care vizează un anumit microprocesor. Aceste comenzi sunt stocate și utilizate ori de câte ori se face o solicitare către acea metodă specifică.

1.3.2 Java runtime

JRE (Java Runtime Environment) JVM interacționează cu hardware-ul pe de o parte și cu programul pe de altă parte. JRE rulează cod compilat pentru JVM:
Se încarcă fișiere .class
S-a terminat folosind „Class Loader”
Încărcătorul de clasă efectuează o verificare de securitate dacă fișierele sunt utilizate în rețea.
Verificare bytecode
Efectuat de un „verificator de bytecode”
Un verificator de bytecode verifică formatul codului, conversiile tipului de obiect și verifică dacă există încălcări ale accesului.
Cod de executare
Executat „de către interpret în timpul execuției”
Interpretul execută bytecode-urile și face cereri pentru hardware-ul utilizat.


Figura 1.3: Java Runtime Environment

1.3.3 Gestionarea excepțiilor și gestionarea memoriei

În C, C++ sau Pascal, programatorii au folosit metode primitive pentru alocarea și eliberarea blocurilor de memorie - memoria dinamică. Memoria dinamică este o bucată mare de memorie, care este desemnată în volumul întregii memorie.

Se folosește memoria dinamică:
Blocklist gratuit
Listă de blocuri distribuite

Lista liberă verifică un bloc de memorie ori de câte ori se face o solicitare. Mecanismul de alocare utilizat este metoda „first fit”, prin care primul cel mai mic bloc de memorie este alocat în funcție de cerere. Această procedură alocă și eliberează cantități mici de memorie de diferite dimensiuni din heap, minimizând în același timp fragmentarea heap.

Există o etapă în care se face o cerere de memorie pentru a obține un bloc de memorie mai mare decât este disponibil. În astfel de cazuri, managerul heap trebuie să creeze mai multă memorie. Această tehnică se numește compactare. Acesta este procesul prin care toate blocurile de memorie disponibile libere sunt combinate împreună prin mutare memorie libera un capăt al memoriei dinamice, creând astfel un bloc mare de memorie.

Mașina virtuală Java utilizează două heap-uri separate pentru alocarea memoriei statice și dinamice.

Memoria dinamică - Nu gestionează excepțiile memoriei dinamice, care păstrează toate proprietățile clasei, pool-ul persistent și tabelele de metode.

A doua memorie dinamică este din nou împărțită în două secțiuni, care pot fi extinse directii opuse când e nevoie. O partiție este folosită pentru a stoca instanțe ale obiectelor, iar cealaltă partiție este folosită pentru a stoca handle-uri pentru acele instanțe. Un descriptor este o structură care constă din doi pointeri. Indicați spre un tabel cu metode obiect și alte elemente către un exemplu al acelui obiect. Acest aranjament elimină în esență nevoia de a menține căi care indică către un obiect atunci când se modifică pointerii după compactare. Tot ce trebuie să facem este să actualizăm valoarea indicatorului de mâner.

Algoritmul de tratare a excepțiilor este aplicat obiectelor plasate în memoria dinamică. Pe măsură ce se primește o solicitare pentru un bloc de memorie, managerul heap verifică mai întâi lista liberă și dacă managerul heap nu poate găsi blocuri de memorie libere, gestionarea excepțiilor este invocată de îndată ce sistemul a fost inactiv pentru o perioadă suficientă de timp. În cazurile în care aplicațiile sunt extrem de interactive și timpul de nefuncționare a sistemului este menținut la minimum, gestionarea excepțiilor ar trebui să fie apelată în mod explicit de către aplicație.

Colectorul de excepții apelează metoda de terminare înainte ca un obiect eșantion să fie colectat utilizând gestionarea excepțiilor. Metoda de terminare este folosită pentru curățare resurse externe cum ar fi fișierele și fluxurile care sunt deschise și nu sunt îngrijite în prelucrare standard exceptii. Chiar dacă numim în mod explicit gestionarea excepțiilor pe metoda (System.gc()), aceasta nu va funcționa rapid. Este doar menit să funcționeze. Aceasta înseamnă, de asemenea, că gestionarea excepțiilor nu poate fi apelată. Acest lucru se datorează faptului că firele de execuție de gestionare a excepțiilor rulează cu prioritate foarte scăzută și pot fi întrerupte frecvent. Acest lucru se poate întâmpla atunci când obiectul nostru nu a fost niciodată localizat în memorie înainte.

Cele mai bune articole pe această temă