Java virtuelna mašina

Java virtuelna mašina (JVM) je apstraktna računarska mašina koja omogućava računanje računaru za pokretanje Java programa. Postoje tri predstave o JVM: specifikacija, implementacija i instanca. Specifikacija je dokument koji formalno opisuje šta je potrebno od implementacije JVM. Imajući jednu specifikaciju obezbeđeno je da su sve implementacije interoperabilne. Implementacija JVM je kompjuterski program koji zadovoljava zahteve JVM specifikacije. Instanca JVM je implementacija rada u procesu koji izvršava kompjuterski program preveden u Java bajt kodove.

Pregled Java virtuelne mašine (JVM) je arhitektura zasnovana na specifikaciji Java virtuelne mašine Jave SE 7 izdanja

Oraklej korporacija, koja je vlasnik zaštitnog znaka Java, distribuira Java virtuelnu mašinu za implementaciju HotSpota zajedno sa implementacijom klase Java biblioteke pod nazivom Java Rantajm Environment (JRE).

JVM specifikacije

uredi

Java virtuelna mašina je apstraktni (virtuelni) računar koji se definiše specifikacijom. Specifikacija izostavlja detalje implementacije koji nisu neophodni za obezbeđivanje interoperabilnosti. Na primer, raspored memorije na područjima podataka Ran-tajm, algoritam koristi đubretar-kolekciju, i interna optimizacija virtuelne mašine instrukcijama Jave (njihovo prevođenje u mašinski kod). Glavni razlog ovog propusta je da nije nepotrebno ograničavati implementatore. Svaka Java aplikacija se može pokrenuti samo unutar neke konkretne primene apstraktne specifikacije Java virtuelne mašine.[1]

Počevši od Java platforme, standardnog izdanja (J2SE) 5.0, promene u specifikaciji JVM su razvijeni u procesu Java zajednice kao JSR 924.[2]Od 2006. godine, promene u specifikaciji podržane predloženim izmenama u formatu klasa datoteke (JSR 202)[3] se vrše kao održavanje oslobađanja JSR 924. Specifikacija JVM je objavljena kao plava knjiga,[4] Predgovor stanja:

Jedan od Oraklej JVM se zove HotSpot, s druge strane, je nasleđen od BEA sistema je JRokit. Čišćenje sobe Java implementacije uključuje Kafe i IBM J9. Oraklej poseduje zaštitni znak Jave, a može i dozvoliti njeno korišćenje da potvrdi implementaciju delova kao potpuno kompatibilnih sa Oraklej specifikacijom .

Klasa punjač

uredi

Jedna od organizacionih zajednica JVM bajtkodova je klasa. Implementacija platforme klase mora da prepozna i učita sve što je u skladu sa formatom Java klase datoteke. Bilo koja implementacija je slobodna da prepozna druge binarne oblike, pored klase fajlova, ali mora da prepozna klasni fajl.

Klasa platforme obavlja tri osnovne stroge radnje :

  1. Punjenje: pronalazi i uvozi binarne podatke za određeni tip
  2. Povezivanje: vrši proveru, pripremu i (opcionalno) rezoluciju
    • Provera: osigurava ispravnost uvezenih vrsta
    • Priprema: dodeljuje memoriju klasi promenljivih i pokreće memoriju do fabričkih vrednosti
    • Rezolucija: pretvara simboličke reference tipa na direktne reference.
  1. Inicijalizacija: poziva Java kod koji pokreće klase promenljivih na njihove odgovarajuće početne vrednosti.

U principu, postoje dve vrste klasa punjenja: butstrep klasa punjenja i korisničke definisane klase punjenja.

Svaki implementacija Java virtuelne mašine mora imati klase punjenja butstrepova, sposobnih za utovar verovane klase. Specifikacija Java virtuelna mašina ne precizira koliko platformi klasa treba locirati klase.

Instrukcije bajt kodova

uredi

JVM ima instrukcije za sledeće grupe zadataka:

Cilj je binarna kompatibilnost. Svaki posebni domaćin operativnog sistema treba da ima vlastito sprovođenje JVM i rantime. Ove JVM tumače bajt kodove semantički na isti način, ali stvarna realizacija može biti drugačija. Složeniji se ugledaju bajt kodove se kompatibilnošću i efikasno sprovode Java jezgro API koji se mora mapirati svaki glavni operativni sistem.

JVM jezici

uredi
Verzije ne-JVM jezika
Jezik Na JVM
Erlang Erjang
JavaSkript Rino
Paskal Slobodan Paskal
PHP Kverkus
Pajton Jajton
REX NetReks
Rubi JRubi
ŠEMA  Kava
Tcl Jekl
Jezici dizajnirani specijalno za JVM
Jezici
Java 
BBj
BinŠel
Cejlor
Clojure
Fantom
Kotlin
Gruvi
MIDlet Paskal
Skala
Xtend

JVM jezik je bilo koji jezik sa funkcionalnošću koja se može izraziti u smislu važećeg fajla klase koji može biti domaćin Java virtuelnoj mašini. Klasa datoteka sadrži Java virtuelna mašina i uputstva (ili bajt kodove) i tabelu simbola, kao i ostale prateće informacije. Format klase fajl je opremljenosti i operativni sistem nezavisan binarnog formata koristi se za predstavljanje sastavljanja klase i interfejsa.[5] Java 7 JVM implementira JSR 292: podržanjem dinamičnog tipa jezika [6] na Java platformi, nova funkcija koja podržava dinamički otkucan jezik u JVM. Ova funkcija je razvijena u okviru projekta Da Vinčijeve mašine čija je misija da produži JVM tako da ona podržava i druge jezike osim Java.[7][8]

Bajtkod verifikator

uredi

Osnovna filozofija Jave je da je inherentno obezbedi stanovišta da nijedan korisnik programa ne može da sruši domaćin mašinu ili na drugi način neadekvatno ometa sa drugim operacijama na domaćin mašinama, i da je moguće da zaštiti određene metode i strukture podataka koji pripadaju kodu poverenja iz pristupa ili korupcije od strane nepoznatog koda koji se izvršava u istoj JVM. Pored toga, zajedničke programerske greške koje su često doveli do korupcije podataka ili nepredvidivih ponašanja, kao što je pristup van kraj niza ili korišćenje neinicijalizovanog pokazivača nije dozvoljeno da se desi. Nekoliko karakteristika Java kombinuju da obezbedi ovu sigurnost, uključujući klase modela, gomile đubreta-prikupljeni i verifikatora.

JVM verifikuje sve bajtkodove pre nego što je uništen. Ova verifikacija se sastoji uglavnom iz tri vrste provera:

  • Grane su uvek važeće lokacije
  • Podaci se uvek inicijalizuju i reference su uvek siguran tip
  • Pristup privatnim ili paket privatnim podacima metoda je strogo kontrolisan

Prve dva od ovih provera se odvijaju prvenstveno tokom koraka verifikacije koji se javlja kada se klasa učita i stvori pravo korišćenja. Treći se pre svega obavlja dinamički, kada se stvore podataci ili metode klase prvo pristupi drugim klasama.

Verifikator dozvoljava samo neke sekvence bajtkodova u važećim programima, npr skok (grana) uputstvo može ciljati instrukciju u istu metodu. Osim toga, verifikator osigurava da svako dato uputstvo radi na fiksnoj lokaciji skladištenja,[9] omogućavajući JIT prevodiocu transformaciju skladištenja pristupa u registru osnovnih pristupa. Zbog toga, JVM je gomila arhitektura i ne podrazumeva brzinu kaznu za oponašanje na arhitekturi registra zasnovanog kada se koristi JIT prevodilac. U bazi proverenog koda JVM arhitekture, nema razlike u JIT prevodiocu da li dobija po imenu imaginarne registre ili imaginarne pozicije skladištenja koje moraju biti raspoređene na registrima ciljne ekipe arhitekture. U stvari, kod verifikacije čini JVM i razlikuje ga od klasičnih skladištenja arhitektura, od kojih je efikasna emulacija sa JIT prevodiocem komplikovanija i obično obavlja sporije prevod.

Originalna specifikacija verifikatora bajt koda koristi prirodni jezik koji je nepotpun ili netačan u nekim aspektima. Jedan broj pokušaja je učinjen da se odredi JVM kao formalni sistem. Na ovaj način, sigurnost trenutnih implementacija JVM može detaljnije da se analizira, a potencijalni bezbednosni podvizi su sprečeni. Takođe moguće da se optimizira JVM preskačući nepotrebne bezbednosne provere, ako je dokazano da je aplikacija bezbedna .[10]

Sigurno izvršenje dalekog koda

uredi

Virtuelne mašine arhitekture omogućavavaju veoma finu kontrolu nad akcijama koje kod u mašini je dozvoljen. Ovo je dizajnirno da omogući bezbedno izvršavanje koda nepouzdanih udaljenih izvora, model koji koriste Java programčići. Programčići pokrenuti u roku VM iskorporirani u brovseru korisnika, izvršavaju preuzeti koda sa udaljenog HTTP servera. Daljinski kod radi u ograničenom kutijom sa peskom, koja je dizajnirna da zaštiti korisnika od zlih ili zlonamernih kodova. Izdavači mogu kupiti potvrdu za digitalno potpisivanje programčića, dajući im dozvolu da zatraži od korisnika da se probije iz kutije s peskom i pristupi lokalnim sistemima datoteka, ostavi, i izvrši spoljašnje delove softvera ili mreže.

Bajt kod tumač i istovremeno prevodilac

uredi

Za svaku arhitekturu hardvera je potreban drugačiji Java bajt kod interpretator. Kada računar ima Java bajt kod prevodioca, može pokrenuti bilo koji Java bajt kod program, a isti program se može pokrenuti na bilo kom računaru koji ima takvog prevodioca.

Java bajt kod treba da bude nezavisna i bezbedna platforma.[11] Neke implementacije JVM ne uključuju prevodioca, ali se sastoje iz samo istovremenih tumača.[12]

JVM u veb brovserima

uredi

Od ranih fazama procesa projektovanja Jave (i JVM) ona je prodavana kao veb tehnologije za kreiranje bogatih internet aplikacija.

Java programčići

uredi

Na strani klijenta, veb pretraživači mogu biti produženi sa NPAPI Java utikačima koje izvršava tzv. Java programčić u HTML. Programčiću je dozvoljeno da uvuče pravougaoni kraj na stranicu dodeljenu njemu i koristiti ograničen skup API-ja koji omogućavaju na primer pristup mikrofon korisnika ili 3D ubrzanje. Java programčići su superiorniji u odnosu na JavaSkript kako u performansima od 2011. godine, kada su znatno brže napravljeni JavaSkript motori u pretraživačima i HTML 5 paket veb tehnologija počela sa unapređivanjem JavaSkript sa novim API. Java programčići nisu u mogućnosti da izmene stranu izvan njegovih pravougaonih krajeva što nije tačno o JavaSkript Adob Fleš Plejer, glavni takmičar tehnologije, radi na isti način u tom pogledu. Java programčići nisu ograničeni za Java i uopšte mogu biti kreirani u bilo kom JVM jeziku.

U junu 2015, prema V3Tehnologiji, upotreba Java programčića je pala na 0,1% svih veb sajtova. Fleš je pao na 10,8% i Silverlajt na 0,1% veb sajtova.[13]

JavaSkript JVM i prevodioci

uredi

JVM implementacija u JavaScript ne postoje, ali su uglavnom ograničeni na hobi projekte nepodesne za raspoređivanje proizvodnje ili razvojnih alata da se izbegne svaki put kada investitor želi da pregledate napravljene promene.

Kompilacija JavaSkripta

uredi

Sa kontinuiranim poboljšanjima u brzini JavaSkript izvršenja, u kombinaciji sa povećanom upotrebom mobilnih uređaja čiji veb pretraživači ne sprovode podršku za dodatke, postoje napori koji ciljaju na one korisnike kroz kompilaciju za JavaSkript. Moguće je bilo i sastaviti izvorni kod ili JVM bajt kod na JavaSkriptu. Izrada JVM bajt kodva koji su univerzalni za JVM jezika omogućava izgradnju na postojećim bajt kodovima prevodilac.

Glavni JBM bajt kod JavaSkript prevodioca jeTeaVm,[14] prevodilac sadržan u Dragom veb SDK[15] Bck2Brvsr,[16] i j2js-prevodilac.[17]

Vodeći prevodioci JVM jezika u JavaSkriptu uključuju da JavaSkript prevodilac bude sadržan u Gugl veb tulkitut, Clojure skripti (Clojure), GruSkripti (Gruvi), Skala.js (Skala) i drugi.[18]

Java Rantajm Environment Oraklej

uredi

Java rantajm environment (JRE) je objavila Oraklej distribucija softvera koja sadrži samostalan Java VM (Hotspot), brovser plugin, standardne Java biblioteke i alatku za konfiguraciju. To je najčešći Java okruženje instalirano na vindous računarima. To je slobodno dostupno za preuzimanje na sajtu java.com.

Osobine

uredi

Specifikacija JVM daje mnogo prostora implementatorima u vezi detalja implementacije. Od Java 1.3, JRE do Orakleja sadrži JVM pod nazivom HotSpot. On je dizajniran da bude JVM visokih performansi.

Za ubrzano izvršavanje koda, HotSpot se oslanja na istovremenu kompilaciju. Da bi se ubrzala alokaciju objekta i odvoz smeća, HotSpot koristi generacijske gomile.

Generacijske gomile

uredi

Gomila virtuelna Java mašine je područje memorije koju koristi JVM za upravljanje memorijom.[19]

U HotSpot gomile su podeljene na generacije:

  • Mlada generacija skladišti kratkotrajne objekte koji su kreirani i odmah prikuplja smeće.
  • Objekti koji i dalje postoje više su se preselili u starije generacije (takođe poznate i kao redovne generacije). Ova memorija je podeljen u dva prostora gde se čuvaju predmeti koji su preživeli prve i naredne kolekcije za smeće.

Stalna generacija (ili permgen) je korišćena za definicije klase i povezivala metapodatke pre Jave 8. Stalna generacija nije bio deo gomile.[20][21] Stalna generacija je uklonjena iz Jave 8.[22]

Prvobitno je bila stalna generacija, a predmeti i klace su zajedno čuvani u istoj oblasti. Ali, kako se klasa istovara javlja mnogo ređe nego što su predmeti sakupljeni, kreće klasa struktura u određenoj oblasti dozvoljenoj za značajna poboljšanja performansa.[20]

Bezvednost

uredi

Oraklejev JRE je instaliran na velikom broju računara. Pošto svaku veb stranicu korisnik može pokrenuti stranicu Java programčića. Java obezbeđuje lako dostupan napad na površinu zlonamernim sajtovima koje korisnik posećuje. Kasperski Labs navodi da je Java veb brovser plugin metoda izbora kompjuterskih kriminalaca. Java podvizi su uključeni u mnogim koristima paketa koje hakeri raspoređuju na hakovanim sajtovima.[23]

U prošlosti, poslednji korisnici su često koristili zastarelu verziju JRE koja je ranjiva na mnogim poznatim napadima. To je dovelo do širokog zajedničkog uverenja među korisnicima da je Java inherentno nesigurna.[24] Od Java 1.7, Oraklej JRE za vindous uključuje automatsku funkcionalnost ažuriranja.

Tulbarov spor

uredi

Počev od 2005. godine, San (sada Oraklej) JRE uključenja se ne odnose na podrazumevano instalirane softver. U početku je to bilo Gugl tulbar, kasnije MSN tulbar, Jahu tulbar i na kraju Ask tulbar. ASK Tulbar pokazuje da je posebno kontroverzan. Bilo je i peticiju traženih Orakleja da ga uklone. Potpisnici su izrazili svoje uverenje da Oraklej "krši poverenje stotine miliona korisnika koji vode Javu na svojim mašinama. Oni su iskaljali ugled nekada ponosnoj platformi.".[25] Zdnet naziva njihovo ponašanje varljivim, jer je instalater nastavio da nudi alatke tokom svakog ažuriranja, čak i nakon što je korisnik prethodno odbio da ga instalira, povećavajući šanse na traci sa alatkama da se instalira kada bi korisnik bio previše zauzet ili rastrojen.[26]

U junu 2015, Oraklej je objavio da je završio svoje partnerstvo sa Ask.com u korist sa Jahuom!, gde će korisnici biti, i zatražio je da promeni svoju početnu stranu i stave kao podrazumevani pretraživač Jahu. [27]

Vidi još

uredi


Reference

uredi
  1. ^ Bill Venners, Inside the Java Virtual Machine Chapter 5
  2. ^ "The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 924".
  3. ^ "The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 202".
  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).
  6. ^ "The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 292".
  7. ^ "Da Vinci Machine Project".
  8. ^ "New JDK 7 Feature: Support for Dynamically Typed Languages in the Java Virtual Machine".
  9. ^ "The Verification process".
  10. ^ Stephen N. Freund and John C. Mitchell. 1999.
  11. ^ David J. Eck, Introduction to Programming Using Java, Seventh Edition, Version 7.0, August 2014 at Section 1.3 "The Java Virtual Machine"
  12. ^ Oracle JRockit Introduction Arhivirano na sajtu Wayback Machine (6. septembar 2015) Release R28 at 2.
  13. ^ "Historical yearly trends in the usage of client-side programming languages, June 2015".
  14. ^ "TeaVM project home page".
  15. ^ "Dragome Web SDK".
  16. ^ "Bck2Brwsr - APIDesign".
  17. ^ Wolfgang Kuehn (decatur). j2js-compiler GitHub
  18. ^ "List of languages that compile to JS · jashkenas/coffeescript Wiki · GitHub".
  19. ^ "Frequently Asked Questions about Garbage Collection in the Hotspot Java Virtual Machine".
  20. ^ a b Masamitsu, Jon (28 November 2006).
  21. ^ Nutter, Charles (11 September 2008).
  22. ^ "JEP 122: Remove the Permanent Generation".
  23. ^ "Is there any protection against Java exploits? Arhivirano na sajtu Wayback Machine (4. mart 2016)
  24. ^ "What Is Java, Is It Insecure, and Should I Use It?" Arhivirano na sajtu Wayback Machine (8. novembar 2015).
  25. ^ "Petition to Unbundle Ask Bar from Java".
  26. ^ Bott, Ed (2013-01-22).
  27. ^ "Yahoo Tries to Hook Search Users Via Java Updates".

Literatura

uredi

Spoljašnje veze

uredi