Dynaaminen kääntäminen ja Java HotSpot

Samankaltaiset tiedostot
.NET ajoympäristö. Juha Järvensivu 2007

Virtuaalikoneiden generointi Vmgen-kääntäjällä

11/20: Konepelti auki

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

Dart. Ryhmä 38. Ville Tahvanainen. Juha Häkli

4. Luokan testaus ja käyttö olion kautta 4.1

4. Lausekielinen ohjelmointi 4.1

Common Language Runtime

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

ELM GROUP 04. Teemu Laakso Henrik Talarmo

5. HelloWorld-ohjelma 5.1

5. HelloWorld-ohjelma 5.1

Ohjelmistojen testaus ja hallinta. Gradle

Kieliversiointityökalu Java-ohjelmistoon. Ohje

BlueJ ohjelman pitäisi löytyä Development valikon alta mikroluokkien koneista. Muissa koneissa BlueJ voi löytyä esim. omana ikonina työpöydältä

8. Näppäimistöltä lukeminen 8.1

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Oppimistavoitteet kurssilla Tietokoneen toiminta

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen

Virtualisointiympäristössä on kolme pääosaa: isäntä (host), virtualisointikerros ja vieras (guest).

Käännös, linkitys ja lataus

TIE Principles of Programming Languages CEYLON

Ohjelmointi 1. Kumppanit

4. Lausekielinen ohjelmointi 4.1

8. Näppäimistöltä lukeminen 8.1

811312A Tietorakenteet ja algoritmit, , Harjoitus 3, Ratkaisu

Ohjelmointi 1 / syksy /20: IDE

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

.NET ja C# Virtuaalikone. Common Language Infrastructure (CLI) Periaate. Etuja. Haittoja. Mikä on CLI. CLI standardin merkitys (CLS, Ecma)

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. FT Ari Viinikainen

Ongelma(t): Miten jollakin korkeamman tason ohjelmointikielellä esitetty algoritmi saadaan suoritettua mikro-ohjelmoitavalla tietokoneella ja siinä

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

CUDA. Moniydinohjelmointi Mikko Honkonen

Soveltuvuustutkimus Lifebelt-ohjelman ideologian käytettävyydestä olioorientoituneeseen

GIS-automatisointi ja ohjelmointi/skriptaus. Harri Antikainen

Kahden virtualisointiohjelmiston suorituskyvyn testaus (valmiin työn esittely)

Clojure, funktionaalinen Lisp murre

Tulkinta ja emulointi

12. Näppäimistöltä lukeminen 12.1

Sisällys. 16. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. Aritmetiikkaa toisin merkiten

16. Ohjelmoinnin tekniikkaa 16.1

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

Älysopimusten kehittäminen. Sopimus suuntautunut ohjelmointi

16. Ohjelmoinnin tekniikkaa 16.1

Tinkimätöntä tietoturvaa kaikkiin virtuaaliympäristöihin

Javaohjelmien suoritus (3) Jakso 11 Tulkinta ja emulointi. Java-virtuaalikone (JVM) (5) JVM:n tietorakenteet (8) JVM:n tietorakenteet (jatkuu) (6)

JAVA on ohjelmointikieli, mikä on kieliopiltaan hyvin samankaltainen, jopa identtinen mm. C++

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä

Interaktiivisten järjestelmien arkkitehtuuriratkaisu, jolla käyttöliittymä erotetaan sovelluslogiikasta.

Käyttöjärjestelmien historia. Joni Herttuainen Henri Jantunen Markus Maijanen Timo Saksholm Johanna Tjäder Eetu Turunen

Interaktiivisten järjestelmien arkkitehtuuriratkaisu, jolla käyttöliittymä erotetaan sovelluslogiikasta.

ITKA203 Käyttöjärjestelmät, kesä Kesäkurssi Opettaja: Paavo Nieminen

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Integrointi. Ohjelmistotekniikka kevät 2003

Sisällys. 16. Lohkot. Lohkot. Lohkot

15. Ohjelmoinnin tekniikkaa 15.1

samalla seuraavaan puoliavaruuteen (sukupolveen), jota siivotaan harvemmin.

Ohjelmistotekniikan menetelmät, Ohjelmistotuotannon työkaluista

4.2. ALIOHJELMAT 71. Tulosvälitteisyys (call by result) Tulosvälitteinen parametri kopioidaan lopuksi

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

TIEA255 Tietotekniikan teemaseminaari ohjelmointikielet ja kehitysalustat. Antti-Juhani Kaijanaho. 16. helmikuuta 2011

Onnistunut ohjelmistoprojekti

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Sisällys. 17. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. for-lause lyhemmin

Testiraportti Android virtuaalikone vs. natiivikoodi Ville Laine, Delta 23

15. Ohjelmoinnin tekniikkaa 15.1

Testauksen tuki nopealle tuotekehitykselle. Antti Jääskeläinen Matti Vuori

Pong-peli, vaihe Aliohjelman tekeminen. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana

12. Monimuotoisuus 12.1

Erlang. Miika Heinonen ja Lassi Uosukainen (Group 92) TIE Principles of Programming Languages Seminaariessee. Yleistä

Sisällys. 15. Lohkot. Lohkot. Lohkot

Ohjelmiston testaus ja laatu. Ohjelmistotekniikka elinkaarimallit

Luento 11 Tulkinta ja emulointi

Tietokanta (database)

2 Konekieli, aliohjelmat, keskeytykset

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

Objective-C. Ryhmä 35: Ilpo Kärki Aleksi Pälä

Staattinen metaohjelmointi

Ongelma(t): Miten tietokoneen käyttöjärjestelmä toimii sisäisesti, jotta resurssit saadaan tehokkaaseen käyttöön?

13/20: Kierrätys kannattaa koodaamisessakin

Tulkkauspalvelut maahanmuuttajille Ohjeita maahanmuuttajille ja viranomaisille

Oliot ja tyypit. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

Ohjelmoinnin perusteet, syksy 2006

Arkkitehtuurikuvaus. Ratkaisu ohjelmistotuotelinjan monikielisyyden hallintaan Innofactor Oy. Ryhmä 14

Ohjelmoinnin perusteet Y Python

SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T

Ongelma(t): Jotta tietokone olisi mahdollisimman yleiskäyttöinen ja suorituskykyinen, niin miten tietokoneen resurssit tulisi tarjota ohjelmoijalle,

Ohjelmistojen mallintaminen

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

Java ohjelmien suoritus (3) Luento 11 Tulkinta ja emulointi. Java virtuaalikone (JVM) (5) JVM:n tietorakenteet (8) JVM:n tietorakenteet (jatkuu) (6)

Arkkitehtuurikuvaus. Ratkaisu ohjelmistotuotelinjan monikielisyyden hallintaan Innofactor Oy. Ryhmä 14

TIETOKANNAT: MYSQL & POSTGRESQL Seminaarityö

Tietokoneen toiminta (Computer Organization I)

Tietokoneen toiminta (Computer Organization I)

Tulkkauspalvelut maahanmuuttajille

Transkriptio:

Dynaaminen kääntäminen ja Java HotSpot Jukka Eskola Kimmo Kulovesi Tatu Säily Helsinki 11.4.2005 HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Sisältö 1. Johdanto...1 1.1 JIT-kääntäjän ongelmat...2 2. Dynaaminen kääntäminen...3 2.1 Toiminta ja hyödyt...3 2.2 Käyttötavat...4 3. HotSpot ja dynaaminen kääntäminen...5 3.1 Profiloija...6 3.2 Dynaaminen kääntäjä...6 3.3 Käytännön suorituskyky...7 4. Yhteenveto...8 5. Lähteet...8

1. Johdanto Sun Microsystemsin v. 1990 aloittaman tutkimusprojektin tuotoksena syntynyt Javaohjelmointikieli on yksi merkittävimmistä viime aikojen teknisistä innovaatioista tietotekniikan ja erityisesti ohjelmoinnin alalla. Java yhdistää yhteen kieleen useita muiden ohjelmointikielien ominaisuuksia, joista mainittakoon olio-ohjelmointi ja alustasta riippumattomuus siirrettävyydessä. Java-kielinen lähdekoodi (.java) käännetään ensin kääntäjällä.class-tiedostoksi eli Javatavukoodiksi, jota voidaan sitten haluttaessa suorittaa eri alustoilla Javan virtuaalikoneella (engl. Java Virtual Machine, lyh. JVM). Alunperin JVM:n toteutukset suorittivat tavukoodia mm. tulkkaukseen tai Just-In-Time (JIT) kääntämiseen perustuen. Tulkkaukseen perustuvan JVM-toteutuksen lisäksi on siis kehitetty useita suoritustekniikoita mm. pienentämään Java-ohjelmien suoritusaikaa. Kuvassa 1 on esitelty vaihtoehtoisia JVM:n käyttämiä tekniikoita. Kuva 1: Vaihtoehtoisia tekniikoita suorittaa Java-tavukoodia [2]. Alkuperäinen tapa suorittaa Java tavukoodia on ollut tehdä se Java-tulkin (interpreter) avulla. Tulkki emuloi eli matkii kohdeprosessorin operaatioita suorittamalla JVMohjelmaa. Toisin sanoen, suorituksessa oleva JVM-ohjelma lukee ja suorittaa käyttäjän tekemän Java-ohjelman jokaisen tavukoodin järjestyksessä. Tulkkauksessa on muutamia 1

etuja verrattuna perinteisesti käännettyyn suorittamistapaan; se ei vaadi paljoakaan muistia ja se on suhteellisen yksinkertainen toteuttaa. Vastaavasti huonona puolena voidaan yleisesti pitää suorituksen hitautta. Toinen tapa suorittaa Java-ohjelmia on tehdä se kääntäjällä, joka kääntää Java-tavukoodia natiiviksi konekieleksi. Aivan kuten korkean tason ohjelmointikielten kääntäjät, ns. suora Java -kääntäjä (a direct Java compiler) aloittaa kääntämisen lähdekoodista (tai vaihtoehtoisesti tavukoodista) ja tuottaa sen kohdekoneen prosessorilla suorittavaksi konekieleksi [1]. Koska käännös tehdään staattisesti, niin kääntäjä voi käyttää perinteisiä optimointitekniikoita (yleensä aikaavieviä) parantaakseen käännetyn koodin suorittamista, sen suoritusaikaa ja esitysmuotoa. Just-In-Time eli JIT-kääntäjä (JIT compiler) sitä vastoin kääntää dynaamisesti Javan tavukoodia suorituksen aikana ja voi käyttää erilaisia optimointitekniikoita nopeuttamaan natiivin konekielen suorittamista. Pääasiallinen ero suoran Java-kääntäjän ja JIT-kääntäjän välillä on se, että JIT-kääntäjä suorittaa kääntämisen tavukoodista jokaisella ajokerralla erikseen. 1.1 JIT-kääntäjän ongelmat JIT-kääntäjä parantaa tuntuvasti tavukoodin suoritusnopeutta kääntämällä sen ensiksi natiiviksi konekieleksi ja tekemällä siihen jonkinasteista optimointia ennen sen varsinaista suoritusta. Sitä osaa Java-ohjelman tavukoodista, jota ei suoriteta ei myöskään käännetä, joten JIT ei tuhlaa turhaan aikaan sellaisen koodin optimoimiseen, jota ei koskaan suoriteta. Koska Java-ohjelman kokonaissuoritusaika on yhdistelmä käännökseen ja virtuaalikoneen suorittamiseen kuluvaa aikaa, on JIT-kääntäjän tasapainoiltava toisaalta ajan kanssa, jonka se kuluttaa generoidun koodin optimointiin, ja toisaalta ajan kanssa, jonka se säästää optimoinnilla. Yksi koodin optimointia rajoittava tekijä on kääntämisen näkyvyyssäännöt. Koska kääntäminen tapahtuu vaadittaessa yhdelle luokalle tai metodille kerrallaan, on JITkääntäjän vaikea suorittaa ei-paikallisia optimointeja. Rajoituksista huolimatta JIToptimoinnit ovat yleensä melko yksinkertaisia. 2

Vaikka JIT-kääntäjät ovat yleensä aikavaativuudeltaan tehokkaampia kuin tulkit, niin tulkkien käytölle löytyy toki vielä etuja. Yksi näistä eduista on sen parempi soveltuvuus ohjelmille, joista korjataan tai jäljitetään virheitä (engl. debugging). Toinen etu on se, että tulkki kääntää esim. metodista ainoastaan ne käskyt, joita todellisuudessa tarvitaan suorituksessa, kun taas JIT kääntää koko metodin samalla kertaa. Varsinkin silloin, jos aina vain pientä osaa metodin sisältämästä tavukoodista suoritetaan ja metodia suoritetaan harvoin, niin sitä aikaa, joka kuluu JIT-kääntämiseen ei koskaan kaapata takaisin suoritusajan alenemisella. Koska JIT-kääntäjä yleensä optimoi kaiken minkä se näkee, niin paljon aikaa saatetaan kuluttaa ihan turhaan mm. alustuskoodien ja ns. kertakäyttömetodien optimoimiseen. Dynaaminen kääntäminen pyrkii paikkaamaan sekä tulkkaamisen että JIT-kääntämisen ongelmia yhdistämällä niiden parhaat puolet. Sun Microsystemsin kehittämä Java HotSpot Virtual Machine [3] on Java-virtuaalikone, joka sisältää tavukooditulkin lisäksi myös dynaamisen kääntäjän. Sen tavoitteena alunperin oli parantaa muistin käyttöä, tehostaa roskienkeruuta sekä optimoida muutenkin virtuaalikoneen suoritusta. Java HotSpotin perusideana on optimoida vain se koodin osa, jota suoritetaan säännöllisesti ja usein (ns. hotspotit). 2. Dynaaminen kääntäminen Joissakin teksteissä dynaamista kääntämistä käytetään myös JIT-kääntämisen synonyymina [4], mutta tässä sillä tarkoitetaan ainoastaan sellaista kääntäjää, joka kerää ajon aikana tietoa ohjelman rakenteesta ja käyttää sitä suorituksen tehokkuuden parantamiseen. 2.1 Toiminta ja hyödyt Dynaamisella kääntämisellä pyritään virtuaalikoneiden yhteydessä korjaamaan JITkääntämisen ongelmana oleva huonosti optimoitu konekielinen koodi, joka aiheutuu siitä, että JIT-kääntäminen ei saa viedä kovin paljon aikaa [2]. Tämä saavutetaan kääntämällä optimoidusti ainoastaan eniten ajetut ohjelman osat. Suurin osa ohjelmista toimii siten, että suurin osa ajasta käytetään pientä osaa koodista suorittaessa. Erään arvion mukaan 80 prosenttia suoritukseen käytetystä ajasta kuluu suorittaessa 20 prosenttia koodista [1]. Siksi ainoastaan näiden hotspoteiksi kutsuttujen osien optimointi johtaa yleensä suuriin parannuksiin suorituskyvyssä, mutta kääntämiseen kuluva aika ei kasva merkittävästi. 3

Useimmin ajettuja ohjelman osia ei voida tietää etukäteen, joten hotspotit määritellään vasta kun ohjelmaa on ajettu jonkin aikaa [2]. Sitä ennen kaikki ohjelman osat ajetaan samalla tavalla kuin hotspotien ulkopuoliset osat, eli esimerkiksi kääntämällä ne ensin optimoimatta kuten IBM:n Java-virtuaalikoneessa, tai tulkkaamalla ne kuten Sunin Java HotSpot -virtuaalikoneessa. Virtuaalikone tarkkailee ajon aikana mitä ohjelman osia ajetaan eniten ja kääntää sekä optimoi ne taustalla. Optimoitavien osien valinta vaihtelee ohjelman ajokertojen välillä ohjelman saamien syötteiden perusteella, jotka osittain määräävät mitkä ohjelman osat tulevat ajetuksi useimmin. Aiemmin optimoidusti käännettyjä ohjelman osia ei tyypillisesti tallenneta myöhempiä ajoja varten [1]. Vaikka kääntäminen joudutaan suorittamaan myöhemmin uudelleen, tämä nopeuttaa latausaikaa ja säästää levytilaa. Toinen dynaamisen kääntämisen etu JIT-kääntämiseen nähden optimoinnin lisäksi on ohjelman käynnistymisajan lyheneminen niissä ratkaisuissa, joissa optimoimattomat ohjelman osat suoritetaan tulkkaamalla. Ohjelman suoritus alkaa näissä tapauksissa välittömästi, koska ensimmäisten metodien kääntämistä ei tarvitse jäädä odottamaan. 2.2 Käyttötavat Hyvin toteutettu dynaaminen kääntäminen virtuaalikoneissa on huomattavasti tulkkaamista ja JIT-kääntämistä nopeampaa. Ohjelman ajaminen on kuitenkin nopeampaa tavallisesti staattisella kääntäjällä konekielelle käännetyssä muodossa. Dynaamisen kääntämisen mahdollistaman ajon aikana tapahtuvan optimoinnin kehittäminen kuitenkin voi tulevaisuudessa pienentää tätä eroa tai jopa tehdä siitä staattista kääntämistä nopeampaa [1]. Dynaamiseksi kääntämiseksi kutsuttua menetelmää käytettiin ensimmäisen kerran Smalltalk-80-ohjelmointikielen virtuaalikoneessa [5]. Sitä jalostettiin tehokkaammaksi Self-kielen toteutuksessa uusien optimointitapojen avulla. Myöhemmin dynaamista kääntämistä on käytetty esimerkiksi IBM:n Jalapeno- ja Sunin HotSpot- virtuaalikoneissa Java-kielelle [2]. Java-virtuaalikone on nykyisin tärkein ja tunnetuin dynaamisen kääntämisen käyttökohde. 4

3. HotSpot ja dynaaminen kääntäminen Sunin HotSpot-teknologia on kuulunut viralliseen Java-virtuaalikoneeseen versiosta 1.3 alkaen. HotSpot-virtuaalikone (kuva 2) sisältää sekä normaalin tavukooditulkin että dynaamisen kääntäjän, jota käytetään tuottamaan optimoituja natiivikonekielisiä versioita ohjelman ns. hotspoteista metodeista joissa käytetään eniten suoritusaikaa. Ohjelmaa aletaan suorittaa tulkkaamalla tavukoodia suoraan. Kun hotspot-metodeja löydetään, niistä käännetään suorituksen taustalla optimoidut natiiviversiot, joita voidaan käyttää tulkkauksen sijaan myöhemmillä kutsukerroilla. Kuva 2: HotSpotin rakenne [1]. 5

3.1 Profiloija HotSpot-virtuaalikoneeseen kuuluu oleellisena osana profiloija, jonka tehtävänä on etsiä ajettavan ohjelman hotspotit kullakin hetkellä suorituksen aikana. Tätä varten profiloija pitää kirjaa eri metodeissa vietettävästä suoritusajasta, ja päättelee aikatilastoista missä metodeissa vietetään suurin osa suoritusajasta. Valitakseen sopivat metodit käännettäviksi profiloijan on tehtävä arvio kunkin metodin kääntämiseen ja optimointiin kuluvasta ajasta. Tätä arviota verrataan metodissa käytettävään suoritusaikaan, minkä perusteella voidaan päätellä onko kääntäminen natiivikoodiksi kannattavaa. Tarkkoja kriteerejä hotspot-metodien valintaan ei ole julkistettu, ja ne luultavasti muuttuvat ja parantuvat teknologian kehittyessä. Koska hotspot-metodien löytäminen perustuu arvioihin ja todennäköisyyksiin, eivät päätökset voi aina mennä oikein. Eräs valintaa vaikeuttava tekijä on hotspottien mahdollinen siirtyminen: esimerkiksi jotakin metodia saatetaan kutsua usein ohjelman alussa, mutta sen jälkeen ei enää ollenkaan. Tällaisissa tapauksissa on mahdollista että metodi tulee käännetyksi, mutta käännettyä versiota ajamalla ei ehditä saada takaisin kääntämiseen kulunutta aikaa. Menetelmän tarkoitus on kuitenkin saada ohjelman suoritus keskimäärin mahdollisimman nopeaksi, eikä tehdä jokainen yksittäinen valinta varmasti oikein. 3.2 Dynaaminen kääntäjä Varsinaisen kääntämisen ajoalustan natiivikonekielelle suorittaa HotSpot-virtuaalikoneen sisältämä dynaaminen kääntäjä. Kääntäjä tuottaa profiloijan valitsemista hotspotmetodeista optimoidut versiot ohjelman suorituksen taustalla. Optimointiin on tällöin käytettävissä melko runsaasti aikaa, sillä tulkki voi jatkaa tavukoodiversion suorittamista kääntämisen ollessa vielä kesken. Optimoinnissa käytetään monin tavoin hyödyksi kääntäjän dynaamisuutta ja saatavilla olevaa ajonaikaista tietoa. Staattiseen kääntäjään verrattuna saatetaan tietää esimerkiksi joidenkin muuttujien kaikki mahdolliset oikeat arvot, joita saattaa olla ratkaisevasti vähemmän kuin muuttujan tyypin arvoalueeseen kuuluvia arvoja olisi. Näiden tietojen perusteella voidaan metodit optimoida tehokkaasti tilanteen mukaan. 6

HotSpot-kääntäjällä on tavalliseen kääntäjään verrattuna toinenkin merkittävä etu: sillä on käytettävissä varalla tavukooditulkki, joka voi tarvittaessa suorittaa saman metodin myös tulkkaamalla. Kääntäjä hyödyntää tätä seikkaa suorittamalla optimistista kääntämistä vaikeasti optimoitavat tapaukset, kuten poikkeukset, voidaan jättää kokonaan pois. Ideana on optimistisesti toivoa että vaikeat tapaukset ovat harvinaisia (siis poikkeuksellisia), jolloin kokonaisuuden kannalta on parempi jättää ne tavukooditulkin varaan ja tuottaa itse useimmissa tapauksissa toimiva, paremmin optimoitu versio. Tämä pienentää optimoitavan koodin määrää, jolloin säästyy aikaa ja koodin koko pysyy pienempänä. Eräs tärkeä kääntäjän käyttämä optimointimenetelmä on koodin laventaminen (engl. inlining). Tämä tarkoittaa usein kutsuttujen metodien kutsun korvaamista suoraan metodin koodilla, jolloin säästytään metodikutsun tuomalta lisärasitteelta. Yleisessä tapauksessa laventamisen varjopuoli on ollut koodin koon kasvu, kun sama metodi kopioidaan useaan eri paikkaan. HotSpotissa tämä ongelma ei ole kovin suuri, sillä siinä laventaminen rajautuu vain pienelle, mutta merkittävälle alueelle: hotspotteihin. Lisäksi siihenkin voidaan soveltaa optimistista lähestymistapaa: ajonaikaisten tietojen perusteella voidaan päätellä todennäköisimmin tapahtuvat metodikutsut ja laventaa vain ne. 3.3 Käytännön suorituskyky Erilaisia käyttötarkoituksia varten HotSpot-virtuaalikoneessa on kaksi vaihtoehtoista, loppukäyttäjän valittavissa olevaa tilaa dynaamiseen kääntämiseen: asiakas- ja palvelinversio. Asiakasversio käynnistyy nopeammin ja kuluttaa vähemmän muistia, joten se sopii erityisen hyvin interaktiivisiin ohjelmiin. Palvelinversio puolestaan suorittaa enemmän tehtäviä etukäteen ja optimoi aggressiivisemmin, mutta se käynnistyy hitaammin ja kuluttaa enemmän muistia. Käynnistyttyään palvelinversio toimii kuitenkin melko tasaisen nopeasti, siinä missä asiakasversio saattaa välillä toimia epätasaisemmin suorittaessaan kääntämistä taustalla. Oletuksena käytössä on asiakasversio. Käytännössä Java-ohjelmat käyttävät aikaa muuhunkin kuin itse Java-koodin suorittamiseen. Muistin varaaminen ja roskienkeruu vie keskimäärin noin 20% Javaohjelman suoritusajasta, kuten myös säikeiden synkronointi. HotSpotin dynaaminen kääntäminen ei kaikessa optimistisuudessaankaan juuri kykene auttamaan asiaa näiltä osin. Voikin olla että joissakin yksittäisissä ohjelmissa siitä ei ole juuri ollenkaan hyötyä, vaan 7

suorituskyky riippuu muista virtuaalikoneen ominaisuuksista, esimerkiksi roskienkeruu- ja rinnakkaisuusalgoritmeista. Poikkeustapauksista huolimatta HotSpot onnistuu keskimäärin nopeuttamaan Javaohjelmien suoritusta merkittävästi verrattuna pelkästään tulkitseviin tai pelkästään JITkääntäviin virtuaalikoneisiin. On luultavaa että sen dynaamista kääntämistä kehitetään eteenpäin tulevaisuudessa, esimerkiksi älykkäämpien profilointi- ja optimointimenetelmien muodossa. 4. Yhteenveto Kun dynaamisen kääntämisen menetelmät kehittyvät yhä tehokkaammiksi, välikielille käännettyjen monilla laitealustoilla toimivien kielten käyttömahdollisuudet kasvavat samalla. Jo nykyisin esimerkiksi Java-kieltä on mahdollista käyttää WWW-sivuille upotettujen sovelmien lisäksi perinteisten sovellusten toteutukseen sekä palvelinohjelmiin. Jos optimistisimmat ennustukset toteutuvat ja HotSpot-teknologia ylittää staattisella kääntämisellä saavutetun suoritusnopeuden, häviää yksi viimeisistä syistä olla tukematta laite- ja käyttöjärjestelmäriippumattomia ohjelmistoja. 5. Lähteet [1] Armstrong, E. Hotspot: A new breed of virtual machine. Java World, March 1998. [2] Kazi, I. H., Chen, H. H., Stanley, B. and Lilja, D. J. Techniques for Obtaining high performance in Java programs. In ACM Computing Surveys, 32(3):213-240, September 2000. [3] The Java HotSpot(tm) Virtual Machine, v1.4.1,d2. Technical Whitepaper, Sun Microsystems Inc., Whitepaper, 2001. http://java.sun.com/products/hotspot/ [4] Agesen, O. and Detlefs, D. Mixed-mode Bytecode Execution. Technical Whitepaper, Sun Microsystems Inc., 2000. [5] Deutsch, L. P. and Schiffman, A. M. Efficient implementation of the Smalltalk-80 system. In Conference Record of the 11th Annual ACM Symposium on Principles of Programming Languages, Salt Lake City, pages 297-302, January 1984. 8