Java 9 on kymmenen kertaa nopeampaa!

Törmäsin mielenkiintoiseen ilmiöön taannoin. Valmistelin esitystä suorituskyvystä ja Java muistimallista, ja ajoin eräänlaista benchmark sovellusta Dockerin avulla eri virtuaalikoneissa. Sovelluksen ideana on sisältää aika typerästi kirjoitettua mutta varsin tavanomaista Java-koodia. Silmukoita, ehtolauseita, merkkijonojen käsittelyä, laskentaa, kokoelmien käsittelyä, ja kellottaa paljonko kaikkeen menee aikaa. Tällä voidaan myös nähdä nykyaikaisen virtuaalikoneen itseään optimoiva vaikutus – kun ajo jatkuu, nopeus yleensä kasvaa. Tässä on sovelluksen mittaustuloksia Oracle Java 6 Docker kontissa ajettuna:

Screenshot 2016-10-16 13.19.54.png

Eli, yhden kierroksen aika on n. 84 sekuntia, laskien 82 sekuntiin jahka virtuaalikone vähän ”lämpenee” eli käytännössä jit-kääntää enemmän koodia ja tekee muita tarvittavia optimointeja.

 

Tässä on OpenJDK+Java 8 ajotulokset:

Screenshot 2016-10-16 13.23.31.png

Kuten tuloksista näkyy, uudempi virtuaalikone optimoi usein tehokkaammin. Tässä kierrosajat pyörivät n. 62 sekunnin pinnassa – Java 6 verraten on irronnut noin 20 sekuntia, tai 1/4 suoritusajasta. Paras kierrosaika oli jopa 52 sekuntia. Aika hyvä tulos!

Kokeillaanpa G1 roskankeruualgoritmilla:

Screenshot 2016-10-16 13.35.12.png

Oops! Vaikka G1 on teoriassa kauneinta ja uusinta mitä roskankeruualgoritmeihin tulee, se ei ole joka ongelmaan optimaalinen ratkaisu. Suoritusajat vaihtelevat 98 ja 104 sekunnin välillä ja ovat nousemaan päin. Tällä sovelluksella ja tämän koneen muistilla tässä tuli takapakkia, huonompi suorituskyky. Varmaan tästä syystä G1 ei ole vielä oletusalgoritmina vaan pitää erikseen kytkeä päälle lisäparametrilla -XX:+UseG1GC.

Java 9 julkaistaan vasta pitkällä ensi vuonna. Siitä on kuitenkin jo prereleaseja liikkeellä, ja jopa Docker virtuaalikuva. Tämän ansiosta on lasten leikkiä ajaa sama koodi Java 9:llä. Tulokset tässä:

Screenshot 2016-10-16 13.36.26.png

WUT? Sama koodi, tekee saman asian, sama koneympäristö ja resurssit. Suoritusajat vaihtelevat 9 ja 12 sekunnin  välillä. Karkeasti ottaen noin kymmenen kertaa nopeampaa kuin useimmat muut testiajot, ja yli viisi kertaa nopeampaa kuin paras tulos tähän asti.

Jotain on muuttunut. Mitä, en tiedä vielä. Epäilen että yksi tekijä voi olla Jigsaw moduulimallit. Toinen tekijä lienee, että on taas opittu tunnistamaan joku negatiivinen koodaustapa, ja optimoimaan sen suoritus. Tulokset tuskin ovat yleispäteviä, ne pätevät lähinnä tähän tyypilliseen koodiesimerkkiin mitä käytin, ja tähän ympäristöön. Docker välissä voi myös vaikuttaa jotain, tuskin kuitenkaan paljoa. Niin tai näin, koodi otti taas kerran hurjan tehokkuushypyn. Tätä herkkua olisi luvassa ensi vuonna.

Virtuaalikoneiden ihanuus on siinä, että nautit kaikista edistysaskelista, ilman koodimuutoksiakin. IBM nimesi juuri oman open source JDK 9 versionsa JIT-kääntäjän Testarossaksi, joten veikkaisin että sieltä on myös suurta hyvyyttä tulossa.

p.s. Docker on ihana keksintö!

p.p.s. Niin on Cathode terminaalikin :p

 

Java 9 viivästyy – saatavana heinäkuussa 2017

Tuoretta uutista, tosin ei yllättävää. Java 9 – jota on jo lykätty useita kertoja, ja jonka ominaisuudet ovat kaikki aiemmista versioista lykättyjä – viivästyy vielä. Tällä kertaa ihan ymmärrettävästä syystä. Se ei vain ole vielä valmis, ei ehdi, ja muutokset ovat merkittäviä.

Mutta käytännössä siis mennään Java 8:lla vielä tovi, ja aikaa on oppia mikä kaikki muuttuu Java 9 myötä. Tämä viimeisin lykkäys ei ole kuin 4kk lykkäys, ja toki nyt jo saatavana olevat EA buildit ovat varsin pitkällä. Mutta kun corea sorkitaan, pienikin muutos on iso muutos ja vaatii aikaa ja rakkautta. 😉

Tieto ei ole toki vielä vahvistettua, mutta lykkäystä on ehdotettu, ja ehdotus menenee läpi koska valmista ei vain tule aiemmalla aikataululla.

Lähde: http://mail.openjdk.java.net/pipermail/jdk9-dev/2016-September/004887.html

Java 9 ja CORBA

Heh, niinpä. Olen kirjaillut aiemmin useammankin kerran tulevan Java 9:n ihmetyksen aiheista. Silmiin osui hauska artikkeli siitä miten viimeinkin CORBA, Common Object Request Broker, tuo kaikkien väylien ja hajautuksen edelläkävijä ja kaikkien sitä käyttäneiden inhokki, ei enää tule vakiovarusteena perus-Javassa.

Java 9 suuri uudistushan on modulaarisuus, ja sen tärkeimpänä osana ja ajurina Javan n. 20-megainen runtime modularisoidaan, siten että sieltä löytyy tiukka ydin-kernel, ja lukuisia moduuleita joita voi halunsa mukaan ottaa mukaan tai jättää ottamatta. Pitkän tähtäimen strategia on varmasti paluu mobiili ja IoT ympäristöihin uusin voimin.

Eli, oletuspaketti, root moduulit, ei sisällä enää tarpeetonta kuraa, ja osa tarpeellisistakin lähtee erilleen. Jos kaipaat CORBAA, saat sen takaisin kytkimellä:

-addmods java.corba

Hyvä huomata että vastaavia muita moduuleita ovat mm.:

java.activation
java.annotations.common
java.corba
java.transaction
java.xml.bind
java.xml.ws

Näyttäisi siis siltä että viimein Java menee tosissaan tiukalle dieetille. Java 9:stä kuulemme varmaan lisää tämän vuoden JavaOne seminaarissa San Franciscossa – mutta mielenkiintoa näyttäisi olevan. Varmaa on, että jatkossa on syytä opetella käyttämään moduulijärjestelmää ja sen kytkimiä – muuten ei vanhat Java-koodit enää edes käänny.

Toinen tutkaimiin osunut juttu on moneltakin taholta julistettu Java EE 8 kuolema. Oraclen panostus ja mielenkiinto sen suhteen näyttää olevan lopahtamassa. Mielenkiinnolla seuraan mitä tämä tarkoittaa, ja mitä tuo tullessaan. Tutkaimet herkkinä. Tämäkin selvinnee syksymmällä.

 

http://mail.openjdk.java.net/pipermail/jdk9-dev/2016-May/004309.html

 

jenv ja virtuaalikoneiden ihanuus

Olen ihastunut.

Työssäni tulee käyteltyä Javan eri versioita vieläkin, koska vaikka maailma alkaa olla Java8-valmis, vieläkin tulee vastaan ympäristöjä jotka eivät toimi kuin vanhemmilla versioilla. Toisaalta uutta on aina kiva kokeilla. Java 9 tekee tuloaan ensi vuonna, ja siitä on jo esiversiota tarjolla.

Ikuinen ongelma on ollut useamman virtuaalikoneen, saati sitten JDK version hallinnoiminen koneessa – tai edes sen pääasiallisimman valitseminen oikein jos useampi JDK on asennettuna. Homman salaisuus on alkanut JAVA_HOME ja PATH ympäristömuuttujien hyvästä hallinnasta, mutta asiaa sotkevat myös erinäiset rekisteriasetukset ja/tai symboliset linkit. Kysymys kuuluu: kun kirjoitat komentoriville

java -version

javac -version

… niin mikä sieltä vastaa? Ja onko se mitä haluat? Vai vastaako mikään?

Windows maailmasta huonoja uutisia: Windowsin rekisteriin tallettuville jämille on vaikeata tehdä mitään. Java Windowsilla, sen kanssa voi pärjätä, mutta ei se hauskaa ole. Tokkopa on tarkoituskaan olla.

Nykyisin Mac-käyttäjänä olen onneksi päässyt rekisterihelvetistä eroon. Mutta koska tälläkin alustalla problematiikkaa riittää, eksyin tutustumaan jenv-työkaluun, joka osaltaan helpottaa hommaa. Valitettavasti vaatii toimiakseen bash-valmiin käyttöjärjestemän, eritoten Mac OSX tai Ubuntu pelittää hienosti.

Jenv löytyy osoitteella http://www.jenv.be/ – ja toki myös GitHubista suoraan. Itse tuikkasin sen Maciini Homebrew:llä, kuten monet muutkin kivat jutut. Jahka se löytyy komentoriviltä, tärkeimmät komennot ovat:

jenv add /PATH/TO/VM

jenv versions

jenv shell java-version-that-i-want-to-use

Noista on paljon hyviä esimerkkejä heti pääsivulla. Toki voi myös asettaa pysyvämmin default virtuaalikoneen käyttöön, mutta esim. tuo jenv shell-komento antaa mahdollisuuden kokeilla Java 9 prereleasea turvallisesti sotkematta silti vakaampia projektejaan. Ja mikä mukavinta- toimii myös ANT ja Mavenissä suoraan.

Jenv ja JDK 9 vauhdissa

Edellämainitun lisäksi toki on monta muutakin virtuaalikone-ulottuvuutta: Mitä virtuaalikonetta selaimesi käyttää (jos käyttää), entä IDE ympäristösi? Maven? Eli ei ihan yksinkertainen asia. Hyvä kuitenkin aloittaa perusteista, eli siitä että ainakin yhdessä paikassa homma toimii juuri kuten haluat.

Toinen jenv löytyy muuten osoitteessa http://jenv.io/ – näyttäisi tukevan myös Windows hommeleita.

Java 9 tulee – sitten joskus

En tiedä onko muiden tutkaan osunut, mutta Java 9 versiosta on julkaistu jo ennakkotietoja – kuten asiaan kuuluu uutta versiota pukkaa parin vuoden välein, ja tässä olisi tarkoitus tuoda loput jo aikanaan Java 8:aan (ja 7:aan) suunnitelluista piirteitä. Erityisesti Jigsaw modulaarisuus olisi tarkoitus saada viimein ulos tuutista.

Mukana olisi tulossa mm. uusi, kevyt JSON API, HTTP 2 client, lisää pääsyä käyttöjärjestelmän prosesseihin, säie/lukitus suorituskykyä, fiksumpaa käännöstä, koodicachea, rajapintaa rahan käsittelyyn, ja tietysti se Jigsaw.

Tuossa olisi esimerkkiä miten tuleva Money API näyttäisi:

public class Product { 
	private String name; 
	private Money price;	
            //getter and setter 
}

public class CreateCurrencyUnit 
{ 
    public static void main( String[] args ) 
    { 
        CurrencyUnit real = MonetaryCurrencies.getCurrency("BRL"); 
        CurrencyUnit dollar = MonetaryCurrencies.getCurrency(Locale.US); 
        System.out.println(real); //BRL – the Brazilian currency
        System.out.println(dollar); //USD – the north American currency
    } 
}

Onkohan tuossa tarpeeksi? Aikanaan kun Scalalla tuli tehtyä enemmän, Javaan tuntui suorastaan pahalta palata, samoin JavaScriptiin. Toisaalta Javan rooli on olla se yritysmaailman sveitsin armeijan linkkari, ja Lingua Franca, sen roolina ei olekaan olla se uusin ja jännittävin. Nämä ovat joka tapauksessa tuloillaan 2016 joten vielä pari vuotta ehtii fokus elää, todennäköisesti modernimpia uudistuksia ei muutenkaan haluta pultata paikalleen liian aikaisin.

Tässä lähdelinkkejä:

https://weblogs.java.net/blog/otaviojava/archive/2014/08/25/java-9-coming-money-api

Tuosta löytyisi: http://java.dzone.com/articles/java-9-features-announced

Tuolla pääsee vielä mukaankin jos on intohimoa: http://openjdk.java.net/projects/jdk9/

Ja voi sen jo ladatakin: https://jdk9.java.net/download/