Helt siden Java 10 ble utgitt i 2018 har det kommet en ny versjon av det populære programmeringsspråket hver sjette måned. De mest kjente nyvinningene er synlige endringer i form av ny syntaks og nye APIer, men det har skjedd vel så mye endringer i Java sin runtime.
I flere år har det blitt jobbet med prosjekter som hver gir Java en kraftig overhaling. To av disse, kjent under kodenavnene Lilliput og Valhalla, er spesielt spennende.
¶Lilliput
Se for deg at du har denne enkle klassen:
class Marker {}
Hvor mye minne bruker du ved å kjøre var mark = new Marker();
?
Ideelt sett burde det ikke kreve noe som helst. Klassen inneholder jo ingenting, og kan ikke gjøre annet enn det som arves fra Object
. Likevel må det være mulig å skille instanser av denne klassen fra instanser av andre, potensielt tomme, klasser. Du må også ha muligheten til å bruke objektet som en lås, kalkulere dens hashkode og se objektets “innhold” når du bruker refleksjon. Dette er funksjonalitet Java støtter for alle objekter, selv de som er tomme.
Så hvor mye minne krever en instans av en helt tom klasse? Avhengig av innstillinger og maskinen du kjører på, vil hvert eneste objekt i Java kreve minimum 96 eller 128 bits minne (også kjent som 12 og 16 bytes).
Målet med Lilliput er ganske enkelt: senk dette kravet så mye som mulig.
Første iterasjon av Lilliput kommer allerede i Java 24, kjent som Compact Object Headers, som lanseres i mars neste år. I første omgang må du manuelt aktivere funksjonaliteten når du starter opp en applikasjon. Gjør du det, vil du kunne oppleve en reduksjon i minne på mellom 10% og 20%, da minimumstørrelsen per objekt reduseres til 64 bits (8 bytes).
Med lavere minnebruk kommer også økt ytelse. Dette er både fordi Java sin garbage collector får mindre å gjøre, men også fordi du vil få plass til mer data i CPUen sin cache. Sistnevnte er noe min kollega Jean Niklas forklarer godt i artikkelen Kjøretid med cacheproblemer.
Men dette er altså bare første iterasjon. Lilliput sitt endelige mål er å redusere minimumstørrelsen for et objekt helt ned til 32 bits (4 bytes), men det er nok fortsatt en stund til de når det målet.
¶Valhalla
Mens Lilliput jobber for å redusere størrelsen per objekt, så ønsker Valhalla å gi deg muligheten til å unngå å allokere et objekt i det hele tatt.
Jeg nevnte tidligere at det er noe minimumsfunksjonalitet som utgjør grunnen til at objekter har en viss størrelse. Hva om du ikke hadde noe behov for denne funksjonaliteten?
La oss ta for oss denne klassen:
record Punkt {
int x;
int y;
}
Det eneste jeg bryr meg om i denne klassen er x og y. Jeg er ikke interessert i identiteten, eller pekerverdien, til instansen på noen som helst måte. Jeg bryr meg ikke om muligheten til å kunne bruke Punkt
som en lås. Det er heller ikke interessant for meg å kunne mutere x eller y, når Punkt
først er definert, så vil jeg ikke at den skal endre seg.
Valhalla foreslår muligheten til å frasi seg disse mulighetene ved å legge til et enkelt nøkkelord.
value record Punkt {
int x;
int y;
}
Med denne definisjonen vil ikke instanser av Punkt
kreve noe mer minne enn hva som kreves for x og y, og det er godt mulig at dette minnet lever på stacken istedenfor heap’en, som betyr at dette minnet ikke utgjør noen belastning for Java sin garbage collector.
For at value-klasser skal kunne brukes overalt hvor vanlige klasser brukes i dag, kreves det en kraftig overhaling av hele Javas runtime. Dette bidrar til litt ekstra funksjonalitet som de fleste vil sette pris på, som f.eks. muligheten til å lagre int
(ikke Integer
) i visse datastrukturer og muligheten til å spesifisere om en type kan være null eller ikke.
Det er foreløpig ikke satt en dato for når vi kan forvente å se Valhalla i en offisiell utgave av Java, men basert på dette foredraget på Devox i år, så hadde det ikke overrasket om også dette blir tilgjengelig neste år.
¶Konklusjon
Ingen har noensinne fått sparken for å velge Java, sies det. Selv om det kanskje ikke er det språket som skaper mest begeistring, så er det definitivt en av de viktigste teknologiene i bruk i dag. Dette er spesielt sant når du tenker over at språk som Kotlin og Clojure kjører på den samme motoren.
At Java vil klare å utnytte maskinene våre mer effektivt er gode nyheter for bedrifters skybudsjett og jordas klimabudsjett.
Da får vi nemlig plass i budsjettet som vi kan fylle med AI.