Krzysztof Olszewski

Dyrektor Technologii i Architektury Oprogramowania

Krzysztof Olszewski

Dyrektor Technologii i Architektury Oprogramowania

Tak wiele dużych i znaczących wersji maszyny wirtualnej JVM i całej platformy Javy trafiło pod nasze strzechy przez te wszystkie lata a jednocześnie tak długo kazano nam czekać na kolejną, że teraz w oczekiwaniu na nią właśnie, numerowaną jako „dziewięć”, możemy spodziewać się zmian co najmniej niebanalnych. Zresztą całe to oczekiwanie jest lekko „dęte” bo przecież każdy z nas poprzez otwartość i jawność całego procesu wie co nadchodzi. Wiadomo, modularyzacja to motyw przewodni dziewiątej wersji. Bać się czy cieszyć? Czy taka zmiana w tym momencie dojrzałości platformy ma sens? Okaże się z czasem. Ja jednak „myszkując” po zapowiadanej liście zmian napotkałem na coś ciekawego, mianowicie:

Compact Strings (JEP 254)

W krótkim opisie znajdujemy:

An internal optimization is applied to the String class to reduce memory consumption. The idea is that most String objects contain characters that do not need 2 bytes to represent. The change consists of replacing the internal character array with a byte array, plus an extra byte that denotes the encoding of the byte array: either Latin-1 which takes up 1 byte, or UTF-16, which takes up 2 bytes. The String class will determine which encoding based on the content to be stored.

This is expected to reduce the size of heap memory in existing applications that rely heavily on strings, and should also reduce time spent on garbage collection. This change is internal and does not affect the external API of String and its related classes such as StringBuilder or StringBuffer.

Co za zmiana?! Szybko ciśnie się pytanie dlaczego czekano aż do wersji 9 aby to zrobić, naprawdę nie znalazł się nikt „łebski” wcześniej?! Trochę ręce opadają, ale „dobra nasza”, cieszmy się że w końcu i jednak jest. Nie byłbym sobą gdybym nie sprawdził jak to działa, jak to coś wpływa na zajętość pamięci. Prosty test, porównanie tej samej aplikacji ostro „bawiącej” się stringami, odpalonej na JVM 8 i 9. Zaczynamy od nowiutkiej, jeszcze nie wyklutej dziewiątki:

Java 9

która raportuje

Java 9 raport pamięci

po czym dajemy się wykazać starej, poczciwej ósemce:

 

Java 8

 

która to raportuje:

 

Java 8 raport pamięci

 

Wygląda to bardzo dobrze. Z prawie 33 MB pamięci zajętej przez wersję ósmą, zostaje zaledwie niecałe 19 MB w przypadku nowej, nadchodzącej wersji dziewiątej. Rewelacja. Choć po różnicy w ilości załadowanych klas i stworzonych instancji widać że 9tka, to nie tylko JEP 254 ale tak czy inaczej różnica jest znacząca. Uzbrajamy się zatem w cierpliwość i czekamy na to dziewiąte cudo.