{"id":15959,"date":"2023-05-18T13:55:18","date_gmt":"2023-05-18T11:55:18","guid":{"rendered":"https:\/\/vived.io\/?p=15959"},"modified":"2023-05-18T20:30:14","modified_gmt":"2023-05-18T18:30:14","slug":"loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/","title":{"rendered":"JEP 450: Dziecko Projektu Liliput &#8211; JVM Weekly vol. 136"},"content":{"rendered":"\n<h2 id=\"1-stan-bibliotek-do-serializacji-obiektow-w-javie-w-q2-2023-r\" data-num=1>1. Stan bibliotek do serializacji obiekt\u00f3w w Javie w Q2 2023 r<\/h2>\n\n\n\n<p>Cz\u0119sto powtarza si\u0119, \u017ce benchmarki s\u0105 jednymi z najbardziej zwodniczych publikacji. Niejednokrotnie maj\u0105 bowiem za sob\u0105 pewn\u0105 agend\u0119 (kto na studiach nie naci\u0105ga\u0142 wynik\u00f3w laborek?), a ze wzgl\u0119du na ilo\u015b\u0107 element\u00f3w ruchomych, kt\u00f3re trzeba wzi\u0105\u0107 pod uwag\u0119 przy tworzeniu takowego, nawet robi\u0105c test w dobrej wierze mo\u017cna zak\u0142ama\u0107 rzeczywisto\u015b\u0107. Dlatego te\u017c zwykle nie skupiam si\u0119 tutaj na benchmarkach&#8230;<\/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\/05\/image-11.png\" alt=\"\" class=\"wp-image-16000\" width=\"489\" height=\"432\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/image-11.png 978w, https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/image-11-300x265.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/image-11-768x678.png 768w\" sizes=\"auto, (max-width: 489px) 100vw, 489px\" \/><figcaption class=\"wp-element-caption\">&#8230;gdy\u017c zdarzy\u0142o mi si\u0119 historycznie na tym ju\u017c sparzy\u0107.<\/figcaption><\/figure><\/div>\n\n\n<p>Dzisiaj jednak z\u0142ami\u0119 t\u0105 zasad\u0119, bo w ostatnich tygodniach odnalaz\u0142em m\u00f3j nowy standard z\u0142ota je\u015bli chodzi o to, jak wynikami test\u00f3w wydajno\u015bciowych powinno si\u0119 dzieli\u0107 ze spo\u0142eczno\u015bci\u0105.<\/p>\n\n\n\n<p>Nicholas Vaidyanathan, in\u017cynier pracuj\u0105cy w AWS, przygotowa\u0142 bowiem gruntowne por\u00f3wnanie <a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/results.html\">dost\u0119pnych bibliotek do serializacji<\/a>. Ju\u017c samo w sobie to by\u0142oby interesuj\u0105cym materia\u0142em, ale to, co szczeg\u00f3lnie przykuwa uwag\u0119 to fakt, jak du\u017co nacisku po\u0142o\u017cy\u0142 on na zdefiniowanie i umotywowanie poszczeg\u00f3lnych przypadk\u00f3w testowych. Po\u015bwi\u0119cony zosta\u0142 im bowiem ca\u0142y osobny tekst, gdzie z akademick\u0105 wr\u0119cz precyzj\u0105 <a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/benchmark.html\">definiuje poszczeg\u00f3lne przypadki testowe<\/a> i poszczeg\u00f3lne parametry, kt\u00f3re s\u0105 z jego perspektywy interesuj\u0105ce. Nad wynikami nie b\u0119d\u0119 si\u0119 tutaj rozwodzi\u0142, bo nie ma oczywistych zwyci\u0119zc\u00f3w (jak to zwykle w \u017cyciu bywa), wi\u0119c zainteresowanych odsy\u0142am do wynik\u00f3w <a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/results.html\">wynik\u00f3w<\/a><\/p>\n\n\n\n<p>A, i apropo ukrytych agend &#8211; \u017ceby nie by\u0142o, \u017ce te benchmarki powsta\u0142y tak zupe\u0142nie bezinteresownie. Ca\u0142y resorach kt\u00f3rego dokona\u0142 autor (a przygotowa\u0142 te\u017c on <a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/examine.html\">przegl\u0105d rozwi\u0105za\u0144 u\u017cywanych przez poszczeg\u00f3lne testowane przez niego biblioteki<\/a>) wydarzy\u0142 si\u0119, bowiem postanowi\u0142 zaprezentowa\u0107 swoj\u0105 w\u0142asn\u0105 bibliotek\u0119, <a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/loial.html\">Loial<\/a>, kt\u00f3r\u0105 opar\u0142 o swoich do\u015bwiadczeniach, kt\u00f3re nabra\u0142 pracuj\u0105c w Amazonie (r\u00f3wnie\u017c <a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/motivation.html\">gruntownie przez niego opisanych<\/a>). Loial zosta\u0142 poddany podobnie gruntownym testom, i wyniki s\u0105 wi\u0119cej ni\u017c zaskakuj\u0105ce &#8211; uda\u0142o mu si\u0119 bowiem swoim rozwi\u0105zaniem osi\u0105gn\u0105\u0107 zaskakuj\u0105co dobre wyniki w zasadzie wszystkich wskazanych metrykach. Ta jednak jest rozwi\u0105zaniem do\u015b\u0107 dziwnym &#8211; de fakto wymaga masy manualnej pracy, przez co nie dziwi\u0105 jej niezwykle dobre wyniki, dlatego ci\u0119\u017cko j\u0105 por\u00f3wna\u0107 do reszty rozwi\u0105za\u0144. Ciekaw\u0105 <a href=\"https:\/\/www.reddit.com\/r\/java\/comments\/12eltbg\/the_state_of_java_object_serialization_libraries\/\">dyskusje znajdziecie tutaj<\/a>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"354\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/image-10.png\" alt=\"\" class=\"wp-image-15986\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/image-10.png 602w, https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/image-10-300x176.png 300w\" sizes=\"auto, (max-width: 602px) 100vw, 602px\" \/><figcaption class=\"wp-element-caption\">I to jest jedyne miejsce, gdzie za\u0142\u0105czy\u0142 si\u0119 m\u00f3j paj\u0119czy zmys\u0142.<\/figcaption><\/figure><\/div>\n\n\n<p>Mo\u017cna wi\u0119c oczywi\u015bcie dyskutowa\u0107 nad zaprezentowanymi przez Nico wynikami, pr\u00f3bowa\u0107 je powt\u00f3rzy\u0107 i cho\u0107by zaproponowa\u0107 inne przypadki testowe. Dzi\u0119ki jednak temu, jak przekrojowo podszed\u0142 on do opisania swojej metody, mamy przynajmniej tak\u0105 mo\u017cliwo\u015b\u0107. Ca\u0142o\u015bciowo, powy\u017cszy zestaw publikacji to dalej w moich oczach wz\u00f3r, je\u017celi chcemy m\u00f3c zapewni\u0107 reprodukowalno\u015b\u0107 wynik\u00f3w i rozpocz\u0105\u0107 jak\u0105\u015b data-driven dyskusj\u0119. A \u017ce benchmarki nie pokryj\u0105 nam wszystkich mo\u017cliwych przypadk\u00f3w, to ju\u017c raczej truizm.<\/p>\n\n\n\n<p>Rzu\u0107cie sobie okiem na \u017ar\u00f3d\u0142a &#8211; w komplecie poni\u017csze teksty stanowi\u0105 chyba najlepszy przegl\u0105d tego, jak w po\u0142owie 2023 prezentuje si\u0119 \u015bwiat bibliotek do serializacji.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/benchmark.html\">Best Practice Performance Comparison for Java Serialization libraries<\/a><\/li>\n\n\n\n<li><a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/results.html\">Results of JMH Performance Comparison for Java Serialization libraries<\/a><\/li>\n\n\n\n<li><a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/examine.html\">Mapping the Serialization Territory<\/a><\/li>\n\n\n\n<li><a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/motivation.html\">Motivating a new Serialization API<\/a><\/li>\n\n\n\n<li><a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/loial.html\">Loial: fastest, leanest, highest quality Java object serialization<\/a><\/li>\n<\/ul>\n\n\n\n<h2 id=\"2-jep-450-dziecko-projektu-liliput\" data-num=2>2. JEP 450: Dziecko Projektu Liliput<\/h2>\n\n\n\n<p>No, i wracamy do tematu JEP-\u00f3w. O ile jednak nie chce mi si\u0119 ponownie opowiada\u0107 o kolejnych kandydatach trafiaj\u0105cych do JDK 21 &#8211; podsumujemy sobie to zbiorczo przy okazji &#8222;zamro\u017cenia&#8221; wydania &#8211; to jednak pojawi\u0142 si\u0119 jeden naprawd\u0119 ciekawy. Mowa tutaj bowiem o <a href=\"https:\/\/openjdk.org\/jeps\/450\">JEP 450: Compact Object Headers (Experimental)<\/a>, dziecku projektu Liliput.<\/p>\n\n\n\n<p>Dla przypomnienia: celem Liliputa jest zmniejszenie rozmiaru nag\u0142\u00f3wk\u00f3w obiekt\u00f3w Java w maszynie JVM Hotspot ze 128 bit\u00f3w do 64 bit\u00f3w lub mniej. W tej chwili bowiem ka\u017cdy obiekt, niezale\u017cnie czy ma\u0142y, czy du\u017cy, posiada sta\u0142y narzut w teorii 128-bit\u00f3w, a w praktyce (przy w\u0142\u0105czonej kompresji nag\u0142\u00f3wk\u00f3w) 96-bit\u00f3w. 128-bit\u00f3w nie wydaje si\u0119 du\u017cym narzutem pami\u0119ci, nale\u017cy jednak pami\u0119ta\u0107, \u017ce m\u00f3wimy tutaj o nag\u0142\u00f3wku, kt\u00f3ry dok\u0142adany jest do ka\u017cdego jednego obiektu. W wielu zastosowaniach np. gdy tworzone jest wiele malutkich obiekt\u00f3w (tw\u00f3rcy powo\u0142uj\u0105 si\u0119 np. na machin\u0119 learning), ten narzut staje si\u0119 bardzo istotny, st\u0105d prace nad Liliputem.<\/p>\n\n\n\n<p>Przygl\u0105dnijmy si\u0119 zatem, co przynosi JEP 450. Og\u00f3lnie rzecz bior\u0105c, zmniejszenie rozmiaru nag\u0142\u00f3wka zosta\u0142o osi\u0105gni\u0119te dzi\u0119ki starannemu przeprojektowaniu struktury nag\u0142\u00f3wka obiektu i niezb\u0119dnym ulepszeniom w podstawowych funkcjach JVM w celu obs\u0142ugi kompaktowego formatu nag\u0142\u00f3wka. W obecnym modelu nag\u0142\u00f3wek obiektu sk\u0142ada si\u0119 z dw\u00f3ch cz\u0119\u015bci: s\u0142owa znacznika (mark word) i s\u0142owa klasy. S\u0142owo znacznika zawiera informacje takie jak informacje o przej\u015bciu Garbage Collectora czy hashcode. S\u0142owo klasy nast\u0119puje po s\u0142owie znacznika i zawiera informacje o wska\u017aniku klasy. Nowy kompaktowy format nag\u0142\u00f3wka \u0142\u0105czy s\u0142owa znacznika i klasy poprzez zmniejszenie rozmiaru hashcode i przeniesienie wska\u017anika klasy do s\u0142owa znacznika, zasadniczo zmniejszaj\u0105c narzut nag\u0142\u00f3wka.<\/p>\n\n\n\n<p>Jednak to, co chyba najciekawsze, to bardzo poka\u017ana sekcja ryzyk, szeroka jak nigdy. Nie ma si\u0119 jednak co dziwi\u0107 &#8211; grzebiemy tutaj w &#8222;bebechach&#8221; samego JVM, ni\u017cej zej\u015b\u0107 ju\u017c trudno. Na wspomnianej li\u015bcie znajdziemy cho\u0107by<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ograniczenie przestrzeni dla dalszego rozwoju j\u0119zyka<\/li>\n\n\n\n<li>potencjalne b\u0142\u0119dami w funkcji i starszym kodzie<\/li>\n\n\n\n<li>mo\u017cliwe wprowadzenie problem\u00f3w z wydajno\u015bci\u0105 z powodu wymaganych refaktoryzacji<\/li>\n\n\n\n<li>brakiem wsparcia i ograniczeniami kodowania dla skompresowanych wska\u017anik\u00f3w klas<\/li>\n<\/ul>\n\n\n\n<p>a jest tego sporo wi\u0119cej.<\/p>\n\n\n\n<p>Jednocze\u015bnie tw\u00f3rcy si\u0119 nie poddaj\u0105, bo potencjalna nagroda jest poka\u017ana &#8211; wed\u0142ug pierwszych test\u00f3w, m\u00f3wimy tu nawet o 20% procent redukcji zaj\u0119cia pami\u0119ci, a to ju\u017c gra warta \u015bwieczki.<\/p>\n\n\n\n<p>Je\u015bli powy\u017csze zmiany Was zaciekawi\u0142y, jak zwykle po wi\u0119cej szczeg\u00f3\u0142\u00f3w odsy\u0142am do oryginalnego JEP-a, ale r\u00f3wnie\u017c filmiku Java Newscast, kt\u00f3ry prezentuje w detalach poszczeg\u00f3lne zmiany:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"embed-responsive embed-responsive-16by9\"><iframe loading=\"lazy\" title=\"Save 10-20% Memory With Compact Headers - Inside Java Newscast #48\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/r2G4ed2E4QY?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/openjdk.org\/jeps\/450\">JEP 450: Compact Object Headers (Experimental)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=r2G4ed2E4QY\">Save 10-20% Memory With Compact Headers &#8211; Inside Java Newscast #48<\/a><\/li>\n<\/ul>\n\n\n\n<h2 id=\"3-release-radar\" data-num=3>3. Release Radar<\/h2>\n\n\n\n<p>Dawno nie by\u0142o release radaru i nazbiera\u0142o si\u0119 nam nowinek. I bardzo dobrze &#8211; ka\u017cda z prezentowanych dzisiaj nowo\u015bci jest bowiem w najgorszym przypadku interesuj\u0105c\u0105 ciekawostk\u0105, a potencjalnie mo\u017ce by\u0107 bardzo u\u017cyteczna.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/www.azul.com\/products\/components\/crac\/\">Azul Zulu JDK 17 ze wsparciem CRaC<\/a><\/h3>\n\n\n\n<p>Pierwszy release pozostawi nas w \u015bwiecie JDK. Azul og\u0142osi\u0142 bowiem wydanie <a href=\"https:\/\/www.azul.com\/products\/components\/crac\/\">swojej OpenJDK 17 &#8211; Zulu &#8211; zawieraj\u0105c\u0105 wbudowan\u0105 obs\u0142ug\u0119 CRaC API<\/a>.<\/p>\n\n\n\n<p>Dobra, du\u017co ale czym ten CRaC jest? CRaC API pomaga koordynowa\u0107 JDK i zasoby aplikacji z mechanizmum checkpoint\/restore <a href=\"https:\/\/criu.org\/Main_Page\">Checkpoint\/Restore in Userspace (CRIU)<\/a>. Pozwala on na utworzenie \u201echeckpointu\u201d \u2013 czyli wspomnianego zrzutu pami\u0119ci \u2013 w dowolnym momencie pracy aplikacji zdefiniowanym przez tw\u00f3rc\u0119 oprogramowania. Dzi\u0119ki niemu aplikacje Javowe mog\u0105 unikn\u0105\u0107 d\u0142ugiego uruchamiania i procesu \u201crozgrzewania\u201d, zapisuj\u0105c pe\u0142ny stan \u015brodowiska uruchomieniowego.<\/p>\n\n\n\n<p>Mam w\u015br\u00f3d czytelnik\u00f3w jakich\u015b retro-graczy? Je\u015bli tak, to ca\u0142o\u015b\u0107 dzia\u0142a w podobny spos\u00f3b jak funkcjonalno\u015b\u0107 Save State w emulatorach.  Klasyczne zapisywanie (jak w nowoczesnych grach) wygl\u0105da tak:  wybieramy te fragmenty, kt\u00f3re pozwol\u0105 nam p\u00f3\u017aniej odtworzy\u0107 stan aplikacji, i tylko je zapisujemy. Save State nie bawi si\u0119 w takie finezje \u2013 jako, \u017ce komputery posz\u0142y do przodu i mamy wi\u0119cej przestrzeni dyskowej, to po prostu zrzucamy ca\u0142y stan pami\u0119ci na dysk i potem sobie odtwarzamy 1:1 gdy jest to potrzebne.<\/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\/2022\/12\/image-5-1536x732.png\" alt=\"\" width=\"542\" height=\"259\"\/><\/figure><\/div>\n\n\n<p>Oczywi\u015bcie CRaC posiada pewnie ograniczenia (w ko\u0144cu samo \u015brodowisko uruchomieniowe mo\u017ce si\u0119 zmieni\u0107, dodatkowo utrudniona jest randomizacja). Ca\u0142o\u015b\u0107 ju\u017c dzisiaj nap\u0119dza jednak cho\u0107by Amazon Lambda SnapStart, a poszczeg\u00f3lne frameworki chwal\u0105 si\u0119 swoimi eksperymentami z narz\u0119dziem, kt\u00f3rego u\u017cycie daje pono\u0107 naprawd\u0119 dobre wyniki:<\/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\/05\/CleanShot-2023-05-15-at-08.03.52.gif\" alt=\"\" width=\"400\" height=\"227\"\/><figcaption class=\"wp-element-caption\">To tyle je\u015bli chodzi o konsekwencje w &#8222;nie pokazywaniu benchmark\u00f3w bez kontekstu&#8221;, kt\u00f3r\u0105 szczyci\u0142em si\u0119 w pierwszym paragrafie.<\/figcaption><\/figure><\/div>\n\n\n<p>Od samego pocz\u0105tku za projektem sta\u0142 <a href=\"https:\/\/www.linkedin.com\/in\/anton-kozlov-50a81173\/\">Anton Kozlov<\/a> z Azul, tak\u017ce pojawienie si\u0119 wydania nie powinno nikogo zaskakiwa\u0107. Na m\u00f3j stan wiedzy Azul jest jednak pierwszym dostawcom, kt\u00f3ry zapewnia komercyjne wsparcie dla tej technologii.<\/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\/05\/o1wnQea_d-1-1024x768.webp\" alt=\"\" class=\"wp-image-15961\" width=\"512\" height=\"384\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/o1wnQea_d-1-1024x768.webp 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/o1wnQea_d-1-300x225.webp 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/o1wnQea_d-1-768x576.webp 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/o1wnQea_d-1.webp 1280w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><figcaption class=\"wp-element-caption\">A CRaC-iem warto si\u0119 interesowa\u0107. Wprawdzie Spring I\/O 2023 zajmiemy si\u0119 dopiero za tydzie\u0144, ale powy\u017cej macie spoiler wprost z Keynote konferencji.<\/figcaption><\/figure><\/div>\n\n\n<h2 id=\"microstream-8-0\" data-num=4><a href=\"https:\/\/microstream.one\/blog\/article\/microstream-8-0-is-now-available\/\">MicroStream 8.0<\/a><\/h2>\n\n\n\n<p>MicroStream to system in-memory persystencji dla graf\u00f3w obiekt\u00f3w, pozwalaj\u0105cy na ich wydajne przechowywanie, \u0142adowanie, querowanie. Zosta\u0142 zaprojektowany tak, aby zminimalizowa\u0107 potrzeb\u0119 mapowania obiektowo-relacyjnego (ORM), co daje tw\u00f3rcom spore zalety je\u015bli chodzi o wydajno\u015b\u0107 rozwi\u0105zania, a tak\u017ce upraszcza model danych. Dodatkowo, ca\u0142o\u015b\u0107 dostarczana jest w formie biblioteki, wi\u0119c \u0142atwo mo\u017cna do\u0142o\u017cy\u0107 j\u0105 do istniej\u0105cego projektu.<\/p>\n\n\n\n<p>MicroStream v8.0 wprowadza wsparcie dla Lazy Collections, takie jak <code>LazyArrayList<\/code>, <code>LazyHashSet<\/code> i <code>LazyHashMap<\/code>, mog\u0105 \u0142adowa\u0107 dane do pami\u0119ci w momencie gdy te s\u0105 potrzebne, przy tylko nieznacznym zwi\u0119kszeniu czasu dost\u0119pu. Dodatkowo, dane mog\u0105 by\u0107 \u0142atwo czyszczone Garbage Collector, gdy zu\u017cycie pami\u0119ci jest wysokie, co sprawia \u017ce s\u0105 bardzo dobr\u0105 opcj\u0105 do implementacji cache aplikacji. Ca\u0142o\u015b\u0107 przechowywana jest w segmentach, a u\u017cytkownik mo\u017ce kontrolowa\u0107 liczb\u0119 element\u00f3w w ka\u017cdym z nich, cho\u0107 tw\u00f3rcy zach\u0119caj\u0105 raczej do u\u017cywania ich domy\u015blnych rozwi\u0105za\u0144.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/github.com\/javamelody\/javamelody\/wiki\/ReleaseNotes#200\">JavaMelody 2.0<\/a><\/h3>\n\n\n\n<p>JavaMelody to narz\u0119dzie do monitorowania i profilowania wydajno\u015bci, przeznaczone g\u0142\u00f3wnie dla aplikacji Java i Java EE. Jest to raczej ma\u0142o znany projekt, ale \u0142\u0105cz\u0105 mnie z nim szczeg\u00f3lne wi\u0119zi. Pami\u0119tam, \u017ce w mojej pierwszej pracy z Java EE pierwszym zadaniem kt\u00f3re mia\u0142em by\u0142a w\u0142a\u015bnie jej integracja z projektem za pomoc\u0105 mechanizmu Rozszerze\u0144.<\/p>\n\n\n\n<p>Przyznam, \u017ce od tamtej pory nie s\u0142ysza\u0142em o niej za wiele, dlatego te\u017c sporym zaskoczeniem by\u0142 dla mnie fakt og\u0142oszenia <a href=\"https:\/\/github.com\/javamelody\/javamelody\/wiki\/ReleaseNotes#200\">wydania 2.0<\/a>. Jak \u0142atwo si\u0119 domy\u015ble\u0107, podbicie numeracji zwi\u0105zane jest z przej\u015bciem na Jakarte EE 10 i nowy pakiet <code>jakarta.*<\/code> (my\u015bl\u0119, \u017ce ju\u017c dobrze kojarzycie ten wzorzec, wielokrotnie ju\u017c to przerabiali\u015bmy). Z tego te\u017c zreszt\u0105 wzgl\u0119du JavaMelody 2.0 wspiera jedynie Spring Boot 3+ &#8211; je\u017celi kto\u015b chce pozosta\u0107 na wcze\u015bniejszej wersji Springa, musi pozosta\u0107 na JavaMelody z ga\u0142\u0119zi 1.9.x.<\/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\/05\/Jakarta-EE.jpg\" alt=\"\" class=\"wp-image-15975\" width=\"512\" height=\"362\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/Jakarta-EE.jpg 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/Jakarta-EE-300x212.jpg 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/Jakarta-EE-768x543.jpg 768w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><figcaption class=\"wp-element-caption\">Niesamowite, jak Jakarta EE w parze ze Springiem przyspieszy\u0142y nam ewolucje ca\u0142ego ekosystemu.<\/figcaption><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.coroutines\/releases\/tag\/1.7.0\">kotlinx.coroutines 1.7.0<\/a><\/h3>\n\n\n\n<p>Na sam koniec zostawi\u0142em sobie Kotlina. W ostatnim czasie pojawi\u0142a si\u0119 bowiem nowa wersja Korutyn. Nie wszyscy mog\u0105 sobie bowiem zdawa\u0107 spraw\u0119, \u017ce cho\u0107 kortyny s\u0105 cz\u0119\u015bci\u0105 Kotlina, to ich cykl wyda\u0144 pozostaje niezale\u017cny w stosunku do samego j\u0119zyka. Mimo, \u017ce od dawna cieszymy si\u0119 Kotlinem w wersji 1.8, to niedawno dostali\u015bmy w swoje r\u0119ce <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.coroutines\/releases\/tag\/1.7.0\">kotlinx.coroutines 1.7.0<\/a>. Co przynosi?<\/p>\n\n\n\n<p>Najciekawsz\u0105 zmian\u0105 jest nowa implementacja Channel API (kana\u0142\u00f3w). Nowa struktura danych ma na celu naprawienie problem\u00f3w z poprzedni\u0105 implementacj\u0105. Poprzednia implementacja mia\u0142a problemy z poprawno\u015bci\u0105, \u0142atwo\u015bci\u0105 utrzymania i wydajno\u015bci\u0105. Nowa implementacja wykorzystuje struktury danych oparte na tablicach oraz wydajniejszych algorytmy pobierania i dodawania element\u00f3w. Nowe kana\u0142y s\u0105 wynikowo znacznie szybsze zar\u00f3wno w u\u017cyciu sekwencyjnym, jak i w przypadkach zr\u00f3wnoleglonych. Zmiana ma charakter techniczny i nie wp\u0142ywa na u\u017cytkownik\u00f3w. Ca\u0142o\u015b\u0107 algorytmu jest na tyle nowatorska doczeka\u0142a si\u0119 publikacji akademickiej: <a href=\"https:\/\/arxiv.org\/pdf\/2211.04986.pdf\">Fast and Scalable Channels in Kotlin Coroutines<\/a>. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"732\" height=\"377\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/image-8.png\" alt=\"\" class=\"wp-image-15977\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/image-8.png 732w, https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/image-8-300x155.png 300w\" sizes=\"auto, (max-width: 732px) 100vw, 732px\" \/><figcaption class=\"wp-element-caption\">To je\u015bli chcieliby\u015bcie si\u0119 bardziej wgry\u017a\u0107 w detale Kotlina.<\/figcaption><\/figure><\/div>\n\n\n<p>Z innych ciekawy dodatk\u00f3w, doczekali\u015bmy si\u0119 tak\u017ce usprawnienia mechanizmu Mutex\u00f3w, poprawek w <code>kotlinx-coroutines-test<\/code> (zw\u0142aszcza w kontek\u015bcie lepszego wsparcia Timeout\u00f3w), a Kotlin\/Native doczeka\u0142 si\u0119 wsparcia dla <code>Dispatchers.IO<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>PS: Takie maile to ja lubi\u0119 dostawa\u0107 \u2764\ufe0f. Jest nas wielu!<\/strong><br><br><strong>Dzi\u0119kuj\u0119 Wam za zaufanie.<\/strong><\/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\/05\/image-5-1024x632.png\" alt=\"\" class=\"wp-image-15966\" width=\"512\" height=\"316\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/image-5-1024x632.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/image-5-300x185.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/image-5-768x474.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/image-5-1536x949.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/image-5.png 1574w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><\/figure><\/div>","protected":false},"excerpt":{"rendered":"<p>Dzisiaj mamy edycj\u0119 &#8222;na bogato&#8221; &#8211; przegl\u0105d bibliotek do serializacji (wraz z nowym graczem), efekt projektu Liliput, a tak\u017ce wypchany po brzegi release radar.<\/p>\n","protected":false},"author":10,"featured_media":16013,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[23],"tags":[],"class_list":["post-15959","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jvm"],"acf":{"estimated_reading_time":"9","feature_image_blog":false,"weekly_summary":true,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/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>JEP 450: Dziecko Projektu Liliput - JVM Weekly vol. 136 - 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\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JEP 450: Dziecko Projektu Liliput - JVM Weekly vol. 136 - Vived\" \/>\n<meta property=\"og:description\" content=\"Dzisiaj mamy edycj\u0119 &quot;na bogato&quot; - przegl\u0105d bibliotek do serializacji (wraz z nowym graczem), efekt projektu Liliput, a tak\u017ce wypchany po brzegi release radar.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2023-05-18T11:55:18+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-05-18T18:30:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/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\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"JEP 450: Dziecko Projektu Liliput &#8211; JVM Weekly vol. 136\",\"datePublished\":\"2023-05-18T11:55:18+00:00\",\"dateModified\":\"2023-05-18T18:30:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/\"},\"wordCount\":1962,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/JVM-Weekly-1200x628_V2-7.png\",\"articleSection\":[\"JVM\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/\",\"url\":\"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/\",\"name\":\"JEP 450: Dziecko Projektu Liliput - JVM Weekly vol. 136 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/JVM-Weekly-1200x628_V2-7.png\",\"datePublished\":\"2023-05-18T11:55:18+00:00\",\"dateModified\":\"2023-05-18T18:30:14+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/JVM-Weekly-1200x628_V2-7.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/JVM-Weekly-1200x628_V2-7.png\",\"width\":1200,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JEP 450: Dziecko Projektu Liliput &#8211; JVM Weekly vol. 136\"}]},{\"@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":"JEP 450: Dziecko Projektu Liliput - JVM Weekly vol. 136 - 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\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/","og_locale":"pl_PL","og_type":"article","og_title":"JEP 450: Dziecko Projektu Liliput - JVM Weekly vol. 136 - Vived","og_description":"Dzisiaj mamy edycj\u0119 \"na bogato\" - przegl\u0105d bibliotek do serializacji (wraz z nowym graczem), efekt projektu Liliput, a tak\u017ce wypchany po brzegi release radar.","og_url":"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/","og_site_name":"Vived","article_published_time":"2023-05-18T11:55:18+00:00","article_modified_time":"2023-05-18T18:30:14+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/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\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"JEP 450: Dziecko Projektu Liliput &#8211; JVM Weekly vol. 136","datePublished":"2023-05-18T11:55:18+00:00","dateModified":"2023-05-18T18:30:14+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/"},"wordCount":1962,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/JVM-Weekly-1200x628_V2-7.png","articleSection":["JVM"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/","url":"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/","name":"JEP 450: Dziecko Projektu Liliput - JVM Weekly vol. 136 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/JVM-Weekly-1200x628_V2-7.png","datePublished":"2023-05-18T11:55:18+00:00","dateModified":"2023-05-18T18:30:14+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/JVM-Weekly-1200x628_V2-7.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/JVM-Weekly-1200x628_V2-7.png","width":1200,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/loial-nowy-gracz-wsrod-bibliotek-do-serializacji-jvm-weekly-vol-136\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"JEP 450: Dziecko Projektu Liliput &#8211; JVM Weekly vol. 136"}]},{"@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. Stan bibliotek do serializacji obiekt\u00f3w w Javie w Q2 2023 r<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">1. Stan bibliotek do serializacji obiekt\u00f3w w Javie w Q2 2023 r<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Cz\u0119sto powtarza si\u0119, \u017ce benchmarki s\u0105 jednymi z najbardziej zwodniczych publikacji. Niejednokrotnie maj\u0105 bowiem za sob\u0105 pewn\u0105 agend\u0119 (kto na studiach nie naci\u0105ga\u0142 wynik\u00f3w laborek?), a ze wzgl\u0119du na ilo\u015b\u0107 element\u00f3w ruchomych, kt\u00f3re trzeba wzi\u0105\u0107 pod uwag\u0119 przy tworzeniu takowego, nawet robi\u0105c test w dobrej wierze mo\u017cna zak\u0142ama\u0107 rzeczywisto\u015b\u0107. Dlatego te\u017c zwykle nie skupiam si\u0119 tutaj na benchmarkach...<\/p>\n","innerContent":["\n<p>Cz\u0119sto powtarza si\u0119, \u017ce benchmarki s\u0105 jednymi z najbardziej zwodniczych publikacji. Niejednokrotnie maj\u0105 bowiem za sob\u0105 pewn\u0105 agend\u0119 (kto na studiach nie naci\u0105ga\u0142 wynik\u00f3w laborek?), a ze wzgl\u0119du na ilo\u015b\u0107 element\u00f3w ruchomych, kt\u00f3re trzeba wzi\u0105\u0107 pod uwag\u0119 przy tworzeniu takowego, nawet robi\u0105c test w dobrej wierze mo\u017cna zak\u0142ama\u0107 rzeczywisto\u015b\u0107. Dlatego te\u017c zwykle nie skupiam si\u0119 tutaj na benchmarkach...<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16000,"width":489,"height":432,"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\/05\/image-11.png\" alt=\"\" class=\"wp-image-16000\" width=\"489\" height=\"432\"\/><figcaption class=\"wp-element-caption\">...gdy\u017c zdarzy\u0142o mi si\u0119 historycznie na tym ju\u017c sparzy\u0107.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/image-11.png\" alt=\"\" class=\"wp-image-16000\" width=\"489\" height=\"432\"\/><figcaption class=\"wp-element-caption\">...gdy\u017c zdarzy\u0142o mi si\u0119 historycznie na tym ju\u017c sparzy\u0107.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dzisiaj jednak z\u0142ami\u0119 t\u0105 zasad\u0119, bo w ostatnich tygodniach odnalaz\u0142em m\u00f3j nowy standard z\u0142ota je\u015bli chodzi o to, jak wynikami test\u00f3w wydajno\u015bciowych powinno si\u0119 dzieli\u0107 ze spo\u0142eczno\u015bci\u0105.<\/p>\n","innerContent":["\n<p>Dzisiaj jednak z\u0142ami\u0119 t\u0105 zasad\u0119, bo w ostatnich tygodniach odnalaz\u0142em m\u00f3j nowy standard z\u0142ota je\u015bli chodzi o to, jak wynikami test\u00f3w wydajno\u015bciowych powinno si\u0119 dzieli\u0107 ze spo\u0142eczno\u015bci\u0105.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nicholas Vaidyanathan, in\u017cynier pracuj\u0105cy w AWS, przygotowa\u0142 bowiem gruntowne por\u00f3wnanie <a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/results.html\">dost\u0119pnych bibliotek do serializacji<\/a>. Ju\u017c samo w sobie to by\u0142oby interesuj\u0105cym materia\u0142em, ale to, co szczeg\u00f3lnie przykuwa uwag\u0119 to fakt, jak du\u017co nacisku po\u0142o\u017cy\u0142 on na zdefiniowanie i umotywowanie poszczeg\u00f3lnych przypadk\u00f3w testowych. Po\u015bwi\u0119cony zosta\u0142 im bowiem ca\u0142y osobny tekst, gdzie z akademick\u0105 wr\u0119cz precyzj\u0105 <a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/benchmark.html\">definiuje poszczeg\u00f3lne przypadki testowe<\/a> i poszczeg\u00f3lne parametry, kt\u00f3re s\u0105 z jego perspektywy interesuj\u0105ce. Nad wynikami nie b\u0119d\u0119 si\u0119 tutaj rozwodzi\u0142, bo nie ma oczywistych zwyci\u0119zc\u00f3w (jak to zwykle w \u017cyciu bywa), wi\u0119c zainteresowanych odsy\u0142am do wynik\u00f3w <a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/results.html\">wynik\u00f3w<\/a><\/p>\n","innerContent":["\n<p>Nicholas Vaidyanathan, in\u017cynier pracuj\u0105cy w AWS, przygotowa\u0142 bowiem gruntowne por\u00f3wnanie <a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/results.html\">dost\u0119pnych bibliotek do serializacji<\/a>. Ju\u017c samo w sobie to by\u0142oby interesuj\u0105cym materia\u0142em, ale to, co szczeg\u00f3lnie przykuwa uwag\u0119 to fakt, jak du\u017co nacisku po\u0142o\u017cy\u0142 on na zdefiniowanie i umotywowanie poszczeg\u00f3lnych przypadk\u00f3w testowych. Po\u015bwi\u0119cony zosta\u0142 im bowiem ca\u0142y osobny tekst, gdzie z akademick\u0105 wr\u0119cz precyzj\u0105 <a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/benchmark.html\">definiuje poszczeg\u00f3lne przypadki testowe<\/a> i poszczeg\u00f3lne parametry, kt\u00f3re s\u0105 z jego perspektywy interesuj\u0105ce. Nad wynikami nie b\u0119d\u0119 si\u0119 tutaj rozwodzi\u0142, bo nie ma oczywistych zwyci\u0119zc\u00f3w (jak to zwykle w \u017cyciu bywa), wi\u0119c zainteresowanych odsy\u0142am do wynik\u00f3w <a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/results.html\">wynik\u00f3w<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A, i apropo ukrytych agend - \u017ceby nie by\u0142o, \u017ce te benchmarki powsta\u0142y tak zupe\u0142nie bezinteresownie. Ca\u0142y resorach kt\u00f3rego dokona\u0142 autor (a przygotowa\u0142 te\u017c on <a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/examine.html\">przegl\u0105d rozwi\u0105za\u0144 u\u017cywanych przez poszczeg\u00f3lne testowane przez niego biblioteki<\/a>) wydarzy\u0142 si\u0119, bowiem postanowi\u0142 zaprezentowa\u0107 swoj\u0105 w\u0142asn\u0105 bibliotek\u0119, <a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/loial.html\">Loial<\/a>, kt\u00f3r\u0105 opar\u0142 o swoich do\u015bwiadczeniach, kt\u00f3re nabra\u0142 pracuj\u0105c w Amazonie (r\u00f3wnie\u017c <a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/motivation.html\">gruntownie przez niego opisanych<\/a>). Loial zosta\u0142 poddany podobnie gruntownym testom, i wyniki s\u0105 wi\u0119cej ni\u017c zaskakuj\u0105ce - uda\u0142o mu si\u0119 bowiem swoim rozwi\u0105zaniem osi\u0105gn\u0105\u0107 zaskakuj\u0105co dobre wyniki w zasadzie wszystkich wskazanych metrykach. Ta jednak jest rozwi\u0105zaniem do\u015b\u0107 dziwnym - de fakto wymaga masy manualnej pracy, przez co nie dziwi\u0105 jej niezwykle dobre wyniki, dlatego ci\u0119\u017cko j\u0105 por\u00f3wna\u0107 do reszty rozwi\u0105za\u0144. Ciekaw\u0105 <a href=\"https:\/\/www.reddit.com\/r\/java\/comments\/12eltbg\/the_state_of_java_object_serialization_libraries\/\">dyskusje znajdziecie tutaj<\/a>.<\/p>\n","innerContent":["\n<p>A, i apropo ukrytych agend - \u017ceby nie by\u0142o, \u017ce te benchmarki powsta\u0142y tak zupe\u0142nie bezinteresownie. Ca\u0142y resorach kt\u00f3rego dokona\u0142 autor (a przygotowa\u0142 te\u017c on <a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/examine.html\">przegl\u0105d rozwi\u0105za\u0144 u\u017cywanych przez poszczeg\u00f3lne testowane przez niego biblioteki<\/a>) wydarzy\u0142 si\u0119, bowiem postanowi\u0142 zaprezentowa\u0107 swoj\u0105 w\u0142asn\u0105 bibliotek\u0119, <a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/loial.html\">Loial<\/a>, kt\u00f3r\u0105 opar\u0142 o swoich do\u015bwiadczeniach, kt\u00f3re nabra\u0142 pracuj\u0105c w Amazonie (r\u00f3wnie\u017c <a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/motivation.html\">gruntownie przez niego opisanych<\/a>). Loial zosta\u0142 poddany podobnie gruntownym testom, i wyniki s\u0105 wi\u0119cej ni\u017c zaskakuj\u0105ce - uda\u0142o mu si\u0119 bowiem swoim rozwi\u0105zaniem osi\u0105gn\u0105\u0107 zaskakuj\u0105co dobre wyniki w zasadzie wszystkich wskazanych metrykach. Ta jednak jest rozwi\u0105zaniem do\u015b\u0107 dziwnym - de fakto wymaga masy manualnej pracy, przez co nie dziwi\u0105 jej niezwykle dobre wyniki, dlatego ci\u0119\u017cko j\u0105 por\u00f3wna\u0107 do reszty rozwi\u0105za\u0144. Ciekaw\u0105 <a href=\"https:\/\/www.reddit.com\/r\/java\/comments\/12eltbg\/the_state_of_java_object_serialization_libraries\/\">dyskusje znajdziecie tutaj<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":15986,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/image-10.png\" alt=\"\" class=\"wp-image-15986\"\/><figcaption class=\"wp-element-caption\">I to jest jedyne miejsce, gdzie za\u0142\u0105czy\u0142 si\u0119 m\u00f3j paj\u0119czy zmys\u0142.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/image-10.png\" alt=\"\" class=\"wp-image-15986\"\/><figcaption class=\"wp-element-caption\">I to jest jedyne miejsce, gdzie za\u0142\u0105czy\u0142 si\u0119 m\u00f3j paj\u0119czy zmys\u0142.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Mo\u017cna wi\u0119c oczywi\u015bcie dyskutowa\u0107 nad zaprezentowanymi przez Nico wynikami, pr\u00f3bowa\u0107 je powt\u00f3rzy\u0107 i cho\u0107by zaproponowa\u0107 inne przypadki testowe. Dzi\u0119ki jednak temu, jak przekrojowo podszed\u0142 on do opisania swojej metody, mamy przynajmniej tak\u0105 mo\u017cliwo\u015b\u0107. Ca\u0142o\u015bciowo, powy\u017cszy zestaw publikacji to dalej w moich oczach wz\u00f3r, je\u017celi chcemy m\u00f3c zapewni\u0107 reprodukowalno\u015b\u0107 wynik\u00f3w i rozpocz\u0105\u0107 jak\u0105\u015b data-driven dyskusj\u0119. A \u017ce benchmarki nie pokryj\u0105 nam wszystkich mo\u017cliwych przypadk\u00f3w, to ju\u017c raczej truizm.<\/p>\n","innerContent":["\n<p>Mo\u017cna wi\u0119c oczywi\u015bcie dyskutowa\u0107 nad zaprezentowanymi przez Nico wynikami, pr\u00f3bowa\u0107 je powt\u00f3rzy\u0107 i cho\u0107by zaproponowa\u0107 inne przypadki testowe. Dzi\u0119ki jednak temu, jak przekrojowo podszed\u0142 on do opisania swojej metody, mamy przynajmniej tak\u0105 mo\u017cliwo\u015b\u0107. Ca\u0142o\u015bciowo, powy\u017cszy zestaw publikacji to dalej w moich oczach wz\u00f3r, je\u017celi chcemy m\u00f3c zapewni\u0107 reprodukowalno\u015b\u0107 wynik\u00f3w i rozpocz\u0105\u0107 jak\u0105\u015b data-driven dyskusj\u0119. A \u017ce benchmarki nie pokryj\u0105 nam wszystkich mo\u017cliwych przypadk\u00f3w, to ju\u017c raczej truizm.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Rzu\u0107cie sobie okiem na \u017ar\u00f3d\u0142a - w komplecie poni\u017csze teksty stanowi\u0105 chyba najlepszy przegl\u0105d tego, jak w po\u0142owie 2023 prezentuje si\u0119 \u015bwiat bibliotek do serializacji.<\/p>\n","innerContent":["\n<p>Rzu\u0107cie sobie okiem na \u017ar\u00f3d\u0142a - w komplecie poni\u017csze teksty stanowi\u0105 chyba najlepszy przegl\u0105d tego, jak w po\u0142owie 2023 prezentuje si\u0119 \u015bwiat bibliotek do serializacji.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li><a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/benchmark.html\">Best Practice Performance Comparison for Java Serialization libraries<\/a><\/li>\n","innerContent":["\n<li><a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/benchmark.html\">Best Practice Performance Comparison for Java Serialization libraries<\/a><\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li><a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/results.html\">Results of JMH Performance Comparison for Java Serialization libraries<\/a><\/li>\n","innerContent":["\n<li><a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/results.html\">Results of JMH Performance Comparison for Java Serialization libraries<\/a><\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li><a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/examine.html\">Mapping the Serialization Territory<\/a><\/li>\n","innerContent":["\n<li><a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/examine.html\">Mapping the Serialization Territory<\/a><\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li><a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/motivation.html\">Motivating a new Serialization API<\/a><\/li>\n","innerContent":["\n<li><a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/motivation.html\">Motivating a new Serialization API<\/a><\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li><a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/loial.html\">Loial: fastest, leanest, highest quality Java object serialization<\/a><\/li>\n","innerContent":["\n<li><a href=\"http:\/\/visionarysoftware.solutions\/visions\/java\/serialization\/loial.html\">Loial: fastest, leanest, highest quality Java object serialization<\/a><\/li>\n"]}],"innerHTML":"\n<ul>\n\n\n\n\n\n\n\n<\/ul>\n","innerContent":["\n<ul>",null,"\n\n",null,"\n\n",null,"\n\n",null,"\n\n",null,"<\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">2. JEP 450: Dziecko Projektu Liliput<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">2. JEP 450: Dziecko Projektu Liliput<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>No, i wracamy do tematu JEP-\u00f3w. O ile jednak nie chce mi si\u0119 ponownie opowiada\u0107 o kolejnych kandydatach trafiaj\u0105cych do JDK 21 - podsumujemy sobie to zbiorczo przy okazji \"zamro\u017cenia\" wydania - to jednak pojawi\u0142 si\u0119 jeden naprawd\u0119 ciekawy. Mowa tutaj bowiem o <a href=\"https:\/\/openjdk.org\/jeps\/450\">JEP 450: Compact Object Headers (Experimental)<\/a>, dziecku projektu Liliput.<\/p>\n","innerContent":["\n<p>No, i wracamy do tematu JEP-\u00f3w. O ile jednak nie chce mi si\u0119 ponownie opowiada\u0107 o kolejnych kandydatach trafiaj\u0105cych do JDK 21 - podsumujemy sobie to zbiorczo przy okazji \"zamro\u017cenia\" wydania - to jednak pojawi\u0142 si\u0119 jeden naprawd\u0119 ciekawy. Mowa tutaj bowiem o <a href=\"https:\/\/openjdk.org\/jeps\/450\">JEP 450: Compact Object Headers (Experimental)<\/a>, dziecku projektu Liliput.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dla przypomnienia: celem Liliputa jest zmniejszenie rozmiaru nag\u0142\u00f3wk\u00f3w obiekt\u00f3w Java w maszynie JVM Hotspot ze 128 bit\u00f3w do 64 bit\u00f3w lub mniej. W tej chwili bowiem ka\u017cdy obiekt, niezale\u017cnie czy ma\u0142y, czy du\u017cy, posiada sta\u0142y narzut w teorii 128-bit\u00f3w, a w praktyce (przy w\u0142\u0105czonej kompresji nag\u0142\u00f3wk\u00f3w) 96-bit\u00f3w. 128-bit\u00f3w nie wydaje si\u0119 du\u017cym narzutem pami\u0119ci, nale\u017cy jednak pami\u0119ta\u0107, \u017ce m\u00f3wimy tutaj o nag\u0142\u00f3wku, kt\u00f3ry dok\u0142adany jest do ka\u017cdego jednego obiektu. W wielu zastosowaniach np. gdy tworzone jest wiele malutkich obiekt\u00f3w (tw\u00f3rcy powo\u0142uj\u0105 si\u0119 np. na machin\u0119 learning), ten narzut staje si\u0119 bardzo istotny, st\u0105d prace nad Liliputem.<\/p>\n","innerContent":["\n<p>Dla przypomnienia: celem Liliputa jest zmniejszenie rozmiaru nag\u0142\u00f3wk\u00f3w obiekt\u00f3w Java w maszynie JVM Hotspot ze 128 bit\u00f3w do 64 bit\u00f3w lub mniej. W tej chwili bowiem ka\u017cdy obiekt, niezale\u017cnie czy ma\u0142y, czy du\u017cy, posiada sta\u0142y narzut w teorii 128-bit\u00f3w, a w praktyce (przy w\u0142\u0105czonej kompresji nag\u0142\u00f3wk\u00f3w) 96-bit\u00f3w. 128-bit\u00f3w nie wydaje si\u0119 du\u017cym narzutem pami\u0119ci, nale\u017cy jednak pami\u0119ta\u0107, \u017ce m\u00f3wimy tutaj o nag\u0142\u00f3wku, kt\u00f3ry dok\u0142adany jest do ka\u017cdego jednego obiektu. W wielu zastosowaniach np. gdy tworzone jest wiele malutkich obiekt\u00f3w (tw\u00f3rcy powo\u0142uj\u0105 si\u0119 np. na machin\u0119 learning), ten narzut staje si\u0119 bardzo istotny, st\u0105d prace nad Liliputem.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Przygl\u0105dnijmy si\u0119 zatem, co przynosi JEP 450. Og\u00f3lnie rzecz bior\u0105c, zmniejszenie rozmiaru nag\u0142\u00f3wka zosta\u0142o osi\u0105gni\u0119te dzi\u0119ki starannemu przeprojektowaniu struktury nag\u0142\u00f3wka obiektu i niezb\u0119dnym ulepszeniom w podstawowych funkcjach JVM w celu obs\u0142ugi kompaktowego formatu nag\u0142\u00f3wka. W obecnym modelu nag\u0142\u00f3wek obiektu sk\u0142ada si\u0119 z dw\u00f3ch cz\u0119\u015bci: s\u0142owa znacznika (mark word) i s\u0142owa klasy. S\u0142owo znacznika zawiera informacje takie jak informacje o przej\u015bciu Garbage Collectora czy hashcode. S\u0142owo klasy nast\u0119puje po s\u0142owie znacznika i zawiera informacje o wska\u017aniku klasy. Nowy kompaktowy format nag\u0142\u00f3wka \u0142\u0105czy s\u0142owa znacznika i klasy poprzez zmniejszenie rozmiaru hashcode i przeniesienie wska\u017anika klasy do s\u0142owa znacznika, zasadniczo zmniejszaj\u0105c narzut nag\u0142\u00f3wka.<\/p>\n","innerContent":["\n<p>Przygl\u0105dnijmy si\u0119 zatem, co przynosi JEP 450. Og\u00f3lnie rzecz bior\u0105c, zmniejszenie rozmiaru nag\u0142\u00f3wka zosta\u0142o osi\u0105gni\u0119te dzi\u0119ki starannemu przeprojektowaniu struktury nag\u0142\u00f3wka obiektu i niezb\u0119dnym ulepszeniom w podstawowych funkcjach JVM w celu obs\u0142ugi kompaktowego formatu nag\u0142\u00f3wka. W obecnym modelu nag\u0142\u00f3wek obiektu sk\u0142ada si\u0119 z dw\u00f3ch cz\u0119\u015bci: s\u0142owa znacznika (mark word) i s\u0142owa klasy. S\u0142owo znacznika zawiera informacje takie jak informacje o przej\u015bciu Garbage Collectora czy hashcode. S\u0142owo klasy nast\u0119puje po s\u0142owie znacznika i zawiera informacje o wska\u017aniku klasy. Nowy kompaktowy format nag\u0142\u00f3wka \u0142\u0105czy s\u0142owa znacznika i klasy poprzez zmniejszenie rozmiaru hashcode i przeniesienie wska\u017anika klasy do s\u0142owa znacznika, zasadniczo zmniejszaj\u0105c narzut nag\u0142\u00f3wka.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jednak to, co chyba najciekawsze, to bardzo poka\u017ana sekcja ryzyk, szeroka jak nigdy. Nie ma si\u0119 jednak co dziwi\u0107 - grzebiemy tutaj w \"bebechach\" samego JVM, ni\u017cej zej\u015b\u0107 ju\u017c trudno. Na wspomnianej li\u015bcie znajdziemy cho\u0107by<\/p>\n","innerContent":["\n<p>Jednak to, co chyba najciekawsze, to bardzo poka\u017ana sekcja ryzyk, szeroka jak nigdy. Nie ma si\u0119 jednak co dziwi\u0107 - grzebiemy tutaj w \"bebechach\" samego JVM, ni\u017cej zej\u015b\u0107 ju\u017c trudno. Na wspomnianej li\u015bcie znajdziemy cho\u0107by<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>ograniczenie przestrzeni dla dalszego rozwoju j\u0119zyka<\/li>\n","innerContent":["\n<li>ograniczenie przestrzeni dla dalszego rozwoju j\u0119zyka<\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>potencjalne b\u0142\u0119dami w funkcji i starszym kodzie<\/li>\n","innerContent":["\n<li>potencjalne b\u0142\u0119dami w funkcji i starszym kodzie<\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>mo\u017cliwe wprowadzenie problem\u00f3w z wydajno\u015bci\u0105 z powodu wymaganych refaktoryzacji<\/li>\n","innerContent":["\n<li>mo\u017cliwe wprowadzenie problem\u00f3w z wydajno\u015bci\u0105 z powodu wymaganych refaktoryzacji<\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>brakiem wsparcia i ograniczeniami kodowania dla skompresowanych wska\u017anik\u00f3w klas<\/li>\n","innerContent":["\n<li>brakiem wsparcia i ograniczeniami kodowania dla skompresowanych wska\u017anik\u00f3w klas<\/li>\n"]}],"innerHTML":"\n<ul>\n\n\n\n\n\n<\/ul>\n","innerContent":["\n<ul>",null,"\n\n",null,"\n\n",null,"\n\n",null,"<\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>a jest tego sporo wi\u0119cej.<\/p>\n","innerContent":["\n<p>a jest tego sporo wi\u0119cej.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jednocze\u015bnie tw\u00f3rcy si\u0119 nie poddaj\u0105, bo potencjalna nagroda jest poka\u017ana - wed\u0142ug pierwszych test\u00f3w, m\u00f3wimy tu nawet o 20% procent redukcji zaj\u0119cia pami\u0119ci, a to ju\u017c gra warta \u015bwieczki.<\/p>\n","innerContent":["\n<p>Jednocze\u015bnie tw\u00f3rcy si\u0119 nie poddaj\u0105, bo potencjalna nagroda jest poka\u017ana - wed\u0142ug pierwszych test\u00f3w, m\u00f3wimy tu nawet o 20% procent redukcji zaj\u0119cia pami\u0119ci, a to ju\u017c gra warta \u015bwieczki.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u015bli powy\u017csze zmiany Was zaciekawi\u0142y, jak zwykle po wi\u0119cej szczeg\u00f3\u0142\u00f3w odsy\u0142am do oryginalnego JEP-a, ale r\u00f3wnie\u017c filmiku Java Newscast, kt\u00f3ry prezentuje w detalach poszczeg\u00f3lne zmiany:<\/p>\n","innerContent":["\n<p>Je\u015bli powy\u017csze zmiany Was zaciekawi\u0142y, jak zwykle po wi\u0119cej szczeg\u00f3\u0142\u00f3w odsy\u0142am do oryginalnego JEP-a, ale r\u00f3wnie\u017c filmiku Java Newscast, kt\u00f3ry prezentuje w detalach poszczeg\u00f3lne zmiany:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/embed","attrs":{"url":"https:\/\/www.youtube.com\/watch?v=r2G4ed2E4QY","type":"video","providerNameSlug":"youtube","responsive":true,"className":"wp-embed-aspect-16-9 wp-has-aspect-ratio"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.youtube.com\/watch?v=r2G4ed2E4QY\n<\/div><\/figure>\n","innerContent":["\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.youtube.com\/watch?v=r2G4ed2E4QY\n<\/div><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li><a href=\"https:\/\/openjdk.org\/jeps\/450\">JEP 450: Compact Object Headers (Experimental)<\/a><\/li>\n","innerContent":["\n<li><a href=\"https:\/\/openjdk.org\/jeps\/450\">JEP 450: Compact Object Headers (Experimental)<\/a><\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=r2G4ed2E4QY\">Save 10-20% Memory With Compact Headers - Inside Java Newscast #48<\/a><\/li>\n","innerContent":["\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=r2G4ed2E4QY\">Save 10-20% Memory With Compact Headers - Inside Java Newscast #48<\/a><\/li>\n"]}],"innerHTML":"\n<ul>\n\n<\/ul>\n","innerContent":["\n<ul>",null,"\n\n",null,"<\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">3. Release Radar<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">3. Release Radar<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dawno nie by\u0142o release radaru i nazbiera\u0142o si\u0119 nam nowinek. I bardzo dobrze - ka\u017cda z prezentowanych dzisiaj nowo\u015bci jest bowiem w najgorszym przypadku interesuj\u0105c\u0105 ciekawostk\u0105, a potencjalnie mo\u017ce by\u0107 bardzo u\u017cyteczna.<\/p>\n","innerContent":["\n<p>Dawno nie by\u0142o release radaru i nazbiera\u0142o si\u0119 nam nowinek. I bardzo dobrze - ka\u017cda z prezentowanych dzisiaj nowo\u015bci jest bowiem w najgorszym przypadku interesuj\u0105c\u0105 ciekawostk\u0105, a potencjalnie mo\u017ce by\u0107 bardzo u\u017cyteczna.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/www.azul.com\/products\/components\/crac\/\">Azul Zulu JDK 17 ze wsparciem CRaC<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/www.azul.com\/products\/components\/crac\/\">Azul Zulu JDK 17 ze wsparciem CRaC<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Pierwszy release pozostawi nas w \u015bwiecie JDK. Azul og\u0142osi\u0142 bowiem wydanie <a href=\"https:\/\/www.azul.com\/products\/components\/crac\/\">swojej OpenJDK 17 - Zulu - zawieraj\u0105c\u0105 wbudowan\u0105 obs\u0142ug\u0119 CRaC API<\/a>.<\/p>\n","innerContent":["\n<p>Pierwszy release pozostawi nas w \u015bwiecie JDK. Azul og\u0142osi\u0142 bowiem wydanie <a href=\"https:\/\/www.azul.com\/products\/components\/crac\/\">swojej OpenJDK 17 - Zulu - zawieraj\u0105c\u0105 wbudowan\u0105 obs\u0142ug\u0119 CRaC API<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dobra, du\u017co ale czym ten CRaC jest? CRaC API pomaga koordynowa\u0107 JDK i zasoby aplikacji z mechanizmum checkpoint\/restore <a href=\"https:\/\/criu.org\/Main_Page\">Checkpoint\/Restore in Userspace (CRIU)<\/a>. Pozwala on na utworzenie \u201echeckpointu\u201d \u2013 czyli wspomnianego zrzutu pami\u0119ci \u2013 w dowolnym momencie pracy aplikacji zdefiniowanym przez tw\u00f3rc\u0119 oprogramowania. Dzi\u0119ki niemu aplikacje Javowe mog\u0105 unikn\u0105\u0107 d\u0142ugiego uruchamiania i procesu \u201crozgrzewania\u201d, zapisuj\u0105c pe\u0142ny stan \u015brodowiska uruchomieniowego.<\/p>\n","innerContent":["\n<p>Dobra, du\u017co ale czym ten CRaC jest? CRaC API pomaga koordynowa\u0107 JDK i zasoby aplikacji z mechanizmum checkpoint\/restore <a href=\"https:\/\/criu.org\/Main_Page\">Checkpoint\/Restore in Userspace (CRIU)<\/a>. Pozwala on na utworzenie \u201echeckpointu\u201d \u2013 czyli wspomnianego zrzutu pami\u0119ci \u2013 w dowolnym momencie pracy aplikacji zdefiniowanym przez tw\u00f3rc\u0119 oprogramowania. Dzi\u0119ki niemu aplikacje Javowe mog\u0105 unikn\u0105\u0107 d\u0142ugiego uruchamiania i procesu \u201crozgrzewania\u201d, zapisuj\u0105c pe\u0142ny stan \u015brodowiska uruchomieniowego.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Mam w\u015br\u00f3d czytelnik\u00f3w jakich\u015b retro-graczy? Je\u015bli tak, to ca\u0142o\u015b\u0107 dzia\u0142a w podobny spos\u00f3b jak funkcjonalno\u015b\u0107 Save State w emulatorach.  Klasyczne zapisywanie (jak w nowoczesnych grach) wygl\u0105da tak:  wybieramy te fragmenty, kt\u00f3re pozwol\u0105 nam p\u00f3\u017aniej odtworzy\u0107 stan aplikacji, i tylko je zapisujemy. Save State nie bawi si\u0119 w takie finezje \u2013 jako, \u017ce komputery posz\u0142y do przodu i mamy wi\u0119cej przestrzeni dyskowej, to po prostu zrzucamy ca\u0142y stan pami\u0119ci na dysk i potem sobie odtwarzamy 1:1 gdy jest to potrzebne.<\/p>\n","innerContent":["\n<p>Mam w\u015br\u00f3d czytelnik\u00f3w jakich\u015b retro-graczy? Je\u015bli tak, to ca\u0142o\u015b\u0107 dzia\u0142a w podobny spos\u00f3b jak funkcjonalno\u015b\u0107 Save State w emulatorach.  Klasyczne zapisywanie (jak w nowoczesnych grach) wygl\u0105da tak:  wybieramy te fragmenty, kt\u00f3re pozwol\u0105 nam p\u00f3\u017aniej odtworzy\u0107 stan aplikacji, i tylko je zapisujemy. Save State nie bawi si\u0119 w takie finezje \u2013 jako, \u017ce komputery posz\u0142y do przodu i mamy wi\u0119cej przestrzeni dyskowej, to po prostu zrzucamy ca\u0142y stan pami\u0119ci na dysk i potem sobie odtwarzamy 1:1 gdy jest to potrzebne.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","width":542,"height":259},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-5-1536x732.png\" alt=\"\" width=\"542\" height=\"259\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-5-1536x732.png\" alt=\"\" width=\"542\" height=\"259\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Oczywi\u015bcie CRaC posiada pewnie ograniczenia (w ko\u0144cu samo \u015brodowisko uruchomieniowe mo\u017ce si\u0119 zmieni\u0107, dodatkowo utrudniona jest randomizacja). Ca\u0142o\u015b\u0107 ju\u017c dzisiaj nap\u0119dza jednak cho\u0107by Amazon Lambda SnapStart, a poszczeg\u00f3lne frameworki chwal\u0105 si\u0119 swoimi eksperymentami z narz\u0119dziem, kt\u00f3rego u\u017cycie daje pono\u0107 naprawd\u0119 dobre wyniki:<\/p>\n","innerContent":["\n<p>Oczywi\u015bcie CRaC posiada pewnie ograniczenia (w ko\u0144cu samo \u015brodowisko uruchomieniowe mo\u017ce si\u0119 zmieni\u0107, dodatkowo utrudniona jest randomizacja). Ca\u0142o\u015b\u0107 ju\u017c dzisiaj nap\u0119dza jednak cho\u0107by Amazon Lambda SnapStart, a poszczeg\u00f3lne frameworki chwal\u0105 si\u0119 swoimi eksperymentami z narz\u0119dziem, kt\u00f3rego u\u017cycie daje pono\u0107 naprawd\u0119 dobre wyniki:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","width":400,"height":227},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/CleanShot-2023-05-15-at-08.03.52.gif\" alt=\"\" width=\"400\" height=\"227\"\/><figcaption class=\"wp-element-caption\">To tyle je\u015bli chodzi o konsekwencje w \"nie pokazywaniu benchmark\u00f3w bez kontekstu\", kt\u00f3r\u0105 szczyci\u0142em si\u0119 w pierwszym paragrafie.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/CleanShot-2023-05-15-at-08.03.52.gif\" alt=\"\" width=\"400\" height=\"227\"\/><figcaption class=\"wp-element-caption\">To tyle je\u015bli chodzi o konsekwencje w \"nie pokazywaniu benchmark\u00f3w bez kontekstu\", kt\u00f3r\u0105 szczyci\u0142em si\u0119 w pierwszym paragrafie.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Od samego pocz\u0105tku za projektem sta\u0142 <a href=\"https:\/\/www.linkedin.com\/in\/anton-kozlov-50a81173\/\">Anton Kozlov<\/a> z Azul, tak\u017ce pojawienie si\u0119 wydania nie powinno nikogo zaskakiwa\u0107. Na m\u00f3j stan wiedzy Azul jest jednak pierwszym dostawcom, kt\u00f3ry zapewnia komercyjne wsparcie dla tej technologii.<\/p>\n","innerContent":["\n<p>Od samego pocz\u0105tku za projektem sta\u0142 <a href=\"https:\/\/www.linkedin.com\/in\/anton-kozlov-50a81173\/\">Anton Kozlov<\/a> z Azul, tak\u017ce pojawienie si\u0119 wydania nie powinno nikogo zaskakiwa\u0107. Na m\u00f3j stan wiedzy Azul jest jednak pierwszym dostawcom, kt\u00f3ry zapewnia komercyjne wsparcie dla tej technologii.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":15961,"width":512,"height":384,"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\/05\/o1wnQea_d-1-1024x768.webp\" alt=\"\" class=\"wp-image-15961\" width=\"512\" height=\"384\"\/><figcaption class=\"wp-element-caption\">A CRaC-iem warto si\u0119 interesowa\u0107. Wprawdzie Spring I\/O 2023 zajmiemy si\u0119 dopiero za tydzie\u0144, ale powy\u017cej macie spoiler wprost z Keynote konferencji.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/o1wnQea_d-1-1024x768.webp\" alt=\"\" class=\"wp-image-15961\" width=\"512\" height=\"384\"\/><figcaption class=\"wp-element-caption\">A CRaC-iem warto si\u0119 interesowa\u0107. Wprawdzie Spring I\/O 2023 zajmiemy si\u0119 dopiero za tydzie\u0144, ale powy\u017cej macie spoiler wprost z Keynote konferencji.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\"><a href=\"https:\/\/microstream.one\/blog\/article\/microstream-8-0-is-now-available\/\">MicroStream 8.0<\/a><\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\"><a href=\"https:\/\/microstream.one\/blog\/article\/microstream-8-0-is-now-available\/\">MicroStream 8.0<\/a><\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>MicroStream to system in-memory persystencji dla graf\u00f3w obiekt\u00f3w, pozwalaj\u0105cy na ich wydajne przechowywanie, \u0142adowanie, querowanie. Zosta\u0142 zaprojektowany tak, aby zminimalizowa\u0107 potrzeb\u0119 mapowania obiektowo-relacyjnego (ORM), co daje tw\u00f3rcom spore zalety je\u015bli chodzi o wydajno\u015b\u0107 rozwi\u0105zania, a tak\u017ce upraszcza model danych. Dodatkowo, ca\u0142o\u015b\u0107 dostarczana jest w formie biblioteki, wi\u0119c \u0142atwo mo\u017cna do\u0142o\u017cy\u0107 j\u0105 do istniej\u0105cego projektu.<\/p>\n","innerContent":["\n<p>MicroStream to system in-memory persystencji dla graf\u00f3w obiekt\u00f3w, pozwalaj\u0105cy na ich wydajne przechowywanie, \u0142adowanie, querowanie. Zosta\u0142 zaprojektowany tak, aby zminimalizowa\u0107 potrzeb\u0119 mapowania obiektowo-relacyjnego (ORM), co daje tw\u00f3rcom spore zalety je\u015bli chodzi o wydajno\u015b\u0107 rozwi\u0105zania, a tak\u017ce upraszcza model danych. Dodatkowo, ca\u0142o\u015b\u0107 dostarczana jest w formie biblioteki, wi\u0119c \u0142atwo mo\u017cna do\u0142o\u017cy\u0107 j\u0105 do istniej\u0105cego projektu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>MicroStream v8.0 wprowadza wsparcie dla Lazy Collections, takie jak <code>LazyArrayList<\/code>, <code>LazyHashSet<\/code> i <code>LazyHashMap<\/code>, mog\u0105 \u0142adowa\u0107 dane do pami\u0119ci w momencie gdy te s\u0105 potrzebne, przy tylko nieznacznym zwi\u0119kszeniu czasu dost\u0119pu. Dodatkowo, dane mog\u0105 by\u0107 \u0142atwo czyszczone Garbage Collector, gdy zu\u017cycie pami\u0119ci jest wysokie, co sprawia \u017ce s\u0105 bardzo dobr\u0105 opcj\u0105 do implementacji cache aplikacji. Ca\u0142o\u015b\u0107 przechowywana jest w segmentach, a u\u017cytkownik mo\u017ce kontrolowa\u0107 liczb\u0119 element\u00f3w w ka\u017cdym z nich, cho\u0107 tw\u00f3rcy zach\u0119caj\u0105 raczej do u\u017cywania ich domy\u015blnych rozwi\u0105za\u0144.<\/p>\n","innerContent":["\n<p>MicroStream v8.0 wprowadza wsparcie dla Lazy Collections, takie jak <code>LazyArrayList<\/code>, <code>LazyHashSet<\/code> i <code>LazyHashMap<\/code>, mog\u0105 \u0142adowa\u0107 dane do pami\u0119ci w momencie gdy te s\u0105 potrzebne, przy tylko nieznacznym zwi\u0119kszeniu czasu dost\u0119pu. Dodatkowo, dane mog\u0105 by\u0107 \u0142atwo czyszczone Garbage Collector, gdy zu\u017cycie pami\u0119ci jest wysokie, co sprawia \u017ce s\u0105 bardzo dobr\u0105 opcj\u0105 do implementacji cache aplikacji. Ca\u0142o\u015b\u0107 przechowywana jest w segmentach, a u\u017cytkownik mo\u017ce kontrolowa\u0107 liczb\u0119 element\u00f3w w ka\u017cdym z nich, cho\u0107 tw\u00f3rcy zach\u0119caj\u0105 raczej do u\u017cywania ich domy\u015blnych rozwi\u0105za\u0144.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/github.com\/javamelody\/javamelody\/wiki\/ReleaseNotes#200\">JavaMelody 2.0<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/github.com\/javamelody\/javamelody\/wiki\/ReleaseNotes#200\">JavaMelody 2.0<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JavaMelody to narz\u0119dzie do monitorowania i profilowania wydajno\u015bci, przeznaczone g\u0142\u00f3wnie dla aplikacji Java i Java EE. Jest to raczej ma\u0142o znany projekt, ale \u0142\u0105cz\u0105 mnie z nim szczeg\u00f3lne wi\u0119zi. Pami\u0119tam, \u017ce w mojej pierwszej pracy z Java EE pierwszym zadaniem kt\u00f3re mia\u0142em by\u0142a w\u0142a\u015bnie jej integracja z projektem za pomoc\u0105 mechanizmu Rozszerze\u0144.<\/p>\n","innerContent":["\n<p>JavaMelody to narz\u0119dzie do monitorowania i profilowania wydajno\u015bci, przeznaczone g\u0142\u00f3wnie dla aplikacji Java i Java EE. Jest to raczej ma\u0142o znany projekt, ale \u0142\u0105cz\u0105 mnie z nim szczeg\u00f3lne wi\u0119zi. Pami\u0119tam, \u017ce w mojej pierwszej pracy z Java EE pierwszym zadaniem kt\u00f3re mia\u0142em by\u0142a w\u0142a\u015bnie jej integracja z projektem za pomoc\u0105 mechanizmu Rozszerze\u0144.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Przyznam, \u017ce od tamtej pory nie s\u0142ysza\u0142em o niej za wiele, dlatego te\u017c sporym zaskoczeniem by\u0142 dla mnie fakt og\u0142oszenia <a href=\"https:\/\/github.com\/javamelody\/javamelody\/wiki\/ReleaseNotes#200\">wydania 2.0<\/a>. Jak \u0142atwo si\u0119 domy\u015ble\u0107, podbicie numeracji zwi\u0105zane jest z przej\u015bciem na Jakarte EE 10 i nowy pakiet <code>jakarta.*<\/code> (my\u015bl\u0119, \u017ce ju\u017c dobrze kojarzycie ten wzorzec, wielokrotnie ju\u017c to przerabiali\u015bmy). Z tego te\u017c zreszt\u0105 wzgl\u0119du JavaMelody 2.0 wspiera jedynie Spring Boot 3+ - je\u017celi kto\u015b chce pozosta\u0107 na wcze\u015bniejszej wersji Springa, musi pozosta\u0107 na JavaMelody z ga\u0142\u0119zi 1.9.x.<\/p>\n","innerContent":["\n<p>Przyznam, \u017ce od tamtej pory nie s\u0142ysza\u0142em o niej za wiele, dlatego te\u017c sporym zaskoczeniem by\u0142 dla mnie fakt og\u0142oszenia <a href=\"https:\/\/github.com\/javamelody\/javamelody\/wiki\/ReleaseNotes#200\">wydania 2.0<\/a>. Jak \u0142atwo si\u0119 domy\u015ble\u0107, podbicie numeracji zwi\u0105zane jest z przej\u015bciem na Jakarte EE 10 i nowy pakiet <code>jakarta.*<\/code> (my\u015bl\u0119, \u017ce ju\u017c dobrze kojarzycie ten wzorzec, wielokrotnie ju\u017c to przerabiali\u015bmy). Z tego te\u017c zreszt\u0105 wzgl\u0119du JavaMelody 2.0 wspiera jedynie Spring Boot 3+ - je\u017celi kto\u015b chce pozosta\u0107 na wcze\u015bniejszej wersji Springa, musi pozosta\u0107 na JavaMelody z ga\u0142\u0119zi 1.9.x.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":15975,"width":512,"height":362,"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\/05\/Jakarta-EE.jpg\" alt=\"\" class=\"wp-image-15975\" width=\"512\" height=\"362\"\/><figcaption class=\"wp-element-caption\">Niesamowite, jak Jakarta EE w parze ze Springiem przyspieszy\u0142y nam ewolucje ca\u0142ego ekosystemu.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/Jakarta-EE.jpg\" alt=\"\" class=\"wp-image-15975\" width=\"512\" height=\"362\"\/><figcaption class=\"wp-element-caption\">Niesamowite, jak Jakarta EE w parze ze Springiem przyspieszy\u0142y nam ewolucje ca\u0142ego ekosystemu.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.coroutines\/releases\/tag\/1.7.0\">kotlinx.coroutines 1.7.0<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.coroutines\/releases\/tag\/1.7.0\">kotlinx.coroutines 1.7.0<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Na sam koniec zostawi\u0142em sobie Kotlina. W ostatnim czasie pojawi\u0142a si\u0119 bowiem nowa wersja Korutyn. Nie wszyscy mog\u0105 sobie bowiem zdawa\u0107 spraw\u0119, \u017ce cho\u0107 kortyny s\u0105 cz\u0119\u015bci\u0105 Kotlina, to ich cykl wyda\u0144 pozostaje niezale\u017cny w stosunku do samego j\u0119zyka. Mimo, \u017ce od dawna cieszymy si\u0119 Kotlinem w wersji 1.8, to niedawno dostali\u015bmy w swoje r\u0119ce <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.coroutines\/releases\/tag\/1.7.0\">kotlinx.coroutines 1.7.0<\/a>. Co przynosi?<\/p>\n","innerContent":["\n<p>Na sam koniec zostawi\u0142em sobie Kotlina. W ostatnim czasie pojawi\u0142a si\u0119 bowiem nowa wersja Korutyn. Nie wszyscy mog\u0105 sobie bowiem zdawa\u0107 spraw\u0119, \u017ce cho\u0107 kortyny s\u0105 cz\u0119\u015bci\u0105 Kotlina, to ich cykl wyda\u0144 pozostaje niezale\u017cny w stosunku do samego j\u0119zyka. Mimo, \u017ce od dawna cieszymy si\u0119 Kotlinem w wersji 1.8, to niedawno dostali\u015bmy w swoje r\u0119ce <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.coroutines\/releases\/tag\/1.7.0\">kotlinx.coroutines 1.7.0<\/a>. Co przynosi?<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Najciekawsz\u0105 zmian\u0105 jest nowa implementacja Channel API (kana\u0142\u00f3w). Nowa struktura danych ma na celu naprawienie problem\u00f3w z poprzedni\u0105 implementacj\u0105. Poprzednia implementacja mia\u0142a problemy z poprawno\u015bci\u0105, \u0142atwo\u015bci\u0105 utrzymania i wydajno\u015bci\u0105. Nowa implementacja wykorzystuje struktury danych oparte na tablicach oraz wydajniejszych algorytmy pobierania i dodawania element\u00f3w. Nowe kana\u0142y s\u0105 wynikowo znacznie szybsze zar\u00f3wno w u\u017cyciu sekwencyjnym, jak i w przypadkach zr\u00f3wnoleglonych. Zmiana ma charakter techniczny i nie wp\u0142ywa na u\u017cytkownik\u00f3w. Ca\u0142o\u015b\u0107 algorytmu jest na tyle nowatorska doczeka\u0142a si\u0119 publikacji akademickiej: <a href=\"https:\/\/arxiv.org\/pdf\/2211.04986.pdf\">Fast and Scalable Channels in Kotlin Coroutines<\/a>. <\/p>\n","innerContent":["\n<p>Najciekawsz\u0105 zmian\u0105 jest nowa implementacja Channel API (kana\u0142\u00f3w). Nowa struktura danych ma na celu naprawienie problem\u00f3w z poprzedni\u0105 implementacj\u0105. Poprzednia implementacja mia\u0142a problemy z poprawno\u015bci\u0105, \u0142atwo\u015bci\u0105 utrzymania i wydajno\u015bci\u0105. Nowa implementacja wykorzystuje struktury danych oparte na tablicach oraz wydajniejszych algorytmy pobierania i dodawania element\u00f3w. Nowe kana\u0142y s\u0105 wynikowo znacznie szybsze zar\u00f3wno w u\u017cyciu sekwencyjnym, jak i w przypadkach zr\u00f3wnoleglonych. Zmiana ma charakter techniczny i nie wp\u0142ywa na u\u017cytkownik\u00f3w. Ca\u0142o\u015b\u0107 algorytmu jest na tyle nowatorska doczeka\u0142a si\u0119 publikacji akademickiej: <a href=\"https:\/\/arxiv.org\/pdf\/2211.04986.pdf\">Fast and Scalable Channels in Kotlin Coroutines<\/a>. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":15977,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/image-8.png\" alt=\"\" class=\"wp-image-15977\"\/><figcaption class=\"wp-element-caption\">To je\u015bli chcieliby\u015bcie si\u0119 bardziej wgry\u017a\u0107 w detale Kotlina.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/image-8.png\" alt=\"\" class=\"wp-image-15977\"\/><figcaption class=\"wp-element-caption\">To je\u015bli chcieliby\u015bcie si\u0119 bardziej wgry\u017a\u0107 w detale Kotlina.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Z innych ciekawy dodatk\u00f3w, doczekali\u015bmy si\u0119 tak\u017ce usprawnienia mechanizmu Mutex\u00f3w, poprawek w <code>kotlinx-coroutines-test<\/code> (zw\u0142aszcza w kontek\u015bcie lepszego wsparcia Timeout\u00f3w), a Kotlin\/Native doczeka\u0142 si\u0119 wsparcia dla <code>Dispatchers.IO<\/code>.<\/p>\n","innerContent":["\n<p>Z innych ciekawy dodatk\u00f3w, doczekali\u015bmy si\u0119 tak\u017ce usprawnienia mechanizmu Mutex\u00f3w, poprawek w <code>kotlinx-coroutines-test<\/code> (zw\u0142aszcza w kontek\u015bcie lepszego wsparcia Timeout\u00f3w), a Kotlin\/Native doczeka\u0142 si\u0119 wsparcia dla <code>Dispatchers.IO<\/code>.<\/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><strong>PS: Takie maile to ja lubi\u0119 dostawa\u0107 \u2764\ufe0f. Jest nas wielu!<\/strong><br><br><strong>Dzi\u0119kuj\u0119 Wam za zaufanie.<\/strong><\/p>\n","innerContent":["\n<p><strong>PS: Takie maile to ja lubi\u0119 dostawa\u0107 \u2764\ufe0f. Jest nas wielu!<\/strong><br><br><strong>Dzi\u0119kuj\u0119 Wam za zaufanie.<\/strong><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":15966,"width":512,"height":316,"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\/05\/image-5-1024x632.png\" alt=\"\" class=\"wp-image-15966\" width=\"512\" height=\"316\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/05\/image-5-1024x632.png\" alt=\"\" class=\"wp-image-15966\" width=\"512\" height=\"316\"\/><\/figure>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/15959","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=15959"}],"version-history":[{"count":21,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/15959\/revisions"}],"predecessor-version":[{"id":16016,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/15959\/revisions\/16016"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/16013"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=15959"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=15959"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=15959"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}