Mentionsy Mentionsy
Podcast Stacja IT
Podcast Stacja IT

Stacja.IT Podcast 057 Mateusz Kamiński - Czy Java może być wydajna?

06.12.2024 ·1 godz 0 min · 12 rozdziałów

W nowym odcinku podcastu Stacji.IT rozmawiamy o języku Java, który jest jednym z najpopularniejszych języków programowania. Gościem odcinka jest Mateusz Kamiński - Head of Product Team & Technology Evangelist w Sages. Podczas naszej dyskusji poruszamy następujące tematy: Jakie zagadnienia najbardziej Cię interesują w IT? Dlaczego programujesz w Javie? Kiedy Java jest wydajna, a kiedy nie? W jaki sposób można optymalizować działanie aplikacji w Javie? Czy są do tego jakieś narzędzia, biblioteki, dobre praktyki? Czy kolejne wersje Javy są szybsze / bardziej efektywne? Jakie są najważniejsze zmiany w Javie od wersji 8 od strony programisty? Czy Java nadal szybko się zmienia? Kiedy warto skorzystać z innych języków programowania działających w ramach JVM? Jakie są najczęstsze błędy popełniane przez programistów JVM?   Zapraszamy do oglądania i subskrybowania naszego kanału, aby być na bieżąco z najnowszymi odcinkami!    ________________________________________________________ Posłuchaj rozmów z prowadzącymi na Stacji i dowiedz się, jakie są ciekawe trendy w IT, jaką ścieżkę rozwoju wybrać i jakimi tematami warto się zainteresować. Rozmawiamy o programowaniu, data science i budowaniu własnej kariery w IT. 😉 🌏 Więcej o nas przeczytasz na stronie: www.stacja.it

0:00 · Wprowadzenie i osoba rozmówcy 2

Stacja IT. Złap pociąg do kodowania. Sprawdź warsztaty programistyczne. Cześć. Witam was w kolejnym odcinku podcastu Stacja IT. Dzisiaj będziemy rozmawiać o wydajności w Javie oraz o tym co nowego dzieje się w tym języku. A z nami jest ekspert od Javy i platformy JVM Mateusz Kamiński. Cześć Mateusz. Cześć wszystkim. Mateusz jest specjalistą od Javy, wiele lat pracuje z tym językiem, pracuje w Sages, prowadzi też szkolenia z Javy i z wydajności i z innych tematów związanych właśnie z platformą JVM. Czy chcesz na początek parę słów jeszcze powiedzieć o sobie? No więc ogólnie u mnie sytuacja wygląda tak, że od ponad już 10 lat mam do czynienia z Javą, albo z językami wokół Javy, czyli czy to Scala, czy Kotlin, czy kiedyś był Groovy, albo Clojure, ale ogólnie wciąż właśnie ciekawą rzeczą jest to, że ta Java zawsze zostaje gdzieś na przodzie, więc tak, tutaj u mnie tak wygląda.

No i poza tym oczywiście, że jestem programistą, to w moim doświadczeniu byłem też architektem, tak, miałem okazję tworzyć system od zera albo rozwijać istniejące, no a także prowadziłem zespoły, byłem takim można powiedzieć mentorem, kierownikiem, ale właśnie ja bardziej wolę mentorować ludzi niż być takim bosem typowym, więc... Więc tak, pomagam innym i teraz właśnie się bardziej jeszcze skupiłem na szkoleniach, żeby przekazywać swoją wiedzę szerzej w jakimś tam aspekcie też dotyczącym nie tylko samej Javy, ale też architektury oprogramowania. No to super, bo właśnie trochę z tej wiedzy chcieliśmy zaczerpnąć dzisiaj. Jakby takim głównym motywem tej rozmowy, no to ma być właśnie Java versus ten cały hype, który jest wokół jakichś innych języków.

1:44 · Osobisty doświadczenie Mateusza Kamińskiego z Javą 1

Dużo się mówi o jakichś nowinkach, o językach też nowych, które są na JVM, nie mówiąc już o mnóstwie technologii, które są związane z frontendem. Które są bardzo sexy. Natomiast ta Java gdzieś tam cały czas w tle jest od wielu lat. No i pytanie czy ona jest już nudna? Czy należy zająć się czymś innym? Czy ona jest niewydajna? Czy ona się nie zmienia? To chcielibyśmy dzisiaj o tym porozmawiać. No może zacznijmy od tego, co jeszcze właśnie ciebie teraz najbardziej w tym programowaniu, w Javie w szczególności, kręci. Czy właśnie te kwestie wydajnościowe, czy architektoniczne, gdzie znajdujesz ten fun, żeby cały czas aktywnie pracować w tym wszystkim.

2:43 · Nowości w języku Java i ich wpływ na wydajność 4

No to Java właśnie wbrew pozorom, mimo że już ma 25 lat, ponieważ właśnie ogólnie rok 1995 to początek Javy, wtedy wyszła pierwsza wersja. No i teraz widzimy, że w ostatnich latach mamy duży rozwój, w sensie był taki czas, kiedy była Java 8 mniej więcej, kiedy powiedzmy trochę to przystopowało, nie wychodziły nowe wersje Javy przez dłuższy czas. To wynikało ze zmian, ponieważ firma Sun upadła, powiedzmy Oracle ją przyjął. No i w tym momencie właśnie oni musieli się pewnie tam wewnętrznie zorganizować. Teraz powiedzmy jesteśmy już na takim poziomie, że co 6 miesięcy właśnie wychodzi nowa wersja Javy.

Powiedzmy, to jest taki główny cel. Oczywiście, jeżeli ktoś jest purystą, to lubi różne ciekawe rzeczy, ale wtedy raczej wchodzimy już w te pochodne języki, żeby na przykład programować bardziej funkcyjnie niż da się w Javie. Natomiast No co do zasady, w Javie mamy przynajmniej taki kompromis, że wybieramy stabilność właśnie zmian w języku względem właśnie tych nowości, które są wybierane jako pochodne z innych języków. W sensie Java, bazując być może na takim języku jak Groovy, jak Scala, wybiera z nich najlepsze rzeczy i je standaryzuje właśnie w obrębie Java. Natomiast jeszcze oprócz tego, Zmiany w Javie nie dotyczą samego powiedzmy języka, ale przede wszystkim wirtualnej maszyny Javy.

Tam się bardzo dużo dzieje i to ma największy wpływ właśnie na wydajność. To, że przechodząc na nowsze wersje Javy oczekujemy większej wydajności, ponieważ właśnie są stosowane, nie wiem, lepsze algorytmy odśmiecania pamięci albo po prostu nawet sama kompilacja kodu do poziomu natywnego. Może jeszcze o tym za chwilę powiemy. Ok, a jak to się w ogóle u Ciebie zaczęło? Dlaczego Java? Czy to był przypadek? Czy właśnie wiedziałeś, że tutaj jakby większość takich aplikacji korporacyjnych jest właśnie w Javie pisana i tutaj jest największy rynek i największa przyszłość? Czy coś innego zadecydowało? Właśnie to jest ciekawe, ponieważ ja w 2014 roku powiedzmy zacząłem od praktyk, a w ogóle miałem takie dwie opcje na samym początku, w sensie mogłem wybrać C++, a jedna firma w C++ pisała, na szczęście tam nie poszedłem, wybrałem drugą firmę, która robiła w Javie i to był właśnie, okazało się, że to był lepszy

No ja właśnie mam powiedzmy doświadczenie od Javy szóstej wzwyż. Widzę jakie tam zmiany zaszły w języku, ale też poza samym językiem, czyli głównie co się stało w wirtualnej maszynie Javy. To może właśnie zacznijmy od tego, żeby powiedzieć, jakie są te główne elementy, które wpływają na wydajność, bo tutaj powiedziałeś już trochę o tym, że coś zależy od maszyny wirtualnej, od JVM, coś od języka, ale jakby to tak usystematyzować, to po pierwsze trzeba pisać wydajny kod zapewne, w sensie w taki sposób pisać, żeby nie było to naiwne, tylko żeby tutaj stosować właściwe podejście, algorytmy itd. Są jakieś zmiany w języku, które to właśnie też ułatwiają zapewne i właśnie jest ten JVM.

7:17 · Garbage Collector i kompilacja do kodu natywnego 3

Czy to są te główne elementy, czy o czymś tutaj jeszcze należałoby wspomnieć, jakby o tych głównych kategoriach, na które trzeba popatrzeć, żeby się zastanowić, czy moja aplikacja jest wydajna, czy nie. Tutaj możemy podzielić JVM-a na takie dwie sfery. Pierwsza dotyczy odśmiecania pamięci, a druga kompilacji do kodu natywnego przez JIT-a. Właśnie jak ja zaczynałem w ogóle pracować przy Javie, to niestety wiele źródeł mówiło o tym, że Java to jest interpretowany język, co ciekawe, a to jest absolutnie Nieprawda, ponieważ już od dawien dawna, tak naprawdę od wersji 1.1 wprowadzono JITA, czyli Just In Time Compiler.

I to oznacza, że w trakcie jak nasza aplikacja działa, Java cały czas bada, ile razy pewne metody się wykonują. Tam może to nawet dochodzić na poziom gałęzi, czyli powiedzmy ifów. No i dzięki temu kod może zostać zoptymalizowany w trakcie działania systemu w takich gorących miejscach. To są tak zwane hotspoty. No i wtedy to jest skompilowane do poziomu tak naprawdę takiego samego, jakbyśmy to skompilowali przy pomocy C++. Ale no niestety tutaj jest jedna drobna różnica, że właśnie wciąż mamy odśmiecanie pamięci. To jest dla naszej wygody. Przede wszystkim, żeby błędów głupich nie robić w kodzie, tylko zająć się faktycznie Natomiast odśmiecanie pamięci troszkę kosztuje i trzeba tutaj na to przede wszystkim uważać, bo najwięcej problemów jakie się pojawiają to zwykle właśnie dotyczą odśmiecania pamięci.

Natomiast wracając do tego algorytmu odśmiecania pamięci, to w nowych wersjach Javy mamy od groma tak naprawdę opcji do wyboru, bo kiedyś powiedzmy tych garbage collectorów było mniej. Obecnie są dodane do tych nowych wersji JVM-a garbage collectory dla dużych ster, czyli jeżeli mamy aplikacje, które wymagają naprawdę pokaźnych obszarów pamięci, żeby coś tam przetworzyć. No to wtedy powinniśmy zmienić tego domyślnego garbage collectora na np. ZGC. To jest jeden z wyborów i to obecnie wygląda tak, że ten ZGC za jakiś czas stanie się standardem, czyli nawet zastąpi ten aktualny garbage collector. Więc tutaj nie musimy może na pierwszy rzut tym się interesować, jak programujemy w Javie, ale w końcu dojdziemy do takiego momentu, że pewnie trzeba będzie po prostu zacząć w to wchodzić.

11:24 · Funkcyjne elementy w języku Java i ich wpływy 2

Paradygmat, który wywodzi się z obiektowości właśnie oraz funkcyjnego języka, czyli gdzieś pomiędzy mamy Data Oriented Programming. I o co w tym chodzi? Chodzi o to, że stosujemy takie zbiorniki, typy danych, które są niemutowalne i je procesujemy w odpowiedni sposób zapisując Powiedzmy je w pewnej hierarchii dziedziczenia. One zwykle powinny dziedziczyć się po pewnym interfejsie. Tutaj, co ciekawe, interfejsy w Java zostały rozwinięte, że możemy mieć oczywiście domyślne metody, czyli metody z jakąś implementacją. A także możemy mieć prywatne metody, prywatne metody statyczne, to w pierwszych wersjach języka. Ja nawet, mi tego brakowało osobiście, teraz to wszystko już mamy.

Ale jak tworzymy coś od zera, właśnie w nowej wersji Javy, to jak najbardziej proponuję skorzystać z takiej opcji, bo wtedy naprawdę ten kod jest napisany w nowoczesny sposób i on przypomina to, co tak naprawdę mamy w tych językach pochodnych od Javy, czyli Kotlin, Scala, Groovy. No to jakby już powiedzmy na tym samym poziomie. Ja osobiście nie widzę różnicy, czy bym to zapisał w Scali czy w Javy. W zasadzie mogę zrobić Oczywiście są tam jeszcze inne aspekty funkcyjnego programowania, ale mówię, w Javie, tak jak mówiłem, bierzemy te najlepsze, najważniejsze rzeczy i je standaryzujemy po prostu. A tak właśnie jakby wychodząc od Javy 8, która tak jak mówiłeś była jakimś takim

14:23 · Nowe funkcje w JDK i zmiany w paradygramaty 6

Dłużej trwającym etapem w rozwoju Javy. Czy też są od tego czasu jakieś takie inne, właśnie duże zmiany, o których warto wspomnieć, oprócz tych struktur, tych rekordów, o których powiedziałeś? No to tak, JDK to jest taka gruba biblioteka, z której się korzysta na co dzień programując w Javie. I tam pojawiło się dużo rzeczy, dużo rozwojów. Przykładowo sam taki prosty typ jak string, czyli ciąg znaków otrzymał wiele metod w Javie 21. Prowadzili nawet metodę, ale to już bardziej na poziomie klasy karakter, gdzie możemy sprawdzić czy mamy emoji. Takie już ciekawostki można by powiedzieć, ale wbrew pozorom to pewnie jest odpowiedź na wymagania dzisiejszego właśnie świata, więc Java nadal jakby się rozwija.

Oprócz tego mamy mnóstwo innych opcji na tworzenie lepszego kodu. Teraz mamy takie nowe switche, powiedzmy, nie te stare, które znamy z języka C. Tylko właśnie bardziej funkcyjne switche, gdzie możemy rozebrać na pierwsze części taki rekord, o którym mówiłem już i od razu się dostać do pojedynczych pól, czyli to jest tak zwany, w Javascriptie to nazywają destrukturyzacją. W Javie akurat takiego słowa nie ma, bo w Javie te rekordy składają się z komponentów, co ciekawe. Więc po prostu mówimy o tak zwanych patternach, czyli możemy programować na wzorcach, tak można byłoby to nazwać, więc to jest taka nowość.

A oprócz tego to nie wiem, możemy ciągi znaków, które mają wiele Stacja IT, Stacja IT, Stacja IT Jak jest coś wprowadzone do Javy, to jest pewien czas na przyjęcie tego, na standaryzację. Czyli jak jakaś nowa funkcja w języku pojawia się w Javie 12, to ona przez następne trzy wersje jest w tak zwanym trybie preview. No i to oznacza, że ona może zostać wycofana, więc my możemy stosować te rzeczy, ale nie mamy niestety pewności czy to nie zostanie wycofane.

I rzadko się zdarza, że oni coś wycofują. Raczej jak już to się zmienia w jakiś sposób API. Natomiast co do zasady, właśnie tutaj taki przypadek powiedziałbym bolesny jest związany z tą interpolacją stringów. Tutaj wytłumaczę, że po prostu Można było w ramach pojedynczego stringa wstrzyknąć jakieś zmienne z zewnątrz i to powiedzmy było ok, ale pojawiły się problemy, że to jest zagrożenie dla security, ponieważ ludzie by tego nadużywali np. w SQL-ach czy w innych miejscach, gdzie takie rzeczy nie powinno się robić. Więc ostatecznie oni się zdecydowali na wycofanie, co ciekawe, tej zmiany i ma wyjść jakaś nowa propozycja chyba w Java 25.

Tutaj jeszcze to nie jest pewne, więc tak czy inaczej coś na pewno się pojawi. A oprócz tego tutaj też warto powiedzieć o tym, że Java od samego początku jest wielowątkowa, czyli tutaj bardzo łatwo możemy doprowadzić do tego, że nasz system No i tutaj bardzo ważna zmiana, która weszła już jako standard w Javie 21, czyli wirtualne wątki. Ja o tym mówię na szkoleniach, propaguję to nowość, ponieważ to jest bardzo ważne, ponieważ trzeba zakładać, że Java jest używana głównie do tworzenia systemów, które muszą Podcast 057 Mateusz Kamiński

Podcast 057 Mateusz Kamiński, Sages, Stacja IT. A przy wirtualnych wątkach system operacyjny już nie wie o tym, że jest takie coś jak wirtualny wątek. To sama Java wewnętrznie jakby ogarnia i tego może być miliony, podczas gdy tak naprawdę tych standardowych wątków to powiedzmy aplikacja nie powinna zwykle przekraczać tysięcy, ale to już nawet przy wielkich aplikacjach, a zwykle powiedzmy zostajemy na poziomie do stu. Więc to jest bardzo duża zmiana w języku. Czyli jakby tym zarządzaniem wątków się zarządza bardziej maszyna wirtualna niż system operacyjny.

19:23 · Wydajność w zastosowaniach i migracja na nowsze wersje Javy 4

Okej. A czy masz jakieś spostrzeżenia co do tego, jak wiele z tych nowych funkcji w języku jest Jakoś szeroko wykorzystywanych przez programistów? Czy to jest tak, że większość zatrzymała się na tym poziomie Java 8 i w ten sposób programuje? Czy to rzeczywiście szerzy się szybko ta informacja o tym, w jaki sposób to programowanie się zmienia? Z czego można skorzystać? Właśnie zmieniają się te paradygmaty i ludzie rzeczywiście z tego korzystają jakoś szeroko. Java 8 właśnie wprowadziła funkcyjność i myślę, że obecnie jest to standardem. Ja pamiętam w 2015 roku tak naprawdę wychodziła Java 8, zaczęła być stosowana powiedzmy w praktyce.

No i właśnie wtedy pamiętam przyjęcie tych nowości, bo to była totalna rewolucja w języku. Było dość trudne, ale Co ciekawe, obecnie można powiedzieć, że każdy już umie w ten sposób programować. Natomiast to, co się pojawia w tych nowszych wersjach języka może nie jest na tyle rewolucyjne, co w Javie 8, ale wciąż jest problem pewnie, żeby zapoznać się z tym, zwłaszcza jeżeli mamy projekty, które niestety pozostają na starszych wersjach języka. Od czego trzeba zacząć? To od tego, żeby nie bać się migrować na nowsze wersje Javy. I tutaj znowu trzeba wrócić do tego, że Java właśnie jest standardem, w sensie zmiany, które zachodzą są wstecznie kompatybilne, czyli tak naprawdę jak mamy coś, co jest napisane nawet w Javie pierwszej, to tak naprawdę to nadal jest skompilowalne

Potencjalnie możliwe do uruchomienia na Javie 21. Problemem są po drodze frameworki, biblioteki, narzędzia budowania. To są trzy rzeczy, które sprawiają problemy przy migracjach. No i teraz pytanie jest, jak bardzo jesteśmy od tych rzeczy uzależnieni w projektach. Jeżeli mocno, to niestety jeżeli te frameworki utrudniają przejście na nowszą wersję, Nie każda firma może sobie na to pozwolić. Wróćmy może do kwestii wydajności, bo trochę powiedzieliśmy o zmianach w języku, ale jakby wracając do tego głównego wątku, czy jest rzeczywiście jakiś taki obszar zastosowań, w których Java z założenia będzie niewydajna, albo jakieś takie...

Situacje, w których jakby z góry jesteśmy skazani na porażkę, tak? Czyli grupy zastosowań, czy właśnie sposób korzystania z języka, który tu przychodzi ci do głowy, który jakby należy po prostu unikać i korzystać z jakiejś innej technologii. To tak. Myślę, że głównie to wynika, jeżeli gdzieś nie możemy Javy zastosować, to właśnie z powodu takiego, że mamy te algorytmy odśmiecania pamięci, bo zwykle wtedy, powiedzmy, musimy taki system pewnie zaprojektować przy pomocy języków CC++, obecnie Rust powiedzmy gdzieś tam. Ja nie mam akurat doświadczenia wielkiego w tych językach, natomiast rozumiem z czego to wynika.

22:33 · Konkluzje i przyszłość Java 3

Jeżeli mamy restrykcje na wykonanie czasowe pewnych funkcji systemu, czyli to są tak zwane systemy czasu rzeczywistego, to wtedy na pewno Java tutaj nie powinna być używana. Obejściem jest stosowanie GraalVM. GraalVM jest alternatywną wirtualną maszyną Javy, która tak naprawdę skupia się na tym, że kompilujemy od razu cały kod na poziom natywny. Ale wciąż tam występuje ten algorytm odśmiecania pamięci, więc tak czy inaczej, jeżeli mamy bardzo duże restrykcje pod tym względem, no to nadal to nie będzie okej. Ale powiedzmy, że na przykład jak mamy jakieś zastosowania właśnie obecnie w cloudzie, gdzie aplikacja musi szybko się uruchomić i jak najszybciej wykonać pewien kod,

To wtedy można tego użyć. Tutaj, co ciekawe, też w nowych wersjach języka pojawił się tak zwany Epsilon GC, czyli tak zwany No-Operational Garbage Collector. To wtedy zakładamy, że Java nigdy nie zatrzyma się, żeby coś tam odśmiecić z tej pamięci. No i wtedy mamy zapewnione, że ten kod się wykona w tym czasie, który zakładaliśmy. Więc można to obejść, ale pewnie jeżeli mamy duże restrykcje, to już lepiej użyć czegoś innego. No i druga sfera problematyczna dla Javy to jest sfera, która wymaga kart graficznych, ale trwają prace nad tym, żeby jakby zintegrować kod w Javie z możliwością wykonania na dowolnym powiedzmy CPU albo GPU.

I to jest projekt, który dopiero jest w trakcie rozwoju, więc być może za rok, za dwa byśmy się spotkali, byśmy mogli wtedy porozmawiać, że jednak to, o czym ja teraz mówię, już jest nieprawda, ponieważ możemy na karcie graficznej przy pomocy Java również programować rzeczy. Tutaj wtedy raczej mówimy pewnie o zastosowaniu sztucznej inteligencji w tych aspektach, które tego potrzebują. A w takim razie przechodząc już do jakichś konkretnych dobrych praktyk czy sposobów, w jaki sposób te aplikacje należy tworzyć, żeby były wydajne. Wcześniej powiedzieliśmy o tym, że jest kilka obszarów, samo tworzenie języka, maszyna wirtualna, garbage collector itd.

Pokazano pierwszych 25 dopasowań — doprecyzuj frazę, aby zawęzić wyniki. Transkrypcja generowana automatycznie i niesprawdzana ręcznie — może zawierać błędy.