{"id":16646,"date":"2023-08-22T17:53:03","date_gmt":"2023-08-22T15:53:03","guid":{"rendered":"https:\/\/vived.io\/?p=16646"},"modified":"2023-08-22T17:53:08","modified_gmt":"2023-08-22T15:53:08","slug":"niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/","title":{"rendered":"Niskopoziomowe nowo\u015bci: Projekt Leyden, Projekt Valhalla i Projekt Hermes &#8211; JVM Weekly vol. 146"},"content":{"rendered":"\n<h2 id=\"1-co-nowego-w-projekcie-leyden\" data-num=1>1. Co nowego w Projekcie Leyden?<\/h2>\n\n\n\n<p>S\u0105 projekty w JVM, kt\u00f3re w wi\u0119kszym stopniu ni\u017c inne przebijaj\u0105 si\u0119 do masowej \u015bwiadomo\u015bci. Wi\u0119kszo\u015b\u0107 ludzi s\u0142ysza\u0142a o Loomie i Valhalli, pewnie Panama te\u017c istnieje w \u015bwiadomo\u015bci spo\u0142eczno\u015bci (cho\u0107 jestem sk\u0142onny si\u0119 za\u0142o\u017cy\u0107, \u017ce wi\u0119kszo\u015b\u0107 os\u00f3b nie chcia\u0142aby mie\u0107 z ni\u0105 za wiele do czynienia w praktyce). Tymczasem istniej\u0105 te\u017c mniej znane projekty, takie jak Leyden, kt\u00f3re zwi\u0105zane s\u0105 g\u0142\u0119boko z technicznym aspektem JVM. Mimo ich specjalistycznego charakteru, s\u0105 one (przynajmniej dla mnie) niesamowicie fascynuj\u0105ce. Dlatego ciesz\u0119 si\u0119, \u017ce maj\u0105c \u015bwie\u017ce informacje prosto z <a href=\"https:\/\/cr.openjdk.org\/~jrose\/pres\/202308-Leyden-JVMLS.pdf\">JVM Language Summit<\/a>, mog\u0119 jeszcze raz przybli\u017cy\u0107 cele, ale te\u017c zarysowa\u0107 Wam najnowsze kierunki rozwoju tego projektu.<\/p>\n\n\n\n<p>Leyden radykalnie zmienia optymalizacj\u0119 Javy, wprowadzaj\u0105c technik\u0119, kt\u00f3ra w oryginalne brzmi &#8222;shifting and constraining&#8221;, co w moim lu\u017anym t\u0142umaczeniu oznacza &#8222;przesuwania i ograniczania&#8221; oblicze\u0144. Zamiast polega\u0107 wy\u0142\u0105cznie na kompilowaniu w runtime, Leyden przesuwa niekt\u00f3re z niezb\u0119dnych operacji optymalizacji do wcze\u015bniejszych faz, w zale\u017cno\u015bci od wymaga\u0144 konkretnego programu i \u015brodowiska uruchomieniowego &#8211; \u017cyjemy w ko\u0144cu w \u015bwiecie autoscalingu, chmur i innych kubernetes\u00f3w.<\/p>\n\n\n\n<p>G\u0142\u00f3wnym nowym klockiem wprowadzanym przez Leyden s\u0105 tak zwane &#8222;kondensatory&#8221; (condensers). Mo\u017cna je sobie wyobrazi\u0107 jako specjalizowane narz\u0119dzia dzia\u0142aj\u0105ce sekwencyjnie, udoskonalaj\u0105c kod aplikacji. Proces rozpoczyna si\u0119 od bazowej, konfiguracji aplikacji. Przechodz\u0105c przez ka\u017cdy kondensator, wprowadzane s\u0105 transformacje, a\u017c osi\u0105gnie si\u0119 punkt ko\u0144cowy: zoptymalizowan\u0105 wersj\u0119 przeznaczon\u0105 do wydajnego czasu wykonania.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-3-1024x134.png\" alt=\"\" class=\"wp-image-16648\" width=\"991\" height=\"129\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-3-1024x134.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-3-300x39.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-3-768x101.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-3.png 1264w\" sizes=\"auto, (max-width: 991px) 100vw, 991px\" \/><\/figure>\n\n\n\n<p>Aby przeprowadzi\u0107 analogi\u0119, mechanizm kondensatora Leyden przypomina middleware w ramach internetowych takich jak Express.js dla Node.js. W rozwoju internetowym middleware przechwytuje \u017c\u0105dania, przetwarza je i ewentualnie modyfikuje przed dotarciem do ich docelowego miejsca. Podobnie kondensatory Leyden przyjmuj\u0105 <code>ApplicationModel<\/code> \u2014 niezmienne przedstawienie aplikacji \u2014 i wytwarzaj\u0105 jego udoskonalon\u0105 wersj\u0119. Podej\u015bcie to zapewnia, \u017ce oryginalny model pozostaje niezmieniony, a optymalizacje tworz\u0105 nowe, ulepszone wersje. Tak\u017ce kod jest stosunkowo prosty.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface Condenser {\n    ApplicationModel condense(ApplicationModel model);\n}\n<\/code><\/pre>\n\n\n\n<p>Oczywi\u015bcie, ca\u0142a magia opiera si\u0119 w samej klasie <code>ApplicationModel<\/code>, ale ch\u0119tnych zach\u0119cam do sprawdzenia artyku\u0142u <a href=\"https:\/\/openjdk.org\/projects\/leyden\/notes\/03-toward-condensers\">Toward Condensers<\/a> autorstwa Briana Goetza, Marka Reinholda, &amp; Paula Sandoza. Tam te\u017c znajdziecie wi\u0119cej szczeg\u00f3\u0142\u00f3w i przyk\u0142ad\u00f3w kodu. Ja tu zostawi\u0119 jeszcze jeden przyk\u0142adowy sample, kt\u00f3ry my\u015bl\u0119 deskryptywne obrazuje u\u017cycie:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Override\npublic ApplicationModel condense(ApplicationModel model) {\n    ModelUpdater updater = model.updater();\n    Stream.concat(model.modules(), model.classPath())\n        .flatMap(model::classes)\n        .forEach(classKey -&gt; {\n            ClassModel cm =  if (cm != null) {\n                                \/\/\/ do transformation on Classes\n                updater.addToContainer(classKey, ClassContents.of(cm));\n            }\n        });\n    return updater.apply();\n}\n<\/code><\/pre>\n\n\n\n<p>Jednak Leyden nie opiera si\u0119 wy\u0142\u0105cznie wy\u0142\u0105cznie na statycznej transformacji. Obecnie Java u\u017cywa strategii &#8222;kompilacji warstwowej&#8221; (Tiered Compilation) do osi\u0105gni\u0119cia szczytowej wydajno\u015bci. Zacz\u0105wszy od Poziomu 0, gdzie JVM zaczyna interpretowa\u0107 bajtkod, aplikacje stopniowo przechodz\u0105 do Poziomu 4, kt\u00f3ry korzysta ju\u017c&nbsp;z zoptymalizowanego kodu. Kolejne etapy osi\u0105gane s\u0105 ju\u017c podczas dzia\u0142ania aplikacji. Je\u015bli potrzebujecie wi\u0119cej, \u015bwietny tekst <a href=\"https:\/\/devblogs.microsoft.com\/java\/how-tiered-compilation-works-in-openjdk\/\">How Tiered Compilation works in OpenJDK<\/a> na ten temat opublikowa\u0142 niedawno Cesar Soares z Microsoftu. Leyden za\u015b&nbsp;udoskonala ten proces.<\/p>\n\n\n\n<p>Wspomniana ju\u017c <a href=\"https:\/\/cr.openjdk.org\/~jrose\/pres\/202308-Leyden-JVMLS.pdf\">aktualizacja z JVM Language Summit<\/a> wprowadza tak zwane &#8222;biegi treningowe&#8221;. S\u0105 to w symulacje dzia\u0142ania aplikacji, maj\u0105ce na celu zebranie danych behawioralnych. Analizuj\u0105c zachowanie aplikacji w r\u00f3\u017cnych scenariuszach w runtime, kondensatory mog\u0105 uzyska\u0107 kluczowe informacje o zachowaniu aplikacji w produkcyjnym \u015brodowisku. Dzi\u0119ki temu wprowadzane udoskonalenia opieraj\u0105 si\u0119 nie tylko na teoretycznych modelach, ale s\u0105 zakorzenione w rzeczywistych dynamikach aplikacji &#8211; tak jak ma to miejsce np. w <a href=\"https:\/\/www.graalvm.org\/22.0\/reference-manual\/native-image\/PGO\/\">Profile-Guided Optimizations<\/a> (PGO) w GraalVM. O GraalVM zreszt\u0105 te\u017c mo\u017cna my\u015ble\u0107 jak o kolejnym kondensatorze.<\/p>\n\n\n\n<p>Wykorzystuj\u0105c informacje uzyskane podczas &#8222;bieg\u00f3w treningowych&#8221; (o kt\u00f3rych za chwile), Leyden wprowadza kluczowe optymalizacje jeszcze przed rozpocz\u0119ciem dzia\u0142ania. Dlatego, gdy aplikacja rozpoczyna standardow\u0105 warstwowy system Javy, ma ju\u017c przewag\u0119. To proaktywne podej\u015bcie nie tylko przyspiesza proces &#8222;rozgrzewania&#8221;, ale umo\u017cliwia d\u0142u\u017csze okresy szczytowej wydajno\u015bci okresy szczytowej wydajno\u015bci.<\/p>\n\n\n\n<p>Je\u017celi jeste\u015bcie ciekawi, jak w praktyce prezentuje si\u0119 Leyden, Brian Goetz opublikowa\u0142 analiz\u0119 <a href=\"https:\/\/openjdk.org\/projects\/leyden\/notes\/04-condensing-bootstraps\">Condensing Indy Bootstraps<\/a>. Opisuje ona, jak ca\u0142y proces wygl\u0105da w wypadku generowania dodatkowego kodu na np. Na potrzeby lambd dzi\u0119ki instrukcjom Invoke Dynamics. To wymaga jednak bazowej wiedzy na temat tego jak w tej chwili wygl\u0105da dzia\u0142anie instrukcji <code>invokedynamic<\/code> czy obiekt\u00f3w <code>CallSite<\/code> i <code>MethodHandle<\/code>. Dodatkowo, pojawi\u0142 si\u0119 jeszcze jeden dodatkowy, zaawansowany <a href=\"https:\/\/cr.openjdk.org\/~jrose\/leyden\/after-computed-constants.html\">tekst pokazuj\u0105cy u\u017cycie znajduj\u0105cego si\u0119 jeszcze w draftcie Computed Constants<\/a>, o kt\u00f3rych pisa\u0142em dwie edycje temu. Traktujcie wi\u0119c oba jako lektur\u0119 nadobowi\u0105zkow\u0105 \ud83d\ude04<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/7wj759.jpg\" alt=\"\"\/><\/figure><\/div>\n\n\n<h2 id=\"2-co-nowego-w-projekcie-valhalla\" data-num=2>2. Co nowego w Projekcie Valhalla?<\/h2>\n\n\n\n<p>Dawno nie by\u0142o o Valhalli, co? Na szcz\u0119\u015bcie nie znaczy to, \u017ce nic ciekawego si\u0119 nie dzia\u0142o. Projekt ulega dalszej rewolucji i z ka\u017cd\u0105 kolejn\u0105 iteracj\u0105 staje si\u0119 coraz&#8230; prostszy. Jeszcze w czerwcu pisa\u0142em o <a href=\"https:\/\/vived.substack.com\/p\/the-compact-overview-of-jdk-21s-frozen\">uproszczeniach przy okazji obs\u0142ugi nullowalno\u015bci<\/a>, teraz za\u015b uproszczenia odbywaj\u0105 si\u0119 na poziomie maszyny wirtualnej. \u017beby jednak lepiej zrozumie\u0107 o co chodzi &#8211; odrobinka teorii.<\/p>\n\n\n\n<p>Tak zwane L-typy reprezentuj\u0105 tradycyjne typy referencyjne w Java Virtual Machine (JVM). S\u0105 to wi\u0119c podstawowe deskryptory (parametry opisuj\u0105ce) klas Java, z kt\u00f3rymi programi\u015bci pracuj\u0105 od lat. Gdy &#8222;zwyk\u0142y&#8221; obiekt Java jest tworzony, istnieje on w pami\u0119ci, a z poziomu kodu operujemy na jego referencji. Ten mechanizm zapewnia, \u017ce operacje na obiekcie zmieniaj\u0105 jego stan w scentralizowanym miejscu.<\/p>\n\n\n\n<p>Valhalla wprowadza za\u015b Value Classy, b\u0119d\u0105ce pojemnikami na dane bez w\u0142asnej to\u017csamo\u015bci. Dla przyk\u0142adu, je\u015bli mieliby\u015bmy klas\u0119 warto\u015bciow\u0105 reprezentuj\u0105c\u0105 punkt w przestrzeni ze wsp\u00f3\u0142rz\u0119dnymi X i Y, dwie instancje o tych samych wsp\u00f3\u0142rz\u0119dnych s\u0105 nieodr\u00f3\u017cnialne, w przeciwie\u0144stwie do tradycyjnych obiekt\u00f3w, gdzie nawet je\u015bli dane s\u0105 takie same, ka\u017cdy obiekt ma unikaln\u0105 to\u017csamo\u015b\u0107.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-5.png\" alt=\"\" class=\"wp-image-16652\" width=\"475\" height=\"386\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-5.png 950w, https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-5-300x244.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-5-768x624.png 768w\" sizes=\"auto, (max-width: 475px) 100vw, 475px\" \/><figcaption class=\"wp-element-caption\">Og\u00f3lnie motyw przewodni Valhalli to to, \u017ce nie ka\u017cda to\u017csamo\u015b\u0107 jest warto\u015bciowa <\/figcaption><\/figure><\/div>\n\n\n<p>Dlaczego jest to istotne? Przekazywanie danych przez warto\u015b\u0107 mo\u017ce prowadzi\u0107 do poprawy wydajno\u015bci, zw\u0142aszcza przy intensywnym korzystaniu z danych. Co wi\u0119cej, oferuje bardziej przewidywalne i zwi\u0119z\u0142e zachowanie, zw\u0142aszcza w \u015brodowiskach wielow\u0105tkowych, gdy\u017c nie ma efekt\u00f3w ubocznych zwi\u0105zanych z odniesieniami.<\/p>\n\n\n\n<p>Jednak wprowadzenie klas warto\u015bciowych nie by\u0142o proste. Pocz\u0105tkowo nowe Q-typy na poziomie JVM oraz tak zwany bajtkod v (czyli warianty wi\u0119kszo\u015bci operacji z przedrostkiem v, jak na przyk\u0142ad <code>vload<\/code> b\u0119d\u0105cy odpowiednikiem istniej\u0105cego <code>aload<\/code>) by\u0142y uwa\u017cane za konieczne do operowania na tych nowych strukturach danych. Wymaga\u0142oby to od programist\u00f3w i JVM obs\u0142ugi dw\u00f3ch odr\u0119bnych system\u00f3w, co mog\u0142o komplikowa\u0107 kod i zmniejsza\u0107 korzy\u015bci wynikaj\u0105ce z korzystania z klas warto\u015bciowych.<\/p>\n\n\n\n<p>Ale w miar\u0119 dojrzewania projektu Valhalla okaza\u0142o si\u0119 jednak, \u017ce tradycyjne L-typy, z pewnymi modyfikacjami i optymalizacjami, mog\u0142yby potencjalnie reprezentowa\u0107 Value Class. Mo\u017cna si\u0119 wi\u0119c oby\u0107 bez oddzielnych Q-types i specjalnego bajtkod\u00f3w v, co gwarantuje, \u017ce adopcja klas warto\u015bciowych nie skutkuje drastycznymi zmianami w ca\u0142ym systemie ani masowymi rekompilacjami. Tekst <a href=\"https:\/\/cr.openjdk.org\/~jrose\/values\/larval-values.html\">new\/dup\/init: The Dance Goes On<\/a> Johna Rose, kt\u00f3ry ukaza\u0142 si\u0119 w zesz\u0142ym tygodniu, opisuje za\u015b szczeg\u00f3\u0142y, jak zaproponowane uproszczenie afektuje tworzenie obiekt\u00f3w<\/p>\n\n\n\n<p>Podsumowuj\u0105c: W projektowaniu Java Virtual Machine (JVM) preferowany jest jasny i prosty model. Dodawanie skomplikowanych element\u00f3w, takich jak Q-types i v-bytecode, komplikuje ca\u0142y system, sprawiaj\u0105c \u017ce jest trudniejszy w utrzymaniu. Nowa iteracja Valhalli upraszcza design i redukuje przysz\u0142y d\u0142ug techniczny dzi\u0119ki unikni\u0119cia niepotrzebnej duplikacji afektuj\u0105cych ca\u0142y system.<\/p>\n\n\n\n<h2 id=\"3-project-hermes-nowy-protokol-przesylu-danych-sieciowych\" data-num=3>3. Project Hermes &#8211; nowy protok\u00f3\u0142 przesy\u0142u danych sieciowych<\/h2>\n\n\n\n<p>A na koniec co\u015b wychodz\u0105cego poza JDK, ale pozostaj\u0105c w \u015bwiecie niskopoziomowych komponent\u00f3w.<\/p>\n\n\n\n<p>Termin Big Data przez lata przesz\u0142y znacz\u0105c\u0105 ewolucj\u0119 od czasu swojego pocz\u0105tku opartego na modelu programowania MapReduce dwa dekady temu. Dzisiaj wielu <a href=\"https:\/\/motherduck.com\/blog\/big-data-is-dead\/\">wr\u00f3\u017cy mu \u015bmier\u0107<\/a>, ale wydaje mi si\u0119, \u017ce raczej specjali\u015bci w tym zakresie nie maj\u0105 si\u0119 czego obawia\u0107 w najbli\u017cszym czasie, mimo tego, \u017ce \u015bwiat regularnie znajduje sobie nowe obiekty po\u017c\u0105dania.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"500\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-8.png\" alt=\"\" class=\"wp-image-16661\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-8.png 500w, https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-8-300x300.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-8-150x150.png 150w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure><\/div>\n\n\n<p>Dlaczego w og\u00f3le zreszt\u0105 o tym temacie wspominam? Poniewa\u017c wiele rozwi\u0105za\u0144 z dziedziny big data jest rozwijana w Java. Takie systemy s\u0105 zwykle projektowane do dzia\u0142ania na wielu serwerach w chmurach obliczeniowych, gdzie skalowanie poprzez dodawanie jednostek jest bardziej op\u0142acalne ni\u017c zakup drogich superkomputer\u00f3w &#8211; a do tego Java sprawdza si\u0119 bardzo dobrze. Tak zwane skalowanie horyzontalne ma jednak swoje problemy &#8211; operacje jak reduce, aggregate czy join zwykle wymagaj\u0105 intensywnego transferu danych przez sie\u0107, co cz\u0119sto czyni j\u0105 w\u0105skim gard\u0142em &#8211; fizyka i <a href=\"https:\/\/www.researchgate.net\/publication\/322500050_Fallacies_of_Distributed_Computing_Explained\">Fallacies of Distributed Computing<\/a>, mimo up\u0142ywu lat od ich publikacji, pozostaj\u0105 w mocy. I o ile dostawcy chmur oferuj\u0105 obecnie ultranowoczesne sieci InfiniBand, kt\u00f3re osi\u0105gaj\u0105 przepustowo\u015b\u0107 nawet do 200 Gbit\/s z minimalnym op\u00f3\u017anieniem. Jednak\u017ce model sieciowy Javy, oparte na gniazdach TCP\/UDP, wprowadzaj\u0105 dodatkowy narzut podczas korzystania ze wspomnianego InfiniBand. Co prawda biblioteki takie jak <a href=\"https:\/\/www.ibm.com\/docs\/en\/sdk-java-technology\/8?topic=only-jsor-native-interoperability-linux\">JSOR<\/a> czy <a href=\"https:\/\/www.ibm.com\/docs\/en\/sdk-java-technology\/8\">jVerbs<\/a> rozwi\u0105zuj\u0105 ten problem, daj\u0105c Javie bezpo\u015bredni dost\u0119p do InfiniBand, ale wymagaj\u0105 one modyfikacji aplikacji i s\u0105 oparte na Java Native Interface (JNI).<\/p>\n\n\n\n<p>Tutaj do gry wchodzi <a href=\"https:\/\/blogs.oracle.com\/research\/post\/university-of-dsseldorf-develops-network-agnostic-ultrafast-communication-solution-for-java\">Projekt Hermes<\/a>, kt\u00f3ry ma na celu unowocze\u015bni\u0107 obs\u0142ug\u0119 sieci w Javie, oferuj\u0105c rozwi\u0105zanie komunikacyjne o ultrawysokiej pr\u0119dko\u015bci. Inicjatywa ta opiera si\u0119 o Projekt Panama i znane Wam pewnie <a href=\"https:\/\/openjdk.org\/jeps\/424\">Foreign Function &amp; Memory API<\/a>, kt\u00f3re w ko\u0144cu zast\u0105pi\u0107 ma podatne na b\u0142\u0119dy JNI. Hermes wprowadza dwie biblioteki open-source: <a href=\"https:\/\/github.com\/hhu-bsinfo\/infinileap\">Infinileap<\/a>, kt\u00f3ra daje Javie bezpo\u015bredni interfejs do <a href=\"https:\/\/github.com\/openucx\/ucx\">natywnej biblioteki UCX<\/a>, obs\u0142uguj\u0105cej r\u00f3\u017cne sieci, oraz <a href=\"https:\/\/github.com\/hhu-bsinfo\/hadroNIO\">hadroNIO<\/a>, kt\u00f3ra oferuje wsparcie Java NIO oparte na tej bibliotece. Po testach na infrastrukturze chmury Oracle (bo to w\u0142a\u015bnie ta firma jest jednym ze sponsor\u00f3w projektu, mimo \u017ce ten nie jest raczej oficjalnym projektem JDK), Hermes zademonstrowa\u0142 w pierwszych efektach znacz\u0105ce poprawy wydajno\u015bci dla aplikacji opartych o Netty&#8217;ego. W planach na przysz\u0142o\u015b\u0107 jest przeprowadzenie bardziej kompleksowych test\u00f3w skalowalno\u015bci oraz wprowadzenie niezale\u017cnego API dla Infinileap dla r\u00f3\u017cnych j\u0119zyk\u00f3w programowania, wykorzystuj\u0105cego wzorzec Sidecar.<\/p>\n\n\n\n<p>Jest to kolejna rzecz, kt\u00f3ra co prawda nie jest widoczna na pierwszy rzut oka, ale u\u0142atwi wykorzystanie Javy w najbardziej wymagaj\u0105cych workloadach. Jest to taki typowy puzzel, ale wa\u017cny dla ca\u0142ej uk\u0142adanki. Jak to w projektach akademickich, ukaza\u0142 si\u0119 whitepaper <a href=\"https:\/\/arxiv.org\/pdf\/2209.14048.pdf\">Accelerating netty-based applications through transparent InfiniBand support<\/a>, w kt\u00f3rym znajdziecie wi\u0119cej szczeg\u00f3\u0142\u00f3w.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/xXkEy5F.jpg\" alt=\"\" width=\"480\" height=\"452\"\/><\/figure><\/div>\n\n\n<p>I dalej propsuje nazywanie projekt\u00f3w w oparciu o motywy mitologiczne, zw\u0142aszcza kiedy dzieje si\u0119 to w tak sprytny spos\u00f3b.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Na zako\u0144czenie pragn\u0119 podzieli\u0107 si\u0119 z Wami pewn\u0105 rekomendacj\u0105, kt\u00f3ra jest dla mnie szczeg\u00f3lnie osobista. Jeden z pierwszych artyku\u0142\u00f3w, kt\u00f3re mia\u0142em okazj\u0119 opublikowa\u0107, nosi\u0142 tytu\u0142 <a href=\"https:\/\/up.smartrecruiters.com\/we-tried-groovy-ee-and-what-we-learned-from-it-5b78c8f963de\">We tried Groovy EE \u2014 and what we have learned from it<\/a>. W nim podzieli\u0142em si\u0119 do\u015bwiadczeniami zwi\u0105zanymi z u\u017cyciem Groovy w kontek\u015bcie aplikacji Java EE. Pami\u0119tam, \u017ce pozna\u0142em ten j\u0119zyk dzi\u0119ki ksi\u0105\u017cce <a href=\"https:\/\/www.manning.com\/books\/making-java-groovy\">Making Java Groovy<\/a> autorstwa Kena Kousena. Z tego powodu z ogromn\u0105 przyjemno\u015bci\u0105 polecam Wam jego Newsletter, kt\u00f3ry jest dost\u0119pny na Substacku pod nazw\u0105 <a href=\"https:\/\/kenkousen.substack.com\/\">Tales from the jar side<\/a>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-6-1024x686.png\" alt=\"\" class=\"wp-image-16655\" width=\"512\" height=\"343\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-6-1024x686.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-6-300x201.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-6-768x515.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-6-1536x1030.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-6.png 1644w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><\/figure><\/div>\n\n\n<p>Stanowi on znakomite \u017ar\u00f3d\u0142o wiedzy nie tylko na temat Javy (kt\u00f3ra jest prezentowana w nieco bardziej og\u00f3lnym kontek\u015bcie, ni\u017c tylko techniczne aspekty JVM i JEP), ale r\u00f3wnie\u017c g\u0142\u0119bokich analiz oraz innych tre\u015bci, kt\u00f3re Ken poleca. Warto doda\u0107, \u017ce ka\u017cda edycja newslettera ma r\u00f3wnie\u017c <a href=\"https:\/\/www.youtube.com\/@talesfromthejarside\">swoj\u0105 wersj\u0119 wideo<\/a> oraz zabawnych znalezisk z sieci &#8211; je\u015bli lubicie humor tego newslettera, jestem pewien, \u017ce materia\u0142y Kena te\u017c si\u0119 Wam spodobaj\u0105.<\/p>\n\n\n\n<p>Dlatego te\u017c&nbsp;serdecznie zach\u0119cam do zapoznania si\u0119 z <a href=\"https:\/\/kenkousen.substack.com\/\">Tales from the jar side<\/a> \ud83d\ude00<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tydzie\u0144 temu skupili\u015bmy si\u0119 g\u0142\u00f3wnie na nowych wydaniach, dzisiejsza edycja za\u015b po\u015bwi\u0119cona zosta\u0142a w pe\u0142ni niskopoziomowym nowo\u015bciom, kt\u00f3rych ostatnio r\u00f3wnie\u017c mieli\u015bmy wysyp. <\/p>\n","protected":false},"author":10,"featured_media":16669,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[259,1],"tags":[],"class_list":["post-16646","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jvm-pl","category-no-category"],"acf":{"estimated_reading_time":"9","feature_image_blog":false,"weekly_summary":true,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/JVM-Weekly-1200x628_V2-7.png","feature_image_visible":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Niskopoziomowe nowo\u015bci: Projekt Leyden, Projekt Valhalla i Projekt Hermes - JVM Weekly vol. 146 - Vived<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Niskopoziomowe nowo\u015bci: Projekt Leyden, Projekt Valhalla i Projekt Hermes - JVM Weekly vol. 146 - Vived\" \/>\n<meta property=\"og:description\" content=\"Tydzie\u0144 temu skupili\u015bmy si\u0119 g\u0142\u00f3wnie na nowych wydaniach, dzisiejsza edycja za\u015b po\u015bwi\u0119cona zosta\u0142a w pe\u0142ni niskopoziomowym nowo\u015bciom, kt\u00f3rych ostatnio r\u00f3wnie\u017c mieli\u015bmy wysyp.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2023-08-22T15:53:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-22T15:53:08+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/JVM-Weekly-1200x628_V2-7.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Artur Skowro\u0144ski\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"Niskopoziomowe nowo\u015bci: Projekt Leyden, Projekt Valhalla i Projekt Hermes &#8211; JVM Weekly vol. 146\",\"datePublished\":\"2023-08-22T15:53:03+00:00\",\"dateModified\":\"2023-08-22T15:53:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/\"},\"wordCount\":1948,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/JVM-Weekly-1200x628_V2-7.png\",\"articleSection\":[\"JVM\",\"No category\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/\",\"url\":\"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/\",\"name\":\"Niskopoziomowe nowo\u015bci: Projekt Leyden, Projekt Valhalla i Projekt Hermes - JVM Weekly vol. 146 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/JVM-Weekly-1200x628_V2-7.png\",\"datePublished\":\"2023-08-22T15:53:03+00:00\",\"dateModified\":\"2023-08-22T15:53:08+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/JVM-Weekly-1200x628_V2-7.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/JVM-Weekly-1200x628_V2-7.png\",\"width\":1200,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Niskopoziomowe nowo\u015bci: Projekt Leyden, Projekt Valhalla i Projekt Hermes &#8211; JVM Weekly vol. 146\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/vived.io\/pl\/#website\",\"url\":\"https:\/\/vived.io\/pl\/\",\"name\":\"Vived\",\"description\":\"platform empowering IT people and technology companies to synergic growth\",\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/vived.io\/pl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/vived.io\/pl\/#organization\",\"name\":\"Vived\",\"url\":\"https:\/\/vived.io\/pl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png\",\"width\":136,\"height\":45,\"caption\":\"Vived\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\",\"name\":\"Artur Skowro\u0144ski\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g\",\"caption\":\"Artur Skowro\u0144ski\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Niskopoziomowe nowo\u015bci: Projekt Leyden, Projekt Valhalla i Projekt Hermes - JVM Weekly vol. 146 - Vived","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/","og_locale":"pl_PL","og_type":"article","og_title":"Niskopoziomowe nowo\u015bci: Projekt Leyden, Projekt Valhalla i Projekt Hermes - JVM Weekly vol. 146 - Vived","og_description":"Tydzie\u0144 temu skupili\u015bmy si\u0119 g\u0142\u00f3wnie na nowych wydaniach, dzisiejsza edycja za\u015b po\u015bwi\u0119cona zosta\u0142a w pe\u0142ni niskopoziomowym nowo\u015bciom, kt\u00f3rych ostatnio r\u00f3wnie\u017c mieli\u015bmy wysyp.","og_url":"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/","og_site_name":"Vived","article_published_time":"2023-08-22T15:53:03+00:00","article_modified_time":"2023-08-22T15:53:08+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/JVM-Weekly-1200x628_V2-7.png","type":"image\/png"}],"author":"Artur Skowro\u0144ski","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"Niskopoziomowe nowo\u015bci: Projekt Leyden, Projekt Valhalla i Projekt Hermes &#8211; JVM Weekly vol. 146","datePublished":"2023-08-22T15:53:03+00:00","dateModified":"2023-08-22T15:53:08+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/"},"wordCount":1948,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/JVM-Weekly-1200x628_V2-7.png","articleSection":["JVM","No category"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/","url":"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/","name":"Niskopoziomowe nowo\u015bci: Projekt Leyden, Projekt Valhalla i Projekt Hermes - JVM Weekly vol. 146 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/JVM-Weekly-1200x628_V2-7.png","datePublished":"2023-08-22T15:53:03+00:00","dateModified":"2023-08-22T15:53:08+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/JVM-Weekly-1200x628_V2-7.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/JVM-Weekly-1200x628_V2-7.png","width":1200,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/niskopoziomowe-nowosci-projekt-leyden-projekt-valhalla-i-projekt-hermes-jvm-weekly-vol-146\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Niskopoziomowe nowo\u015bci: Projekt Leyden, Projekt Valhalla i Projekt Hermes &#8211; JVM Weekly vol. 146"}]},{"@type":"WebSite","@id":"https:\/\/vived.io\/pl\/#website","url":"https:\/\/vived.io\/pl\/","name":"Vived","description":"platform empowering IT people and technology companies to synergic growth","publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vived.io\/pl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/vived.io\/pl\/#organization","name":"Vived","url":"https:\/\/vived.io\/pl\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/","url":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","width":136,"height":45,"caption":"Vived"},"image":{"@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3","name":"Artur Skowro\u0144ski","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g","caption":"Artur Skowro\u0144ski"}}]}},"blocks_vived":[{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">1. Co nowego w Projekcie Leyden?<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">1. Co nowego w Projekcie Leyden?<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>S\u0105 projekty w JVM, kt\u00f3re w wi\u0119kszym stopniu ni\u017c inne przebijaj\u0105 si\u0119 do masowej \u015bwiadomo\u015bci. Wi\u0119kszo\u015b\u0107 ludzi s\u0142ysza\u0142a o Loomie i Valhalli, pewnie Panama te\u017c istnieje w \u015bwiadomo\u015bci spo\u0142eczno\u015bci (cho\u0107 jestem sk\u0142onny si\u0119 za\u0142o\u017cy\u0107, \u017ce wi\u0119kszo\u015b\u0107 os\u00f3b nie chcia\u0142aby mie\u0107 z ni\u0105 za wiele do czynienia w praktyce). Tymczasem istniej\u0105 te\u017c mniej znane projekty, takie jak Leyden, kt\u00f3re zwi\u0105zane s\u0105 g\u0142\u0119boko z technicznym aspektem JVM. Mimo ich specjalistycznego charakteru, s\u0105 one (przynajmniej dla mnie) niesamowicie fascynuj\u0105ce. Dlatego ciesz\u0119 si\u0119, \u017ce maj\u0105c \u015bwie\u017ce informacje prosto z <a href=\"https:\/\/cr.openjdk.org\/~jrose\/pres\/202308-Leyden-JVMLS.pdf\">JVM Language Summit<\/a>, mog\u0119 jeszcze raz przybli\u017cy\u0107 cele, ale te\u017c zarysowa\u0107 Wam najnowsze kierunki rozwoju tego projektu.<\/p>\n","innerContent":["\n<p>S\u0105 projekty w JVM, kt\u00f3re w wi\u0119kszym stopniu ni\u017c inne przebijaj\u0105 si\u0119 do masowej \u015bwiadomo\u015bci. Wi\u0119kszo\u015b\u0107 ludzi s\u0142ysza\u0142a o Loomie i Valhalli, pewnie Panama te\u017c istnieje w \u015bwiadomo\u015bci spo\u0142eczno\u015bci (cho\u0107 jestem sk\u0142onny si\u0119 za\u0142o\u017cy\u0107, \u017ce wi\u0119kszo\u015b\u0107 os\u00f3b nie chcia\u0142aby mie\u0107 z ni\u0105 za wiele do czynienia w praktyce). Tymczasem istniej\u0105 te\u017c mniej znane projekty, takie jak Leyden, kt\u00f3re zwi\u0105zane s\u0105 g\u0142\u0119boko z technicznym aspektem JVM. Mimo ich specjalistycznego charakteru, s\u0105 one (przynajmniej dla mnie) niesamowicie fascynuj\u0105ce. Dlatego ciesz\u0119 si\u0119, \u017ce maj\u0105c \u015bwie\u017ce informacje prosto z <a href=\"https:\/\/cr.openjdk.org\/~jrose\/pres\/202308-Leyden-JVMLS.pdf\">JVM Language Summit<\/a>, mog\u0119 jeszcze raz przybli\u017cy\u0107 cele, ale te\u017c zarysowa\u0107 Wam najnowsze kierunki rozwoju tego projektu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Leyden radykalnie zmienia optymalizacj\u0119 Javy, wprowadzaj\u0105c technik\u0119, kt\u00f3ra w oryginalne brzmi \"shifting and constraining\", co w moim lu\u017anym t\u0142umaczeniu oznacza \"przesuwania i ograniczania\" oblicze\u0144. Zamiast polega\u0107 wy\u0142\u0105cznie na kompilowaniu w runtime, Leyden przesuwa niekt\u00f3re z niezb\u0119dnych operacji optymalizacji do wcze\u015bniejszych faz, w zale\u017cno\u015bci od wymaga\u0144 konkretnego programu i \u015brodowiska uruchomieniowego - \u017cyjemy w ko\u0144cu w \u015bwiecie autoscalingu, chmur i innych kubernetes\u00f3w.<\/p>\n","innerContent":["\n<p>Leyden radykalnie zmienia optymalizacj\u0119 Javy, wprowadzaj\u0105c technik\u0119, kt\u00f3ra w oryginalne brzmi \"shifting and constraining\", co w moim lu\u017anym t\u0142umaczeniu oznacza \"przesuwania i ograniczania\" oblicze\u0144. Zamiast polega\u0107 wy\u0142\u0105cznie na kompilowaniu w runtime, Leyden przesuwa niekt\u00f3re z niezb\u0119dnych operacji optymalizacji do wcze\u015bniejszych faz, w zale\u017cno\u015bci od wymaga\u0144 konkretnego programu i \u015brodowiska uruchomieniowego - \u017cyjemy w ko\u0144cu w \u015bwiecie autoscalingu, chmur i innych kubernetes\u00f3w.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>G\u0142\u00f3wnym nowym klockiem wprowadzanym przez Leyden s\u0105 tak zwane \"kondensatory\" (condensers). Mo\u017cna je sobie wyobrazi\u0107 jako specjalizowane narz\u0119dzia dzia\u0142aj\u0105ce sekwencyjnie, udoskonalaj\u0105c kod aplikacji. Proces rozpoczyna si\u0119 od bazowej, konfiguracji aplikacji. Przechodz\u0105c przez ka\u017cdy kondensator, wprowadzane s\u0105 transformacje, a\u017c osi\u0105gnie si\u0119 punkt ko\u0144cowy: zoptymalizowan\u0105 wersj\u0119 przeznaczon\u0105 do wydajnego czasu wykonania.<\/p>\n","innerContent":["\n<p>G\u0142\u00f3wnym nowym klockiem wprowadzanym przez Leyden s\u0105 tak zwane \"kondensatory\" (condensers). Mo\u017cna je sobie wyobrazi\u0107 jako specjalizowane narz\u0119dzia dzia\u0142aj\u0105ce sekwencyjnie, udoskonalaj\u0105c kod aplikacji. Proces rozpoczyna si\u0119 od bazowej, konfiguracji aplikacji. Przechodz\u0105c przez ka\u017cdy kondensator, wprowadzane s\u0105 transformacje, a\u017c osi\u0105gnie si\u0119 punkt ko\u0144cowy: zoptymalizowan\u0105 wersj\u0119 przeznaczon\u0105 do wydajnego czasu wykonania.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":16648,"width":991,"height":129,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-3-1024x134.png\" alt=\"\" class=\"wp-image-16648\" width=\"991\" height=\"129\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-3-1024x134.png\" alt=\"\" class=\"wp-image-16648\" width=\"991\" height=\"129\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Aby przeprowadzi\u0107 analogi\u0119, mechanizm kondensatora Leyden przypomina middleware w ramach internetowych takich jak Express.js dla Node.js. W rozwoju internetowym middleware przechwytuje \u017c\u0105dania, przetwarza je i ewentualnie modyfikuje przed dotarciem do ich docelowego miejsca. Podobnie kondensatory Leyden przyjmuj\u0105 <code>ApplicationModel<\/code> \u2014 niezmienne przedstawienie aplikacji \u2014 i wytwarzaj\u0105 jego udoskonalon\u0105 wersj\u0119. Podej\u015bcie to zapewnia, \u017ce oryginalny model pozostaje niezmieniony, a optymalizacje tworz\u0105 nowe, ulepszone wersje. Tak\u017ce kod jest stosunkowo prosty.<\/p>\n","innerContent":["\n<p>Aby przeprowadzi\u0107 analogi\u0119, mechanizm kondensatora Leyden przypomina middleware w ramach internetowych takich jak Express.js dla Node.js. W rozwoju internetowym middleware przechwytuje \u017c\u0105dania, przetwarza je i ewentualnie modyfikuje przed dotarciem do ich docelowego miejsca. Podobnie kondensatory Leyden przyjmuj\u0105 <code>ApplicationModel<\/code> \u2014 niezmienne przedstawienie aplikacji \u2014 i wytwarzaj\u0105 jego udoskonalon\u0105 wersj\u0119. Podej\u015bcie to zapewnia, \u017ce oryginalny model pozostaje niezmieniony, a optymalizacje tworz\u0105 nowe, ulepszone wersje. Tak\u017ce kod jest stosunkowo prosty.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>interface Condenser {\n    ApplicationModel condense(ApplicationModel model);\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>interface Condenser {\n    ApplicationModel condense(ApplicationModel model);\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Oczywi\u015bcie, ca\u0142a magia opiera si\u0119 w samej klasie <code>ApplicationModel<\/code>, ale ch\u0119tnych zach\u0119cam do sprawdzenia artyku\u0142u <a href=\"https:\/\/openjdk.org\/projects\/leyden\/notes\/03-toward-condensers\">Toward Condensers<\/a> autorstwa Briana Goetza, Marka Reinholda, &amp; Paula Sandoza. Tam te\u017c znajdziecie wi\u0119cej szczeg\u00f3\u0142\u00f3w i przyk\u0142ad\u00f3w kodu. Ja tu zostawi\u0119 jeszcze jeden przyk\u0142adowy sample, kt\u00f3ry my\u015bl\u0119 deskryptywne obrazuje u\u017cycie:<\/p>\n","innerContent":["\n<p>Oczywi\u015bcie, ca\u0142a magia opiera si\u0119 w samej klasie <code>ApplicationModel<\/code>, ale ch\u0119tnych zach\u0119cam do sprawdzenia artyku\u0142u <a href=\"https:\/\/openjdk.org\/projects\/leyden\/notes\/03-toward-condensers\">Toward Condensers<\/a> autorstwa Briana Goetza, Marka Reinholda, &amp; Paula Sandoza. Tam te\u017c znajdziecie wi\u0119cej szczeg\u00f3\u0142\u00f3w i przyk\u0142ad\u00f3w kodu. Ja tu zostawi\u0119 jeszcze jeden przyk\u0142adowy sample, kt\u00f3ry my\u015bl\u0119 deskryptywne obrazuje u\u017cycie:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>@Override\npublic ApplicationModel condense(ApplicationModel model) {\n    ModelUpdater updater = model.updater();\n    Stream.concat(model.modules(), model.classPath())\n        .flatMap(model::classes)\n        .forEach(classKey -&gt; {\n            ClassModel cm =  if (cm != null) {\n                                \/\/\/ do transformation on Classes\n                updater.addToContainer(classKey, ClassContents.of(cm));\n            }\n        });\n    return updater.apply();\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>@Override\npublic ApplicationModel condense(ApplicationModel model) {\n    ModelUpdater updater = model.updater();\n    Stream.concat(model.modules(), model.classPath())\n        .flatMap(model::classes)\n        .forEach(classKey -&gt; {\n            ClassModel cm =  if (cm != null) {\n                                \/\/\/ do transformation on Classes\n                updater.addToContainer(classKey, ClassContents.of(cm));\n            }\n        });\n    return updater.apply();\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jednak Leyden nie opiera si\u0119 wy\u0142\u0105cznie wy\u0142\u0105cznie na statycznej transformacji. Obecnie Java u\u017cywa strategii \"kompilacji warstwowej\" (Tiered Compilation) do osi\u0105gni\u0119cia szczytowej wydajno\u015bci. Zacz\u0105wszy od Poziomu 0, gdzie JVM zaczyna interpretowa\u0107 bajtkod, aplikacje stopniowo przechodz\u0105 do Poziomu 4, kt\u00f3ry korzysta ju\u017c&nbsp;z zoptymalizowanego kodu. Kolejne etapy osi\u0105gane s\u0105 ju\u017c podczas dzia\u0142ania aplikacji. Je\u015bli potrzebujecie wi\u0119cej, \u015bwietny tekst <a href=\"https:\/\/devblogs.microsoft.com\/java\/how-tiered-compilation-works-in-openjdk\/\">How Tiered Compilation works in OpenJDK<\/a> na ten temat opublikowa\u0142 niedawno Cesar Soares z Microsoftu. Leyden za\u015b&nbsp;udoskonala ten proces.<\/p>\n","innerContent":["\n<p>Jednak Leyden nie opiera si\u0119 wy\u0142\u0105cznie wy\u0142\u0105cznie na statycznej transformacji. Obecnie Java u\u017cywa strategii \"kompilacji warstwowej\" (Tiered Compilation) do osi\u0105gni\u0119cia szczytowej wydajno\u015bci. Zacz\u0105wszy od Poziomu 0, gdzie JVM zaczyna interpretowa\u0107 bajtkod, aplikacje stopniowo przechodz\u0105 do Poziomu 4, kt\u00f3ry korzysta ju\u017c&nbsp;z zoptymalizowanego kodu. Kolejne etapy osi\u0105gane s\u0105 ju\u017c podczas dzia\u0142ania aplikacji. Je\u015bli potrzebujecie wi\u0119cej, \u015bwietny tekst <a href=\"https:\/\/devblogs.microsoft.com\/java\/how-tiered-compilation-works-in-openjdk\/\">How Tiered Compilation works in OpenJDK<\/a> na ten temat opublikowa\u0142 niedawno Cesar Soares z Microsoftu. Leyden za\u015b&nbsp;udoskonala ten proces.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wspomniana ju\u017c <a href=\"https:\/\/cr.openjdk.org\/~jrose\/pres\/202308-Leyden-JVMLS.pdf\">aktualizacja z JVM Language Summit<\/a> wprowadza tak zwane \"biegi treningowe\". S\u0105 to w symulacje dzia\u0142ania aplikacji, maj\u0105ce na celu zebranie danych behawioralnych. Analizuj\u0105c zachowanie aplikacji w r\u00f3\u017cnych scenariuszach w runtime, kondensatory mog\u0105 uzyska\u0107 kluczowe informacje o zachowaniu aplikacji w produkcyjnym \u015brodowisku. Dzi\u0119ki temu wprowadzane udoskonalenia opieraj\u0105 si\u0119 nie tylko na teoretycznych modelach, ale s\u0105 zakorzenione w rzeczywistych dynamikach aplikacji - tak jak ma to miejsce np. w <a href=\"https:\/\/www.graalvm.org\/22.0\/reference-manual\/native-image\/PGO\/\">Profile-Guided Optimizations<\/a> (PGO) w GraalVM. O GraalVM zreszt\u0105 te\u017c mo\u017cna my\u015ble\u0107 jak o kolejnym kondensatorze.<\/p>\n","innerContent":["\n<p>Wspomniana ju\u017c <a href=\"https:\/\/cr.openjdk.org\/~jrose\/pres\/202308-Leyden-JVMLS.pdf\">aktualizacja z JVM Language Summit<\/a> wprowadza tak zwane \"biegi treningowe\". S\u0105 to w symulacje dzia\u0142ania aplikacji, maj\u0105ce na celu zebranie danych behawioralnych. Analizuj\u0105c zachowanie aplikacji w r\u00f3\u017cnych scenariuszach w runtime, kondensatory mog\u0105 uzyska\u0107 kluczowe informacje o zachowaniu aplikacji w produkcyjnym \u015brodowisku. Dzi\u0119ki temu wprowadzane udoskonalenia opieraj\u0105 si\u0119 nie tylko na teoretycznych modelach, ale s\u0105 zakorzenione w rzeczywistych dynamikach aplikacji - tak jak ma to miejsce np. w <a href=\"https:\/\/www.graalvm.org\/22.0\/reference-manual\/native-image\/PGO\/\">Profile-Guided Optimizations<\/a> (PGO) w GraalVM. O GraalVM zreszt\u0105 te\u017c mo\u017cna my\u015ble\u0107 jak o kolejnym kondensatorze.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wykorzystuj\u0105c informacje uzyskane podczas \"bieg\u00f3w treningowych\" (o kt\u00f3rych za chwile), Leyden wprowadza kluczowe optymalizacje jeszcze przed rozpocz\u0119ciem dzia\u0142ania. Dlatego, gdy aplikacja rozpoczyna standardow\u0105 warstwowy system Javy, ma ju\u017c przewag\u0119. To proaktywne podej\u015bcie nie tylko przyspiesza proces \"rozgrzewania\", ale umo\u017cliwia d\u0142u\u017csze okresy szczytowej wydajno\u015bci okresy szczytowej wydajno\u015bci.<\/p>\n","innerContent":["\n<p>Wykorzystuj\u0105c informacje uzyskane podczas \"bieg\u00f3w treningowych\" (o kt\u00f3rych za chwile), Leyden wprowadza kluczowe optymalizacje jeszcze przed rozpocz\u0119ciem dzia\u0142ania. Dlatego, gdy aplikacja rozpoczyna standardow\u0105 warstwowy system Javy, ma ju\u017c przewag\u0119. To proaktywne podej\u015bcie nie tylko przyspiesza proces \"rozgrzewania\", ale umo\u017cliwia d\u0142u\u017csze okresy szczytowej wydajno\u015bci okresy szczytowej wydajno\u015bci.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u017celi jeste\u015bcie ciekawi, jak w praktyce prezentuje si\u0119 Leyden, Brian Goetz opublikowa\u0142 analiz\u0119 <a href=\"https:\/\/openjdk.org\/projects\/leyden\/notes\/04-condensing-bootstraps\">Condensing Indy Bootstraps<\/a>. Opisuje ona, jak ca\u0142y proces wygl\u0105da w wypadku generowania dodatkowego kodu na np. Na potrzeby lambd dzi\u0119ki instrukcjom Invoke Dynamics. To wymaga jednak bazowej wiedzy na temat tego jak w tej chwili wygl\u0105da dzia\u0142anie instrukcji <code>invokedynamic<\/code> czy obiekt\u00f3w <code>CallSite<\/code> i <code>MethodHandle<\/code>. Dodatkowo, pojawi\u0142 si\u0119 jeszcze jeden dodatkowy, zaawansowany <a href=\"https:\/\/cr.openjdk.org\/~jrose\/leyden\/after-computed-constants.html\">tekst pokazuj\u0105cy u\u017cycie znajduj\u0105cego si\u0119 jeszcze w draftcie Computed Constants<\/a>, o kt\u00f3rych pisa\u0142em dwie edycje temu. Traktujcie wi\u0119c oba jako lektur\u0119 nadobowi\u0105zkow\u0105 \ud83d\ude04<\/p>\n","innerContent":["\n<p>Je\u017celi jeste\u015bcie ciekawi, jak w praktyce prezentuje si\u0119 Leyden, Brian Goetz opublikowa\u0142 analiz\u0119 <a href=\"https:\/\/openjdk.org\/projects\/leyden\/notes\/04-condensing-bootstraps\">Condensing Indy Bootstraps<\/a>. Opisuje ona, jak ca\u0142y proces wygl\u0105da w wypadku generowania dodatkowego kodu na np. Na potrzeby lambd dzi\u0119ki instrukcjom Invoke Dynamics. To wymaga jednak bazowej wiedzy na temat tego jak w tej chwili wygl\u0105da dzia\u0142anie instrukcji <code>invokedynamic<\/code> czy obiekt\u00f3w <code>CallSite<\/code> i <code>MethodHandle<\/code>. Dodatkowo, pojawi\u0142 si\u0119 jeszcze jeden dodatkowy, zaawansowany <a href=\"https:\/\/cr.openjdk.org\/~jrose\/leyden\/after-computed-constants.html\">tekst pokazuj\u0105cy u\u017cycie znajduj\u0105cego si\u0119 jeszcze w draftcie Computed Constants<\/a>, o kt\u00f3rych pisa\u0142em dwie edycje temu. Traktujcie wi\u0119c oba jako lektur\u0119 nadobowi\u0105zkow\u0105 \ud83d\ude04<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/7wj759.jpg\" alt=\"\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/7wj759.jpg\" alt=\"\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">2. Co nowego w Projekcie Valhalla?<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">2. Co nowego w Projekcie Valhalla?<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dawno nie by\u0142o o Valhalli, co? Na szcz\u0119\u015bcie nie znaczy to, \u017ce nic ciekawego si\u0119 nie dzia\u0142o. Projekt ulega dalszej rewolucji i z ka\u017cd\u0105 kolejn\u0105 iteracj\u0105 staje si\u0119 coraz... prostszy. Jeszcze w czerwcu pisa\u0142em o <a href=\"https:\/\/vived.substack.com\/p\/the-compact-overview-of-jdk-21s-frozen\">uproszczeniach przy okazji obs\u0142ugi nullowalno\u015bci<\/a>, teraz za\u015b uproszczenia odbywaj\u0105 si\u0119 na poziomie maszyny wirtualnej. \u017beby jednak lepiej zrozumie\u0107 o co chodzi - odrobinka teorii.<\/p>\n","innerContent":["\n<p>Dawno nie by\u0142o o Valhalli, co? Na szcz\u0119\u015bcie nie znaczy to, \u017ce nic ciekawego si\u0119 nie dzia\u0142o. Projekt ulega dalszej rewolucji i z ka\u017cd\u0105 kolejn\u0105 iteracj\u0105 staje si\u0119 coraz... prostszy. Jeszcze w czerwcu pisa\u0142em o <a href=\"https:\/\/vived.substack.com\/p\/the-compact-overview-of-jdk-21s-frozen\">uproszczeniach przy okazji obs\u0142ugi nullowalno\u015bci<\/a>, teraz za\u015b uproszczenia odbywaj\u0105 si\u0119 na poziomie maszyny wirtualnej. \u017beby jednak lepiej zrozumie\u0107 o co chodzi - odrobinka teorii.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Tak zwane L-typy reprezentuj\u0105 tradycyjne typy referencyjne w Java Virtual Machine (JVM). S\u0105 to wi\u0119c podstawowe deskryptory (parametry opisuj\u0105ce) klas Java, z kt\u00f3rymi programi\u015bci pracuj\u0105 od lat. Gdy \"zwyk\u0142y\" obiekt Java jest tworzony, istnieje on w pami\u0119ci, a z poziomu kodu operujemy na jego referencji. Ten mechanizm zapewnia, \u017ce operacje na obiekcie zmieniaj\u0105 jego stan w scentralizowanym miejscu.<\/p>\n","innerContent":["\n<p>Tak zwane L-typy reprezentuj\u0105 tradycyjne typy referencyjne w Java Virtual Machine (JVM). S\u0105 to wi\u0119c podstawowe deskryptory (parametry opisuj\u0105ce) klas Java, z kt\u00f3rymi programi\u015bci pracuj\u0105 od lat. Gdy \"zwyk\u0142y\" obiekt Java jest tworzony, istnieje on w pami\u0119ci, a z poziomu kodu operujemy na jego referencji. Ten mechanizm zapewnia, \u017ce operacje na obiekcie zmieniaj\u0105 jego stan w scentralizowanym miejscu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Valhalla wprowadza za\u015b Value Classy, b\u0119d\u0105ce pojemnikami na dane bez w\u0142asnej to\u017csamo\u015bci. Dla przyk\u0142adu, je\u015bli mieliby\u015bmy klas\u0119 warto\u015bciow\u0105 reprezentuj\u0105c\u0105 punkt w przestrzeni ze wsp\u00f3\u0142rz\u0119dnymi X i Y, dwie instancje o tych samych wsp\u00f3\u0142rz\u0119dnych s\u0105 nieodr\u00f3\u017cnialne, w przeciwie\u0144stwie do tradycyjnych obiekt\u00f3w, gdzie nawet je\u015bli dane s\u0105 takie same, ka\u017cdy obiekt ma unikaln\u0105 to\u017csamo\u015b\u0107.<\/p>\n","innerContent":["\n<p>Valhalla wprowadza za\u015b Value Classy, b\u0119d\u0105ce pojemnikami na dane bez w\u0142asnej to\u017csamo\u015bci. Dla przyk\u0142adu, je\u015bli mieliby\u015bmy klas\u0119 warto\u015bciow\u0105 reprezentuj\u0105c\u0105 punkt w przestrzeni ze wsp\u00f3\u0142rz\u0119dnymi X i Y, dwie instancje o tych samych wsp\u00f3\u0142rz\u0119dnych s\u0105 nieodr\u00f3\u017cnialne, w przeciwie\u0144stwie do tradycyjnych obiekt\u00f3w, gdzie nawet je\u015bli dane s\u0105 takie same, ka\u017cdy obiekt ma unikaln\u0105 to\u017csamo\u015b\u0107.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16652,"width":475,"height":386,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-5.png\" alt=\"\" class=\"wp-image-16652\" width=\"475\" height=\"386\"\/><figcaption class=\"wp-element-caption\">Og\u00f3lnie motyw przewodni Valhalli to to, \u017ce nie ka\u017cda to\u017csamo\u015b\u0107 jest warto\u015bciowa <\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-5.png\" alt=\"\" class=\"wp-image-16652\" width=\"475\" height=\"386\"\/><figcaption class=\"wp-element-caption\">Og\u00f3lnie motyw przewodni Valhalli to to, \u017ce nie ka\u017cda to\u017csamo\u015b\u0107 jest warto\u015bciowa <\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dlaczego jest to istotne? Przekazywanie danych przez warto\u015b\u0107 mo\u017ce prowadzi\u0107 do poprawy wydajno\u015bci, zw\u0142aszcza przy intensywnym korzystaniu z danych. Co wi\u0119cej, oferuje bardziej przewidywalne i zwi\u0119z\u0142e zachowanie, zw\u0142aszcza w \u015brodowiskach wielow\u0105tkowych, gdy\u017c nie ma efekt\u00f3w ubocznych zwi\u0105zanych z odniesieniami.<\/p>\n","innerContent":["\n<p>Dlaczego jest to istotne? Przekazywanie danych przez warto\u015b\u0107 mo\u017ce prowadzi\u0107 do poprawy wydajno\u015bci, zw\u0142aszcza przy intensywnym korzystaniu z danych. Co wi\u0119cej, oferuje bardziej przewidywalne i zwi\u0119z\u0142e zachowanie, zw\u0142aszcza w \u015brodowiskach wielow\u0105tkowych, gdy\u017c nie ma efekt\u00f3w ubocznych zwi\u0105zanych z odniesieniami.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jednak wprowadzenie klas warto\u015bciowych nie by\u0142o proste. Pocz\u0105tkowo nowe Q-typy na poziomie JVM oraz tak zwany bajtkod v (czyli warianty wi\u0119kszo\u015bci operacji z przedrostkiem v, jak na przyk\u0142ad <code>vload<\/code> b\u0119d\u0105cy odpowiednikiem istniej\u0105cego <code>aload<\/code>) by\u0142y uwa\u017cane za konieczne do operowania na tych nowych strukturach danych. Wymaga\u0142oby to od programist\u00f3w i JVM obs\u0142ugi dw\u00f3ch odr\u0119bnych system\u00f3w, co mog\u0142o komplikowa\u0107 kod i zmniejsza\u0107 korzy\u015bci wynikaj\u0105ce z korzystania z klas warto\u015bciowych.<\/p>\n","innerContent":["\n<p>Jednak wprowadzenie klas warto\u015bciowych nie by\u0142o proste. Pocz\u0105tkowo nowe Q-typy na poziomie JVM oraz tak zwany bajtkod v (czyli warianty wi\u0119kszo\u015bci operacji z przedrostkiem v, jak na przyk\u0142ad <code>vload<\/code> b\u0119d\u0105cy odpowiednikiem istniej\u0105cego <code>aload<\/code>) by\u0142y uwa\u017cane za konieczne do operowania na tych nowych strukturach danych. Wymaga\u0142oby to od programist\u00f3w i JVM obs\u0142ugi dw\u00f3ch odr\u0119bnych system\u00f3w, co mog\u0142o komplikowa\u0107 kod i zmniejsza\u0107 korzy\u015bci wynikaj\u0105ce z korzystania z klas warto\u015bciowych.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ale w miar\u0119 dojrzewania projektu Valhalla okaza\u0142o si\u0119 jednak, \u017ce tradycyjne L-typy, z pewnymi modyfikacjami i optymalizacjami, mog\u0142yby potencjalnie reprezentowa\u0107 Value Class. Mo\u017cna si\u0119 wi\u0119c oby\u0107 bez oddzielnych Q-types i specjalnego bajtkod\u00f3w v, co gwarantuje, \u017ce adopcja klas warto\u015bciowych nie skutkuje drastycznymi zmianami w ca\u0142ym systemie ani masowymi rekompilacjami. Tekst <a href=\"https:\/\/cr.openjdk.org\/~jrose\/values\/larval-values.html\">new\/dup\/init: The Dance Goes On<\/a> Johna Rose, kt\u00f3ry ukaza\u0142 si\u0119 w zesz\u0142ym tygodniu, opisuje za\u015b szczeg\u00f3\u0142y, jak zaproponowane uproszczenie afektuje tworzenie obiekt\u00f3w<\/p>\n","innerContent":["\n<p>Ale w miar\u0119 dojrzewania projektu Valhalla okaza\u0142o si\u0119 jednak, \u017ce tradycyjne L-typy, z pewnymi modyfikacjami i optymalizacjami, mog\u0142yby potencjalnie reprezentowa\u0107 Value Class. Mo\u017cna si\u0119 wi\u0119c oby\u0107 bez oddzielnych Q-types i specjalnego bajtkod\u00f3w v, co gwarantuje, \u017ce adopcja klas warto\u015bciowych nie skutkuje drastycznymi zmianami w ca\u0142ym systemie ani masowymi rekompilacjami. Tekst <a href=\"https:\/\/cr.openjdk.org\/~jrose\/values\/larval-values.html\">new\/dup\/init: The Dance Goes On<\/a> Johna Rose, kt\u00f3ry ukaza\u0142 si\u0119 w zesz\u0142ym tygodniu, opisuje za\u015b szczeg\u00f3\u0142y, jak zaproponowane uproszczenie afektuje tworzenie obiekt\u00f3w<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Podsumowuj\u0105c: W projektowaniu Java Virtual Machine (JVM) preferowany jest jasny i prosty model. Dodawanie skomplikowanych element\u00f3w, takich jak Q-types i v-bytecode, komplikuje ca\u0142y system, sprawiaj\u0105c \u017ce jest trudniejszy w utrzymaniu. Nowa iteracja Valhalli upraszcza design i redukuje przysz\u0142y d\u0142ug techniczny dzi\u0119ki unikni\u0119cia niepotrzebnej duplikacji afektuj\u0105cych ca\u0142y system.<\/p>\n","innerContent":["\n<p>Podsumowuj\u0105c: W projektowaniu Java Virtual Machine (JVM) preferowany jest jasny i prosty model. Dodawanie skomplikowanych element\u00f3w, takich jak Q-types i v-bytecode, komplikuje ca\u0142y system, sprawiaj\u0105c \u017ce jest trudniejszy w utrzymaniu. Nowa iteracja Valhalli upraszcza design i redukuje przysz\u0142y d\u0142ug techniczny dzi\u0119ki unikni\u0119cia niepotrzebnej duplikacji afektuj\u0105cych ca\u0142y system.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">3. Project Hermes - nowy protok\u00f3\u0142 przesy\u0142u danych sieciowych<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">3. Project Hermes - nowy protok\u00f3\u0142 przesy\u0142u danych sieciowych<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A na koniec co\u015b wychodz\u0105cego poza JDK, ale pozostaj\u0105c w \u015bwiecie niskopoziomowych komponent\u00f3w.<\/p>\n","innerContent":["\n<p>A na koniec co\u015b wychodz\u0105cego poza JDK, ale pozostaj\u0105c w \u015bwiecie niskopoziomowych komponent\u00f3w.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Termin Big Data przez lata przesz\u0142y znacz\u0105c\u0105 ewolucj\u0119 od czasu swojego pocz\u0105tku opartego na modelu programowania MapReduce dwa dekady temu. Dzisiaj wielu <a href=\"https:\/\/motherduck.com\/blog\/big-data-is-dead\/\">wr\u00f3\u017cy mu \u015bmier\u0107<\/a>, ale wydaje mi si\u0119, \u017ce raczej specjali\u015bci w tym zakresie nie maj\u0105 si\u0119 czego obawia\u0107 w najbli\u017cszym czasie, mimo tego, \u017ce \u015bwiat regularnie znajduje sobie nowe obiekty po\u017c\u0105dania.<\/p>\n","innerContent":["\n<p>Termin Big Data przez lata przesz\u0142y znacz\u0105c\u0105 ewolucj\u0119 od czasu swojego pocz\u0105tku opartego na modelu programowania MapReduce dwa dekady temu. Dzisiaj wielu <a href=\"https:\/\/motherduck.com\/blog\/big-data-is-dead\/\">wr\u00f3\u017cy mu \u015bmier\u0107<\/a>, ale wydaje mi si\u0119, \u017ce raczej specjali\u015bci w tym zakresie nie maj\u0105 si\u0119 czego obawia\u0107 w najbli\u017cszym czasie, mimo tego, \u017ce \u015bwiat regularnie znajduje sobie nowe obiekty po\u017c\u0105dania.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16661,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-8.png\" alt=\"\" class=\"wp-image-16661\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-8.png\" alt=\"\" class=\"wp-image-16661\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dlaczego w og\u00f3le zreszt\u0105 o tym temacie wspominam? Poniewa\u017c wiele rozwi\u0105za\u0144 z dziedziny big data jest rozwijana w Java. Takie systemy s\u0105 zwykle projektowane do dzia\u0142ania na wielu serwerach w chmurach obliczeniowych, gdzie skalowanie poprzez dodawanie jednostek jest bardziej op\u0142acalne ni\u017c zakup drogich superkomputer\u00f3w - a do tego Java sprawdza si\u0119 bardzo dobrze. Tak zwane skalowanie horyzontalne ma jednak swoje problemy - operacje jak reduce, aggregate czy join zwykle wymagaj\u0105 intensywnego transferu danych przez sie\u0107, co cz\u0119sto czyni j\u0105 w\u0105skim gard\u0142em - fizyka i <a href=\"https:\/\/www.researchgate.net\/publication\/322500050_Fallacies_of_Distributed_Computing_Explained\">Fallacies of Distributed Computing<\/a>, mimo up\u0142ywu lat od ich publikacji, pozostaj\u0105 w mocy. I o ile dostawcy chmur oferuj\u0105 obecnie ultranowoczesne sieci InfiniBand, kt\u00f3re osi\u0105gaj\u0105 przepustowo\u015b\u0107 nawet do 200 Gbit\/s z minimalnym op\u00f3\u017anieniem. Jednak\u017ce model sieciowy Javy, oparte na gniazdach TCP\/UDP, wprowadzaj\u0105 dodatkowy narzut podczas korzystania ze wspomnianego InfiniBand. Co prawda biblioteki takie jak <a href=\"https:\/\/www.ibm.com\/docs\/en\/sdk-java-technology\/8?topic=only-jsor-native-interoperability-linux\">JSOR<\/a> czy <a href=\"https:\/\/www.ibm.com\/docs\/en\/sdk-java-technology\/8\">jVerbs<\/a> rozwi\u0105zuj\u0105 ten problem, daj\u0105c Javie bezpo\u015bredni dost\u0119p do InfiniBand, ale wymagaj\u0105 one modyfikacji aplikacji i s\u0105 oparte na Java Native Interface (JNI).<\/p>\n","innerContent":["\n<p>Dlaczego w og\u00f3le zreszt\u0105 o tym temacie wspominam? Poniewa\u017c wiele rozwi\u0105za\u0144 z dziedziny big data jest rozwijana w Java. Takie systemy s\u0105 zwykle projektowane do dzia\u0142ania na wielu serwerach w chmurach obliczeniowych, gdzie skalowanie poprzez dodawanie jednostek jest bardziej op\u0142acalne ni\u017c zakup drogich superkomputer\u00f3w - a do tego Java sprawdza si\u0119 bardzo dobrze. Tak zwane skalowanie horyzontalne ma jednak swoje problemy - operacje jak reduce, aggregate czy join zwykle wymagaj\u0105 intensywnego transferu danych przez sie\u0107, co cz\u0119sto czyni j\u0105 w\u0105skim gard\u0142em - fizyka i <a href=\"https:\/\/www.researchgate.net\/publication\/322500050_Fallacies_of_Distributed_Computing_Explained\">Fallacies of Distributed Computing<\/a>, mimo up\u0142ywu lat od ich publikacji, pozostaj\u0105 w mocy. I o ile dostawcy chmur oferuj\u0105 obecnie ultranowoczesne sieci InfiniBand, kt\u00f3re osi\u0105gaj\u0105 przepustowo\u015b\u0107 nawet do 200 Gbit\/s z minimalnym op\u00f3\u017anieniem. Jednak\u017ce model sieciowy Javy, oparte na gniazdach TCP\/UDP, wprowadzaj\u0105 dodatkowy narzut podczas korzystania ze wspomnianego InfiniBand. Co prawda biblioteki takie jak <a href=\"https:\/\/www.ibm.com\/docs\/en\/sdk-java-technology\/8?topic=only-jsor-native-interoperability-linux\">JSOR<\/a> czy <a href=\"https:\/\/www.ibm.com\/docs\/en\/sdk-java-technology\/8\">jVerbs<\/a> rozwi\u0105zuj\u0105 ten problem, daj\u0105c Javie bezpo\u015bredni dost\u0119p do InfiniBand, ale wymagaj\u0105 one modyfikacji aplikacji i s\u0105 oparte na Java Native Interface (JNI).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Tutaj do gry wchodzi <a href=\"https:\/\/blogs.oracle.com\/research\/post\/university-of-dsseldorf-develops-network-agnostic-ultrafast-communication-solution-for-java\">Projekt Hermes<\/a>, kt\u00f3ry ma na celu unowocze\u015bni\u0107 obs\u0142ug\u0119 sieci w Javie, oferuj\u0105c rozwi\u0105zanie komunikacyjne o ultrawysokiej pr\u0119dko\u015bci. Inicjatywa ta opiera si\u0119 o Projekt Panama i znane Wam pewnie <a href=\"https:\/\/openjdk.org\/jeps\/424\">Foreign Function &amp; Memory API<\/a>, kt\u00f3re w ko\u0144cu zast\u0105pi\u0107 ma podatne na b\u0142\u0119dy JNI. Hermes wprowadza dwie biblioteki open-source: <a href=\"https:\/\/github.com\/hhu-bsinfo\/infinileap\">Infinileap<\/a>, kt\u00f3ra daje Javie bezpo\u015bredni interfejs do <a href=\"https:\/\/github.com\/openucx\/ucx\">natywnej biblioteki UCX<\/a>, obs\u0142uguj\u0105cej r\u00f3\u017cne sieci, oraz <a href=\"https:\/\/github.com\/hhu-bsinfo\/hadroNIO\">hadroNIO<\/a>, kt\u00f3ra oferuje wsparcie Java NIO oparte na tej bibliotece. Po testach na infrastrukturze chmury Oracle (bo to w\u0142a\u015bnie ta firma jest jednym ze sponsor\u00f3w projektu, mimo \u017ce ten nie jest raczej oficjalnym projektem JDK), Hermes zademonstrowa\u0142 w pierwszych efektach znacz\u0105ce poprawy wydajno\u015bci dla aplikacji opartych o Netty'ego. W planach na przysz\u0142o\u015b\u0107 jest przeprowadzenie bardziej kompleksowych test\u00f3w skalowalno\u015bci oraz wprowadzenie niezale\u017cnego API dla Infinileap dla r\u00f3\u017cnych j\u0119zyk\u00f3w programowania, wykorzystuj\u0105cego wzorzec Sidecar.<\/p>\n","innerContent":["\n<p>Tutaj do gry wchodzi <a href=\"https:\/\/blogs.oracle.com\/research\/post\/university-of-dsseldorf-develops-network-agnostic-ultrafast-communication-solution-for-java\">Projekt Hermes<\/a>, kt\u00f3ry ma na celu unowocze\u015bni\u0107 obs\u0142ug\u0119 sieci w Javie, oferuj\u0105c rozwi\u0105zanie komunikacyjne o ultrawysokiej pr\u0119dko\u015bci. Inicjatywa ta opiera si\u0119 o Projekt Panama i znane Wam pewnie <a href=\"https:\/\/openjdk.org\/jeps\/424\">Foreign Function &amp; Memory API<\/a>, kt\u00f3re w ko\u0144cu zast\u0105pi\u0107 ma podatne na b\u0142\u0119dy JNI. Hermes wprowadza dwie biblioteki open-source: <a href=\"https:\/\/github.com\/hhu-bsinfo\/infinileap\">Infinileap<\/a>, kt\u00f3ra daje Javie bezpo\u015bredni interfejs do <a href=\"https:\/\/github.com\/openucx\/ucx\">natywnej biblioteki UCX<\/a>, obs\u0142uguj\u0105cej r\u00f3\u017cne sieci, oraz <a href=\"https:\/\/github.com\/hhu-bsinfo\/hadroNIO\">hadroNIO<\/a>, kt\u00f3ra oferuje wsparcie Java NIO oparte na tej bibliotece. Po testach na infrastrukturze chmury Oracle (bo to w\u0142a\u015bnie ta firma jest jednym ze sponsor\u00f3w projektu, mimo \u017ce ten nie jest raczej oficjalnym projektem JDK), Hermes zademonstrowa\u0142 w pierwszych efektach znacz\u0105ce poprawy wydajno\u015bci dla aplikacji opartych o Netty'ego. W planach na przysz\u0142o\u015b\u0107 jest przeprowadzenie bardziej kompleksowych test\u00f3w skalowalno\u015bci oraz wprowadzenie niezale\u017cnego API dla Infinileap dla r\u00f3\u017cnych j\u0119zyk\u00f3w programowania, wykorzystuj\u0105cego wzorzec Sidecar.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jest to kolejna rzecz, kt\u00f3ra co prawda nie jest widoczna na pierwszy rzut oka, ale u\u0142atwi wykorzystanie Javy w najbardziej wymagaj\u0105cych workloadach. Jest to taki typowy puzzel, ale wa\u017cny dla ca\u0142ej uk\u0142adanki. Jak to w projektach akademickich, ukaza\u0142 si\u0119 whitepaper <a href=\"https:\/\/arxiv.org\/pdf\/2209.14048.pdf\">Accelerating netty-based applications through transparent InfiniBand support<\/a>, w kt\u00f3rym znajdziecie wi\u0119cej szczeg\u00f3\u0142\u00f3w.<\/p>\n","innerContent":["\n<p>Jest to kolejna rzecz, kt\u00f3ra co prawda nie jest widoczna na pierwszy rzut oka, ale u\u0142atwi wykorzystanie Javy w najbardziej wymagaj\u0105cych workloadach. Jest to taki typowy puzzel, ale wa\u017cny dla ca\u0142ej uk\u0142adanki. Jak to w projektach akademickich, ukaza\u0142 si\u0119 whitepaper <a href=\"https:\/\/arxiv.org\/pdf\/2209.14048.pdf\">Accelerating netty-based applications through transparent InfiniBand support<\/a>, w kt\u00f3rym znajdziecie wi\u0119cej szczeg\u00f3\u0142\u00f3w.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","width":480,"height":452},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/xXkEy5F.jpg\" alt=\"\" width=\"480\" height=\"452\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/xXkEy5F.jpg\" alt=\"\" width=\"480\" height=\"452\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>I dalej propsuje nazywanie projekt\u00f3w w oparciu o motywy mitologiczne, zw\u0142aszcza kiedy dzieje si\u0119 to w tak sprytny spos\u00f3b.<\/p>\n","innerContent":["\n<p>I dalej propsuje nazywanie projekt\u00f3w w oparciu o motywy mitologiczne, zw\u0142aszcza kiedy dzieje si\u0119 to w tak sprytny spos\u00f3b.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/separator","attrs":[],"innerBlocks":[],"innerHTML":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","innerContent":["\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Na zako\u0144czenie pragn\u0119 podzieli\u0107 si\u0119 z Wami pewn\u0105 rekomendacj\u0105, kt\u00f3ra jest dla mnie szczeg\u00f3lnie osobista. Jeden z pierwszych artyku\u0142\u00f3w, kt\u00f3re mia\u0142em okazj\u0119 opublikowa\u0107, nosi\u0142 tytu\u0142 <a href=\"https:\/\/up.smartrecruiters.com\/we-tried-groovy-ee-and-what-we-learned-from-it-5b78c8f963de\">We tried Groovy EE \u2014 and what we have learned from it<\/a>. W nim podzieli\u0142em si\u0119 do\u015bwiadczeniami zwi\u0105zanymi z u\u017cyciem Groovy w kontek\u015bcie aplikacji Java EE. Pami\u0119tam, \u017ce pozna\u0142em ten j\u0119zyk dzi\u0119ki ksi\u0105\u017cce <a href=\"https:\/\/www.manning.com\/books\/making-java-groovy\">Making Java Groovy<\/a> autorstwa Kena Kousena. Z tego powodu z ogromn\u0105 przyjemno\u015bci\u0105 polecam Wam jego Newsletter, kt\u00f3ry jest dost\u0119pny na Substacku pod nazw\u0105 <a href=\"https:\/\/kenkousen.substack.com\/\">Tales from the jar side<\/a>.<\/p>\n","innerContent":["\n<p>Na zako\u0144czenie pragn\u0119 podzieli\u0107 si\u0119 z Wami pewn\u0105 rekomendacj\u0105, kt\u00f3ra jest dla mnie szczeg\u00f3lnie osobista. Jeden z pierwszych artyku\u0142\u00f3w, kt\u00f3re mia\u0142em okazj\u0119 opublikowa\u0107, nosi\u0142 tytu\u0142 <a href=\"https:\/\/up.smartrecruiters.com\/we-tried-groovy-ee-and-what-we-learned-from-it-5b78c8f963de\">We tried Groovy EE \u2014 and what we have learned from it<\/a>. W nim podzieli\u0142em si\u0119 do\u015bwiadczeniami zwi\u0105zanymi z u\u017cyciem Groovy w kontek\u015bcie aplikacji Java EE. Pami\u0119tam, \u017ce pozna\u0142em ten j\u0119zyk dzi\u0119ki ksi\u0105\u017cce <a href=\"https:\/\/www.manning.com\/books\/making-java-groovy\">Making Java Groovy<\/a> autorstwa Kena Kousena. Z tego powodu z ogromn\u0105 przyjemno\u015bci\u0105 polecam Wam jego Newsletter, kt\u00f3ry jest dost\u0119pny na Substacku pod nazw\u0105 <a href=\"https:\/\/kenkousen.substack.com\/\">Tales from the jar side<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16655,"width":512,"height":343,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-6-1024x686.png\" alt=\"\" class=\"wp-image-16655\" width=\"512\" height=\"343\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-6-1024x686.png\" alt=\"\" class=\"wp-image-16655\" width=\"512\" height=\"343\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Stanowi on znakomite \u017ar\u00f3d\u0142o wiedzy nie tylko na temat Javy (kt\u00f3ra jest prezentowana w nieco bardziej og\u00f3lnym kontek\u015bcie, ni\u017c tylko techniczne aspekty JVM i JEP), ale r\u00f3wnie\u017c g\u0142\u0119bokich analiz oraz innych tre\u015bci, kt\u00f3re Ken poleca. Warto doda\u0107, \u017ce ka\u017cda edycja newslettera ma r\u00f3wnie\u017c <a href=\"https:\/\/www.youtube.com\/@talesfromthejarside\">swoj\u0105 wersj\u0119 wideo<\/a> oraz zabawnych znalezisk z sieci - je\u015bli lubicie humor tego newslettera, jestem pewien, \u017ce materia\u0142y Kena te\u017c si\u0119 Wam spodobaj\u0105.<\/p>\n","innerContent":["\n<p>Stanowi on znakomite \u017ar\u00f3d\u0142o wiedzy nie tylko na temat Javy (kt\u00f3ra jest prezentowana w nieco bardziej og\u00f3lnym kontek\u015bcie, ni\u017c tylko techniczne aspekty JVM i JEP), ale r\u00f3wnie\u017c g\u0142\u0119bokich analiz oraz innych tre\u015bci, kt\u00f3re Ken poleca. Warto doda\u0107, \u017ce ka\u017cda edycja newslettera ma r\u00f3wnie\u017c <a href=\"https:\/\/www.youtube.com\/@talesfromthejarside\">swoj\u0105 wersj\u0119 wideo<\/a> oraz zabawnych znalezisk z sieci - je\u015bli lubicie humor tego newslettera, jestem pewien, \u017ce materia\u0142y Kena te\u017c si\u0119 Wam spodobaj\u0105.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dlatego te\u017c&nbsp;serdecznie zach\u0119cam do zapoznania si\u0119 z <a href=\"https:\/\/kenkousen.substack.com\/\">Tales from the jar side<\/a> \ud83d\ude00<\/p>\n","innerContent":["\n<p>Dlatego te\u017c&nbsp;serdecznie zach\u0119cam do zapoznania si\u0119 z <a href=\"https:\/\/kenkousen.substack.com\/\">Tales from the jar side<\/a> \ud83d\ude00<\/p>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/16646","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/comments?post=16646"}],"version-history":[{"count":8,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/16646\/revisions"}],"predecessor-version":[{"id":16672,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/16646\/revisions\/16672"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/16669"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=16646"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=16646"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=16646"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}