{"id":9963,"date":"2022-05-31T18:39:46","date_gmt":"2022-05-31T16:39:46","guid":{"rendered":"https:\/\/vived.io\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/"},"modified":"2022-09-19T13:10:37","modified_gmt":"2022-09-19T11:10:37","slug":"jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/","title":{"rendered":"JVM Tuesday vol. 89 &#8211; Loom, Loom, Loom&#8230; a tak\u017ce troch\u0119 Cleaner\u00f3w oraz Micronauta"},"content":{"rendered":"\n<h2 id=\"1-spolecznosc-testuje-project-loom\" data-num=1>1. Spo\u0142eczno\u015b\u0107 testuje Project Loom<\/h2>\n\n\n\n<p>Tak jak si\u0119 spodziewali\u015bmy, dostali\u015bmy istny wysyp tekst\u00f3w dotycz\u0105cych Projektu Loom. Wiele z nich jest naprawd\u0119 interesuj\u0105cych, dlatego zaczniemy od ma\u0142ej selekcji.&nbsp;<\/p>\n\n\n\n<p>Zacznijmy <a href=\"https:\/\/www.morling.dev\/blog\/loom-and-thread-fairness\/\">od publikacji<\/a> naszego starego znajomego, Gunnara Morlinga, kt\u00f3ry ju\u017c kiedy\u015b rozpracowywa\u0142 dla nas tajniki formatu pliku Java Flight Recordera. Tym razem do publikacji zainspirowa\u0142a go <a href=\"https:\/\/twitter.com\/pressron\/status\/1529194463242989568\">dyskusja<\/a> mi\u0119dzy Ronem Presslerem (tw\u00f3rc\u0105 Looma), a Timem Foxem z Vert.x, z kt\u00f3rej dowiadujemy si\u0119 o pewnych nieoczywistych cechach implementacji Looma. Ot\u00f3\u017c scheduler Looma nie ma w zasadzie poj\u0119cia o tym, czy metoda jest blokuj\u0105ca czy nie &#8211; modyfikacji zosta\u0142 za to poddany model blokowania klasycznego JDK, kt\u00f3ry zosta\u0142 \u201cnauczony\u201d uwalniania w\u0105tku systemu operacyjnego gdy prosi go o to Wirtualny (loomowski) W\u0105tek. Pojawi\u0142y si\u0119 jednak w\u0105tpliwo\u015bci na temat Uczciwo\u015b\u0107 (Fairness) takiego rozwi\u0105zania i ryzyko \u201czag\u0142odzenia\u201d konkretnych w\u0105tk\u00f3w, kt\u00f3re pojawi\u0107 si\u0119 mo\u017ce w wypadku zada\u0144 intensywnie wymagaj\u0105cych nie IO, a CPU. Nie istnieje bowiem mechanizm, kt\u00f3ry pozwoli\u0142by na na wyw\u0142aszczenie takiego d\u0142ugotrwaj\u0105cego zadania opartego na CPU.<\/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\/06\/img_62a889b55381d.png\" alt=\"\" width=\"700\" height=\"483\"\/><figcaption>Czym jest \u201czag\u0142odzenie\u201d? Zapraszam do <a href=\"https:\/\/pl.wikipedia.org\/wiki\/Problem_ucztuj%C4%85cych_filozof%C3%B3w\">problemu ucztuj\u0105cych filozof\u00f3w<\/a>.&nbsp;<\/figcaption><\/figure><\/div>\n\n\n<p>Gunnar w swojej publikacji prezentuje kilka wykres\u00f3w, kt\u00f3re bardzo klarownie t\u0142umacz\u0105, jak ten problem objawia si\u0119 w praktyce. W uproszczeniu &#8211; je\u015bli wystartujemy wi\u0119cej d\u0142ugo\u017cyj\u0105cych w\u0105tk\u00f3w ni\u017c jest dost\u0119pne realnych egzekutor\u00f3w, w wypadku klasycznych Thread\u00f3w wszystkie ko\u0144cz\u0105 si\u0119 mniej wi\u0119cej w tym samym czasie. W Loomie ten rozk\u0142ad b\u0119dzie niejednorodny &#8211; cz\u0119\u015b\u0107 w\u0105tk\u00f3w zako\u0144czy si\u0119 szybciej ni\u017c u poprzednika, ale na wiele z nich b\u0119dziemy musieli poczeka\u0107 d\u0142u\u017cej. Ron Pressler przekonuje, \u017ce w praktyce nie b\u0119dzie stanowi\u0142o to wi\u0119kszego problemu, a ju\u017c istnieje te\u017c gotowy kod, kt\u00f3ry ma to rozwi\u0105za\u0107 &#8211; jeszcze nie zosta\u0142 po prostu zmergowany. Og\u00f3lnie problem jest rozwi\u0105zywalny &#8211; np. programi\u015bci Go jako\u015b sobie z tym poradzili poprzez umo\u017cliwienie \u201cwyw\u0142aszczania\u201d gorutyny d\u0142u\u017cszej ni\u017c 10ms. No i od tego mamy w\u0142a\u015bnie wersj\u0119 Preview \u017ceby tego typu rzeczy wy\u0142apywa\u0107.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889b5e72b7.png\" alt=\"\"\/><figcaption>Nie ka\u017cdy ma tak\u0105 strategi\u0119 jak kiedy\u015b Google.<\/figcaption><\/figure><\/div>\n\n\n<p>Opr\u00f3cz ogranicze\u0144 (czy raczej braki ogranicze\u0144?) zwi\u0105zanych z procesorem, powinny si\u0119 te\u017c pojawia\u0107 te z u\u017cyciem pami\u0119ci. W ko\u0144cu ka\u017cdy w\u0105tek jest zasobem, kt\u00f3ry wymaga (nawet je\u015bli minimalnych) resourc\u00f3w systemowych. Eksperymenty Heinza M. Kabutza z periodyku JavaSpecialist pokazuj\u0105 jednak, \u017ce limity mog\u0105 by\u0107 o wiele dalej ni\u017c na zdrowy rozum powinny si\u0119 znajdowa\u0107. W jego ma\u0142ym eksperymencie, \u201cfizyczny\u201d limit (bior\u0105c pod uwag\u0119 u\u017cycie pami\u0119ci) ilo\u015bci stworzonych wirtualnych w\u0105tk\u00f3w powinien wynosi\u0107 oko\u0142o 8 milion\u00f3w &#8211; jego snippet (kt\u00f3rego znajdziecie pod linkiem <a href=\"https:\/\/www.javaspecialists.eu\/archive\/Issue301-Gazillion-Virtual-Threads.html\">Gazillion Virtual Threads<\/a>) by\u0142 w stanie wykr\u0119ci\u0107 36 miliard\u00f3w! Jak to mo\u017cliwe? Ot\u00f3\u017c okazuje si\u0119, \u017ce parkowane (zatrzymane) w\u0105tki nie zajmuj\u0105 w zasadzie pami\u0119ci i mo\u017cna ich tworzy\u0107 ile fabryka da\u0142a. Wad\u0105 jest to, \u017ce mog\u0105 by\u0107 w zasadzie w dowolnym momencie \u015bci\u0105gni\u0119te przez GC.&nbsp;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889b718e12.gif\" alt=\"\"\/><figcaption>Ale da si\u0119? Da si\u0119.<\/figcaption><\/figure><\/div>\n\n\n<p>Kontynuuj\u0105c temat Looma, poza tworzeniem kosmicznej ilo\u015bci zasob\u00f3w spo\u0142eczno\u015b\u0107 ju\u017c zaczyna wynajdowa\u0107 nowe sposoby na u\u017cycie tej technologii, niekt\u00f3re bardzo kreatywne. Fanatycy system\u00f3w rozproszonych z pewno\u015bci\u0105 kojarz\u0105 Jepsena &#8211; narz\u0119dzie do weryfikacje zapewnie\u0144 tw\u00f3rc\u00f3w baz i system\u00f3w co do ich sp\u00f3jno\u015bci (takiej w rozumieniu \u201cconsistency\u201d w CAP Theorem &#8211; bo to wcale nie jest takie oczywiste). Z artyku\u0142u Jamesa Bakera (kt\u00f3ry pracuje jako Engineering Group Lead w Palantir Technologies) dowiecie si\u0119 nie tylko jak dzia\u0142a Jepsen (a tak\u017ce rykoszetem FoundationDB &#8211; naprawd\u0119 fascynuj\u0105ca sprawa), ale r\u00f3wnie\u017c dlaczego Loom mo\u017ce by\u0107 bardzo dobrym narz\u0119dziem dla ka\u017cdego, kto potrzebuje zasymulowa\u0107 dziwne przypadki brzegowe je\u015bli chodzi o kolejno\u015b\u0107 zapis\u00f3w i odczyt\u00f3w. Okazuje si\u0119, \u017ce kontrola przep\u0142ywu, kt\u00f3r\u0105 dostajemy wraz z now\u0105 zabawk\u0105 na JVMie jest na tyle deterministyczna, \u017ce mo\u017cna j\u0105 u\u017cywa\u0107 r\u00f3wnie\u017c w tym kontek\u015bcie. <a href=\"https:\/\/jbaker.io\/2022\/05\/09\/project-loom-for-distributed-systems\/\">Using Java&#8217;s Project Loom to build more reliable distributed systems<\/a> to kawa\u0142 mocno krwistego mi\u0119cha dla ka\u017cdego, kto wie czym jest Paxos czy zegary logiczne.<\/p>\n\n\n\n<p>Na zako\u0144czenie, skoro ju\u017c jeste\u015bmy w temacie tekst\u00f3w na temat Looma, to pozwol\u0119 sobie przypomnie\u0107 o klasycznym (no bo sierpie\u0144 2020 to ju\u017c chyba klasyk) artykule <a href=\"https:\/\/inside.java\/2020\/08\/07\/loom-performance\/\">On the performance of user-mode threads and coroutines<\/a> autorstwa Rona Presslera. Dla os\u00f3b niezaznajomionych z tematem jest on bowiem (ca\u0142kiem przyst\u0119pn\u0105, mimo sporej ilo\u015bci wzor\u00f3w) podstaw\u0105 do dyskusji na temat wydajno\u015bci Looma.<\/p>\n\n\n\n<p>A, i Structured Concurrency jednak pojawi si\u0119 w inkubacji w JDK 19. To wydanie zapowiada si\u0119 jeszcze ciekawiej ni\u017c ostatnio.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889b826a5c.png\" alt=\"\"\/><figcaption>Aczkolwiek zaczynam mie\u0107 powoli obawy, czy doczekamy si\u0119 tam jakiegokolwiek stabilnego feature \ud83d\ude09<\/figcaption><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/www.morling.dev\/blog\/loom-and-thread-fairness\/\">Loom and Thread Fairness &#8211; Gunnar Morling<\/a><\/li><li><a href=\"https:\/\/pl.wikipedia.org\/wiki\/Problem_ucztuj%C4%85cych_filozof%C3%B3w\">Problem ucztuj\u0105cych filozof\u00f3w \u2013 Wikipedia, wolna encyklopedia<\/a><\/li><li><a href=\"https:\/\/www.javaspecialists.eu\/archive\/Issue301-Gazillion-Virtual-Threads.html\">[JavaSpecialists 301] &#8211; Gazillion Virtual Threads<\/a><\/li><li><a href=\"https:\/\/jbaker.io\/2022\/05\/09\/project-loom-for-distributed-systems\/\">Using Java&#8217;s Project Loom to build more reliable distributed systems \u00b7 James Baker<\/a><\/li><li><a href=\"https:\/\/inside.java\/2020\/08\/07\/loom-performance\/\">On the performance of user-mode threads and coroutines \u2013 Inside.java<\/a><\/li><\/ul>\n\n\n\n<h2 id=\"2-alternatywa-dla-finalizerow-jdk-9-i-cleaners\" data-num=2>2. Alternatywa dla Finalizer\u00f3w &#8211; JDK 9 i Cleaners<\/h2>\n\n\n\n<p>No, ale Loom to akurat przysz\u0142o\u015b\u0107 JVM. Wiecie co jest jego przesz\u0142o\u015bci\u0105? Finalizery. I Oracle stara\u0142 si\u0119 to nam usilnie uzmys\u0142owi\u0107 w ostatnim tygodniu, publikuj\u0105c dwa teksty dotycz\u0105ce ich alternatywy, czyli Cleaner\u00f3w.<\/p>\n\n\n\n<p>Czym s\u0105 finalizery? Pewnie wi\u0119kszo\u015b\u0107 z naszych czytelnik\u00f3w zdaje sobie spraw\u0119, ale dla wyr\u00f3wnania poziomu &#8211; m\u00f3wimy tutaj o specjalnych blokach kodu w ramach obiektu, kt\u00f3re odpalaj\u0105 si\u0119 wraz z czyszczeniem przez Garbage Collector obiekt\u00f3w. Pozwala\u0142y min. na czyszczenie otwartych powi\u0105za\u0144 do plik\u00f3w czy po\u0142\u0105cze\u0144 do bazy &#8211; og\u00f3lnie rzeczy znajduj\u0105cych si\u0119 poza obszarem JVM. Brzmi dobrze w teorii, ale finalizery przez lata wypracowa\u0142y sobie (zas\u0142u\u017cenie) funkcjonalno\u015bci, kt\u00f3rej ci\u0119\u017cko zaufa\u0107, gdy\u017c w wielu przypadkach po prostu\u2026 nie dzia\u0142a\u0142y. To, a tak\u017ce poziom skomplikowania zwi\u0105zany z ich implementacj\u0105 (co pewnie w jaki\u015b spos\u00f3b si\u0119 \u0142\u0105czy) sprawi\u0142y, \u017ce tw\u00f3rcy JDK postanowili ostatecznie si\u0119 ich pozby\u0107, wi\u0119c w JDK 18 doczeka\u0142y si\u0119 deprekacji w ramach <a href=\"http:\/\/openjdk.java.net\/jeps\/421\">JEP 421: Deprecate Finalization for Removal<\/a>. Nie ma nad czym p\u0142aka\u0107, gdy\u017c przez lata JVM doczeka\u0142 si\u0119 wielu alternatywnych, bardziej wyspecjalizowanych rozwi\u0105za\u0144, jak try-with-resources czy w\u0142a\u015bnie Cleanery.<\/p>\n\n\n\n<p>Cleanery pojawi\u0142y si\u0119 w JDK 9 i stanowi\u0105 drugie podej\u015bcie do czyszczenia stanu po wyczyszczeniu obiektu przez Garbage Collector. Rozwi\u0105zuj\u0105 jednak powa\u017cny problem, kt\u00f3ry towarzysz\u0105 finalizerom. Ta zdeprecatowana funkcjonalno\u015b\u0107 definiowa\u0142a bowiem zachowanie, kt\u00f3re nale\u017cy uruchomi\u0107 po czyszczeniu jako\u2026 cz\u0119\u015b\u0107 czyszczonego obiektu. Prowadzi\u0142o to do urokliwych wy\u015bcig\u00f3w, czy funkcja czyszcz\u0105ca uruchomi si\u0119, zanim obiekt zostanie ostatecznie usuni\u0119ty przez GC.&nbsp;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889ba8875b.png\" alt=\"\"\/><figcaption>Po prostu nie mia\u0142a szans.<\/figcaption><\/figure><\/div>\n\n\n<p>Cleanery rozwi\u0105zuj\u0105 ten problem w bardzo sprytny spos\u00f3b &#8211; zamiast by\u0107 cz\u0119\u015bci\u0105 obiektu, tworz\u0105 (w formie lambdy) dodatkowy obiekt, rejestrowany r\u00f3wnolegle do czyszczonego przez nie obiektu. Dzi\u0119ki temu nie dochodzi do kuriozalnych race condition.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Foo {\n  private static final Cleaner cleaner = Cleaner.create();\n  private final char&#091;] data;\n    \n  Foo(char&#091;] chars) {\n    final char&#091;] array = chars.clone();\n    cleaner.register(this, \n          () -&gt; Arrays.fill(array, (char)0));\n    this.data = array;\n  }\n}<\/code><\/pre>\n\n\n\n<p>Je\u017celi chcecie dowiedzie\u0107 si\u0119 wi\u0119cej, oficjalny blog inside.java republikowa\u0142 u siebie dwie \u015bwietne publikacje, b\u0119d\u0105ce bardzo dobrym opracowaniem tematu: <a href=\"https:\/\/inside.java\/2022\/05\/25\/clean-cleaner\/\">Replacing finalizers with cleaners<\/a> oraz <a href=\"https:\/\/inside.java\/2022\/05\/27\/testing-clean-cleaner-cleanup\/\">Testing clean cleaner cleanup<\/a> opublikowane oryginalnie na blogu <a href=\"https:\/\/inside.java\/2022\/05\/27\/testing-clean-cleaner-cleanup\/\">Musing on Java Core Libraries<\/a>. W nich znajdziecie wi\u0119cej szczeg\u00f3\u0142\u00f3w, a tak\u017ce przyk\u0142ad\u00f3w do czego mo\u017cna u\u017cy\u0107 cleaner\u00f3w, je\u015bli jeszcze nie macie pomys\u0142\u00f3w na eksploracj\u0119 tej funkcjonalno\u015bci.&nbsp;<\/p>\n\n\n\n<p>\u0179r\u00f3d\u0142a<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/inside.java\/2022\/05\/25\/clean-cleaner\/\">Replacing finalizers with cleaners<\/a><\/li><li><a href=\"https:\/\/inside.java\/2022\/05\/27\/testing-clean-cleaner-cleanup\/\">Testing clean cleaner cleanup<\/a><\/li><\/ul>\n\n\n\n<h2 id=\"3-release-radar-micronaut-3-5\" data-num=3>3. Release Radar: Micronaut 3.5<\/h2>\n\n\n\n<p>Nowy tydzie\u0144, nowy Radar. Do\u015b\u0107 skromny, poniewa\u017c tylko z jednym wydaniem, i te\u017c nie jako\u015b mocno wybijaj\u0105cym si\u0119, ale dla porz\u0105dku stwierdzi\u0142em, \u017ce warto nim zako\u0144czy\u0107 tego tygodniowy przegl\u0105d.<\/p>\n\n\n\n<p>Ot\u00f3\u017c w zesz\u0142ym tygodniu swoj\u0105 premier\u0105 mia\u0142 nowy <a href=\"https:\/\/micronaut.io\/2022\/05\/26\/micronaut-framework-3-5-0\/\">Micronaut 3.5<\/a>. Poza podbiciem zale\u017cno\u015bci i kompatybilno\u015bci (min. z nowym GraalVM) przynosi on w zasadzie trzy nowe du\u017ce dodatki dla programist\u00f3w. Posiadaczy du\u017cych projekt\u00f3w w Micronaucie (co samo w sobie wydaje mi si\u0119 by\u0107 ciekawym konceptem, cho\u0107 i te mniejsze powinny skorzysta\u0107) ucieszy z pewno\u015bci\u0105 wprowadzenie inkrementalnej kompilacji dla build\u00f3w Gradle, co powinno skr\u00f3ci\u0107 czas budowania i da\u0107 lepszy developer experience. Mniej os\u00f3b zainteresuje pewnie wsparcie dla Turbo &#8211; w Micronaut Views. Jak pisz\u0105 sami tw\u00f3rcy:<br><br>Turbo to zbi\u00f3r technik umo\u017cliwiaj\u0105cych tworzenie szybkich, stopniowo ulepszonych aplikacji internetowych bez u\u017cycia du\u017cej ilo\u015bci JavaScriptu. Ca\u0142a logika jest przechowywana na serwerze, a przegl\u0105darka zajmuje si\u0119 tylko ko\u0144cowym kodem HTML.<\/p>\n\n\n\n<p>Wychodz\u0105c poza bana\u0142, Turbo ma kilka interesuj\u0105cych as\u00f3w w r\u0119kawie, jak cho\u0107by \u201cpchanie\u201d HTMLa do przegl\u0105darki za pomoc\u0105 WebSocket\u00f3w. Je\u015bli mierzi Was tworzenie SPA, Turbo mo\u017ce by\u0107 interesuj\u0105c\u0105 alternatyw\u0105. Za ca\u0142o\u015bci\u0105 stoj\u0105 ludzie tworz\u0105cy wcze\u015bniej Ruby on Rails, a ten framework przez lata uchodzi\u0142 za szczyt programistycznej produktywno\u015bci.&nbsp;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889bb5d97f.png\" alt=\"\"\/><figcaption>Mimo \u017ce najlepsze czasy \u015bwietno\u015bci Ruby\u2019ego mamy za sob\u0105 &#8211; pami\u0119tamy!<\/figcaption><\/figure><\/div>\n\n\n<p>Ostatnim z du\u017cych dodatk\u00f3w jest nowy modu\u0142, Micronaut <a href=\"https:\/\/microstream.one\/\">MicroStream<\/a>. MicroStream to swoista \u201cserializacja na sterydach\u201d, silnik persystencji do przechowywania obiekt\u00f3w Javowych w wielu r\u00f3\u017cnych formatach i storage, takich jak cho\u0107by S3 czy MongoDB. Oryginalnie cz\u0119\u015b\u0107 innego frameworka, Helidona, doczeka\u0142a si\u0119 teraz integracji z Micronautem<\/p>\n\n\n\n<p>Ma\u0142y bonusik: Spring.io opubklikowa\u0142 te\u017c w zesz\u0142ym tygodniu tekst <a href=\"https:\/\/spring.io\/blog\/2022\/05\/24\/preparing-for-spring-boot-3-0\">Preparing for Spring Boot 3.0<\/a>. W nim znajdziecie kroki, kt\u00f3re warto wykona\u0107 przed szykowan\u0105 na jesie\u0144 du\u017c\u0105 premier\u0105 du\u017cej wersji. Poza oczywisto\u015bciami pokroju upgrade do Javy 17 i sprawdzenia czy projekt dzia\u0142a, jest tam troch\u0119 mniej oczywistych sugestii. Dlatego ju\u017c dzisiaj sugeruje spojrze\u0107, mo\u017ce czas ju\u017c powoli szykowa\u0107 taski na backlogu?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>No, tego-tygodniowe wydanie zdecydowanie zdominowa\u0142 Project Loom. Ci, kt\u00f3rzy nie czekaj\u0105 na tego najbardziej w ostatnich latach oczekiwanego javowego &#8222;ficzura&#8221; znajd\u0105 dla siebie jednak nieco praktyczniejsze rzeczy, cho\u0107by pod postaci\u0105 Cleaner\u00f3w oraz Micronauta 3.5. Zapraszam do lektury<\/p>\n","protected":false},"author":10,"featured_media":8121,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[259],"tags":[],"class_list":["post-9963","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jvm-pl"],"acf":{"estimated_reading_time":"8","feature_image_blog":{"ID":8122,"id":8122,"title":"istockphoto-183232310-612x612","filename":"istockphoto-183232310-612x612-1.jpeg","filesize":49330,"url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/istockphoto-183232310-612x612-1.jpeg","link":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/istockphoto-183232310-612x612-2\/","alt":"","author":"10","description":"","caption":"(469\u2013399 BC), ancient Athenian philosopher. This is his statue, located before the Academy of Athens, Greece.","name":"istockphoto-183232310-612x612-2","status":"inherit","uploaded_to":9963,"date":"2022-05-31 16:39:25","modified":"2022-05-31 16:39:25","menu_order":0,"mime_type":"image\/jpeg","type":"image","subtype":"jpeg","icon":"https:\/\/vived.io\/wp-includes\/images\/media\/default.png","width":612,"height":408,"sizes":{"thumbnail":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/istockphoto-183232310-612x612-1-150x150.jpeg","thumbnail-width":150,"thumbnail-height":150,"medium":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/istockphoto-183232310-612x612-1-300x200.jpeg","medium-width":300,"medium-height":200,"medium_large":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/istockphoto-183232310-612x612-1.jpeg","medium_large-width":612,"medium_large-height":408,"large":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/istockphoto-183232310-612x612-1.jpeg","large-width":612,"large-height":408,"1536x1536":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/istockphoto-183232310-612x612-1.jpeg","1536x1536-width":612,"1536x1536-height":408,"2048x2048":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/istockphoto-183232310-612x612-1.jpeg","2048x2048-width":612,"2048x2048-height":408,"gform-image-choice-sm":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/istockphoto-183232310-612x612-1.jpeg","gform-image-choice-sm-width":300,"gform-image-choice-sm-height":200,"gform-image-choice-md":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/istockphoto-183232310-612x612-1.jpeg","gform-image-choice-md-width":400,"gform-image-choice-md-height":267,"gform-image-choice-lg":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/istockphoto-183232310-612x612-1.jpeg","gform-image-choice-lg-width":600,"gform-image-choice-lg-height":400}},"weekly_summary":true,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/JVM-1-1.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>JVM Tuesday vol. 89 - Loom, Loom, Loom... a tak\u017ce troch\u0119 Cleaner\u00f3w oraz Micronauta - 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\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JVM Tuesday vol. 89 - Loom, Loom, Loom... a tak\u017ce troch\u0119 Cleaner\u00f3w oraz Micronauta - Vived\" \/>\n<meta property=\"og:description\" content=\"No, tego-tygodniowe wydanie zdecydowanie zdominowa\u0142 Project Loom. Ci, kt\u00f3rzy nie czekaj\u0105 na tego najbardziej w ostatnich latach oczekiwanego javowego &quot;ficzura&quot; znajd\u0105 dla siebie jednak nieco praktyczniejsze rzeczy, cho\u0107by pod postaci\u0105 Cleaner\u00f3w oraz Micronauta 3.5. Zapraszam do lektury\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2022-05-31T16:39:46+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-09-19T11:10:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/JVM-1-1.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\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"JVM Tuesday vol. 89 &#8211; Loom, Loom, Loom&#8230; a tak\u017ce troch\u0119 Cleaner\u00f3w oraz Micronauta\",\"datePublished\":\"2022-05-31T16:39:46+00:00\",\"dateModified\":\"2022-09-19T11:10:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/\"},\"wordCount\":1673,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/JVM-1-1.png\",\"articleSection\":[\"JVM\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/\",\"url\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/\",\"name\":\"JVM Tuesday vol. 89 - Loom, Loom, Loom... a tak\u017ce troch\u0119 Cleaner\u00f3w oraz Micronauta - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/JVM-1-1.png\",\"datePublished\":\"2022-05-31T16:39:46+00:00\",\"dateModified\":\"2022-09-19T11:10:37+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/JVM-1-1.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/JVM-1-1.png\",\"width\":1200,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JVM Tuesday vol. 89 &#8211; Loom, Loom, Loom&#8230; a tak\u017ce troch\u0119 Cleaner\u00f3w oraz Micronauta\"}]},{\"@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":"JVM Tuesday vol. 89 - Loom, Loom, Loom... a tak\u017ce troch\u0119 Cleaner\u00f3w oraz Micronauta - 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\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/","og_locale":"pl_PL","og_type":"article","og_title":"JVM Tuesday vol. 89 - Loom, Loom, Loom... a tak\u017ce troch\u0119 Cleaner\u00f3w oraz Micronauta - Vived","og_description":"No, tego-tygodniowe wydanie zdecydowanie zdominowa\u0142 Project Loom. Ci, kt\u00f3rzy nie czekaj\u0105 na tego najbardziej w ostatnich latach oczekiwanego javowego \"ficzura\" znajd\u0105 dla siebie jednak nieco praktyczniejsze rzeczy, cho\u0107by pod postaci\u0105 Cleaner\u00f3w oraz Micronauta 3.5. Zapraszam do lektury","og_url":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/","og_site_name":"Vived","article_published_time":"2022-05-31T16:39:46+00:00","article_modified_time":"2022-09-19T11:10:37+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/JVM-1-1.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\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"JVM Tuesday vol. 89 &#8211; Loom, Loom, Loom&#8230; a tak\u017ce troch\u0119 Cleaner\u00f3w oraz Micronauta","datePublished":"2022-05-31T16:39:46+00:00","dateModified":"2022-09-19T11:10:37+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/"},"wordCount":1673,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/JVM-1-1.png","articleSection":["JVM"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/","url":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/","name":"JVM Tuesday vol. 89 - Loom, Loom, Loom... a tak\u017ce troch\u0119 Cleaner\u00f3w oraz Micronauta - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/JVM-1-1.png","datePublished":"2022-05-31T16:39:46+00:00","dateModified":"2022-09-19T11:10:37+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/JVM-1-1.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/05\/JVM-1-1.png","width":1200,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-90-loom-loom-loom-a-takze-troche-cleanerow-oraz-micronauta\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"JVM Tuesday vol. 89 &#8211; Loom, Loom, Loom&#8230; a tak\u017ce troch\u0119 Cleaner\u00f3w oraz Micronauta"}]},{"@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>1. Spo\u0142eczno\u015b\u0107 testuje Project Loom<\/h2>\n","innerContent":["\n<h2>1. Spo\u0142eczno\u015b\u0107 testuje Project Loom<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Tak jak si\u0119 spodziewali\u015bmy, dostali\u015bmy istny wysyp tekst\u00f3w dotycz\u0105cych Projektu Loom. Wiele z nich jest naprawd\u0119 interesuj\u0105cych, dlatego zaczniemy od ma\u0142ej selekcji.&nbsp;<\/p>\n","innerContent":["\n<p>Tak jak si\u0119 spodziewali\u015bmy, dostali\u015bmy istny wysyp tekst\u00f3w dotycz\u0105cych Projektu Loom. Wiele z nich jest naprawd\u0119 interesuj\u0105cych, dlatego zaczniemy od ma\u0142ej selekcji.&nbsp;<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zacznijmy <a href=\"https:\/\/www.morling.dev\/blog\/loom-and-thread-fairness\/\">od publikacji<\/a> naszego starego znajomego, Gunnara Morlinga, kt\u00f3ry ju\u017c kiedy\u015b rozpracowywa\u0142 dla nas tajniki formatu pliku Java Flight Recordera. Tym razem do publikacji zainspirowa\u0142a go <a href=\"https:\/\/twitter.com\/pressron\/status\/1529194463242989568\">dyskusja<\/a> mi\u0119dzy Ronem Presslerem (tw\u00f3rc\u0105 Looma), a Timem Foxem z Vert.x, z kt\u00f3rej dowiadujemy si\u0119 o pewnych nieoczywistych cechach implementacji Looma. Ot\u00f3\u017c scheduler Looma nie ma w zasadzie poj\u0119cia o tym, czy metoda jest blokuj\u0105ca czy nie - modyfikacji zosta\u0142 za to poddany model blokowania klasycznego JDK, kt\u00f3ry zosta\u0142 \u201cnauczony\u201d uwalniania w\u0105tku systemu operacyjnego gdy prosi go o to Wirtualny (loomowski) W\u0105tek. Pojawi\u0142y si\u0119 jednak w\u0105tpliwo\u015bci na temat Uczciwo\u015b\u0107 (Fairness) takiego rozwi\u0105zania i ryzyko \u201czag\u0142odzenia\u201d konkretnych w\u0105tk\u00f3w, kt\u00f3re pojawi\u0107 si\u0119 mo\u017ce w wypadku zada\u0144 intensywnie wymagaj\u0105cych nie IO, a CPU. Nie istnieje bowiem mechanizm, kt\u00f3ry pozwoli\u0142by na na wyw\u0142aszczenie takiego d\u0142ugotrwaj\u0105cego zadania opartego na CPU.<\/p>\n","innerContent":["\n<p>Zacznijmy <a href=\"https:\/\/www.morling.dev\/blog\/loom-and-thread-fairness\/\">od publikacji<\/a> naszego starego znajomego, Gunnara Morlinga, kt\u00f3ry ju\u017c kiedy\u015b rozpracowywa\u0142 dla nas tajniki formatu pliku Java Flight Recordera. Tym razem do publikacji zainspirowa\u0142a go <a href=\"https:\/\/twitter.com\/pressron\/status\/1529194463242989568\">dyskusja<\/a> mi\u0119dzy Ronem Presslerem (tw\u00f3rc\u0105 Looma), a Timem Foxem z Vert.x, z kt\u00f3rej dowiadujemy si\u0119 o pewnych nieoczywistych cechach implementacji Looma. Ot\u00f3\u017c scheduler Looma nie ma w zasadzie poj\u0119cia o tym, czy metoda jest blokuj\u0105ca czy nie - modyfikacji zosta\u0142 za to poddany model blokowania klasycznego JDK, kt\u00f3ry zosta\u0142 \u201cnauczony\u201d uwalniania w\u0105tku systemu operacyjnego gdy prosi go o to Wirtualny (loomowski) W\u0105tek. Pojawi\u0142y si\u0119 jednak w\u0105tpliwo\u015bci na temat Uczciwo\u015b\u0107 (Fairness) takiego rozwi\u0105zania i ryzyko \u201czag\u0142odzenia\u201d konkretnych w\u0105tk\u00f3w, kt\u00f3re pojawi\u0107 si\u0119 mo\u017ce w wypadku zada\u0144 intensywnie wymagaj\u0105cych nie IO, a CPU. Nie istnieje bowiem mechanizm, kt\u00f3ry pozwoli\u0142by na na wyw\u0142aszczenie takiego d\u0142ugotrwaj\u0105cego zadania opartego na CPU.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","width":700,"height":483},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889b55381d.png\" alt=\"\" width=\"700\" height=\"483\"\/><figcaption>Czym jest \u201czag\u0142odzenie\u201d? Zapraszam do <a href=\"https:\/\/pl.wikipedia.org\/wiki\/Problem_ucztuj%C4%85cych_filozof%C3%B3w\">problemu ucztuj\u0105cych filozof\u00f3w<\/a>.&nbsp;<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889b55381d.png\" alt=\"\" width=\"700\" height=\"483\"\/><figcaption>Czym jest \u201czag\u0142odzenie\u201d? Zapraszam do <a href=\"https:\/\/pl.wikipedia.org\/wiki\/Problem_ucztuj%C4%85cych_filozof%C3%B3w\">problemu ucztuj\u0105cych filozof\u00f3w<\/a>.&nbsp;<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Gunnar w swojej publikacji prezentuje kilka wykres\u00f3w, kt\u00f3re bardzo klarownie t\u0142umacz\u0105, jak ten problem objawia si\u0119 w praktyce. W uproszczeniu - je\u015bli wystartujemy wi\u0119cej d\u0142ugo\u017cyj\u0105cych w\u0105tk\u00f3w ni\u017c jest dost\u0119pne realnych egzekutor\u00f3w, w wypadku klasycznych Thread\u00f3w wszystkie ko\u0144cz\u0105 si\u0119 mniej wi\u0119cej w tym samym czasie. W Loomie ten rozk\u0142ad b\u0119dzie niejednorodny - cz\u0119\u015b\u0107 w\u0105tk\u00f3w zako\u0144czy si\u0119 szybciej ni\u017c u poprzednika, ale na wiele z nich b\u0119dziemy musieli poczeka\u0107 d\u0142u\u017cej. Ron Pressler przekonuje, \u017ce w praktyce nie b\u0119dzie stanowi\u0142o to wi\u0119kszego problemu, a ju\u017c istnieje te\u017c gotowy kod, kt\u00f3ry ma to rozwi\u0105za\u0107 - jeszcze nie zosta\u0142 po prostu zmergowany. Og\u00f3lnie problem jest rozwi\u0105zywalny - np. programi\u015bci Go jako\u015b sobie z tym poradzili poprzez umo\u017cliwienie \u201cwyw\u0142aszczania\u201d gorutyny d\u0142u\u017cszej ni\u017c 10ms. No i od tego mamy w\u0142a\u015bnie wersj\u0119 Preview \u017ceby tego typu rzeczy wy\u0142apywa\u0107.<\/p>\n","innerContent":["\n<p>Gunnar w swojej publikacji prezentuje kilka wykres\u00f3w, kt\u00f3re bardzo klarownie t\u0142umacz\u0105, jak ten problem objawia si\u0119 w praktyce. W uproszczeniu - je\u015bli wystartujemy wi\u0119cej d\u0142ugo\u017cyj\u0105cych w\u0105tk\u00f3w ni\u017c jest dost\u0119pne realnych egzekutor\u00f3w, w wypadku klasycznych Thread\u00f3w wszystkie ko\u0144cz\u0105 si\u0119 mniej wi\u0119cej w tym samym czasie. W Loomie ten rozk\u0142ad b\u0119dzie niejednorodny - cz\u0119\u015b\u0107 w\u0105tk\u00f3w zako\u0144czy si\u0119 szybciej ni\u017c u poprzednika, ale na wiele z nich b\u0119dziemy musieli poczeka\u0107 d\u0142u\u017cej. Ron Pressler przekonuje, \u017ce w praktyce nie b\u0119dzie stanowi\u0142o to wi\u0119kszego problemu, a ju\u017c istnieje te\u017c gotowy kod, kt\u00f3ry ma to rozwi\u0105za\u0107 - jeszcze nie zosta\u0142 po prostu zmergowany. Og\u00f3lnie problem jest rozwi\u0105zywalny - np. programi\u015bci Go jako\u015b sobie z tym poradzili poprzez umo\u017cliwienie \u201cwyw\u0142aszczania\u201d gorutyny d\u0142u\u017cszej ni\u017c 10ms. No i od tego mamy w\u0142a\u015bnie wersj\u0119 Preview \u017ceby tego typu rzeczy wy\u0142apywa\u0107.<\/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\/2022\/06\/img_62a889b5e72b7.png\" alt=\"\"\/><figcaption>Nie ka\u017cdy ma tak\u0105 strategi\u0119 jak kiedy\u015b Google.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889b5e72b7.png\" alt=\"\"\/><figcaption>Nie ka\u017cdy ma tak\u0105 strategi\u0119 jak kiedy\u015b Google.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Opr\u00f3cz ogranicze\u0144 (czy raczej braki ogranicze\u0144?) zwi\u0105zanych z procesorem, powinny si\u0119 te\u017c pojawia\u0107 te z u\u017cyciem pami\u0119ci. W ko\u0144cu ka\u017cdy w\u0105tek jest zasobem, kt\u00f3ry wymaga (nawet je\u015bli minimalnych) resourc\u00f3w systemowych. Eksperymenty Heinza M. Kabutza z periodyku JavaSpecialist pokazuj\u0105 jednak, \u017ce limity mog\u0105 by\u0107 o wiele dalej ni\u017c na zdrowy rozum powinny si\u0119 znajdowa\u0107. W jego ma\u0142ym eksperymencie, \u201cfizyczny\u201d limit (bior\u0105c pod uwag\u0119 u\u017cycie pami\u0119ci) ilo\u015bci stworzonych wirtualnych w\u0105tk\u00f3w powinien wynosi\u0107 oko\u0142o 8 milion\u00f3w - jego snippet (kt\u00f3rego znajdziecie pod linkiem <a href=\"https:\/\/www.javaspecialists.eu\/archive\/Issue301-Gazillion-Virtual-Threads.html\">Gazillion Virtual Threads<\/a>) by\u0142 w stanie wykr\u0119ci\u0107 36 miliard\u00f3w! Jak to mo\u017cliwe? Ot\u00f3\u017c okazuje si\u0119, \u017ce parkowane (zatrzymane) w\u0105tki nie zajmuj\u0105 w zasadzie pami\u0119ci i mo\u017cna ich tworzy\u0107 ile fabryka da\u0142a. Wad\u0105 jest to, \u017ce mog\u0105 by\u0107 w zasadzie w dowolnym momencie \u015bci\u0105gni\u0119te przez GC.&nbsp;<\/p>\n","innerContent":["\n<p>Opr\u00f3cz ogranicze\u0144 (czy raczej braki ogranicze\u0144?) zwi\u0105zanych z procesorem, powinny si\u0119 te\u017c pojawia\u0107 te z u\u017cyciem pami\u0119ci. W ko\u0144cu ka\u017cdy w\u0105tek jest zasobem, kt\u00f3ry wymaga (nawet je\u015bli minimalnych) resourc\u00f3w systemowych. Eksperymenty Heinza M. Kabutza z periodyku JavaSpecialist pokazuj\u0105 jednak, \u017ce limity mog\u0105 by\u0107 o wiele dalej ni\u017c na zdrowy rozum powinny si\u0119 znajdowa\u0107. W jego ma\u0142ym eksperymencie, \u201cfizyczny\u201d limit (bior\u0105c pod uwag\u0119 u\u017cycie pami\u0119ci) ilo\u015bci stworzonych wirtualnych w\u0105tk\u00f3w powinien wynosi\u0107 oko\u0142o 8 milion\u00f3w - jego snippet (kt\u00f3rego znajdziecie pod linkiem <a href=\"https:\/\/www.javaspecialists.eu\/archive\/Issue301-Gazillion-Virtual-Threads.html\">Gazillion Virtual Threads<\/a>) by\u0142 w stanie wykr\u0119ci\u0107 36 miliard\u00f3w! Jak to mo\u017cliwe? Ot\u00f3\u017c okazuje si\u0119, \u017ce parkowane (zatrzymane) w\u0105tki nie zajmuj\u0105 w zasadzie pami\u0119ci i mo\u017cna ich tworzy\u0107 ile fabryka da\u0142a. Wad\u0105 jest to, \u017ce mog\u0105 by\u0107 w zasadzie w dowolnym momencie \u015bci\u0105gni\u0119te przez GC.&nbsp;<\/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\/2022\/06\/img_62a889b718e12.gif\" alt=\"\"\/><figcaption>Ale da si\u0119? Da si\u0119.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889b718e12.gif\" alt=\"\"\/><figcaption>Ale da si\u0119? Da si\u0119.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Kontynuuj\u0105c temat Looma, poza tworzeniem kosmicznej ilo\u015bci zasob\u00f3w spo\u0142eczno\u015b\u0107 ju\u017c zaczyna wynajdowa\u0107 nowe sposoby na u\u017cycie tej technologii, niekt\u00f3re bardzo kreatywne. Fanatycy system\u00f3w rozproszonych z pewno\u015bci\u0105 kojarz\u0105 Jepsena - narz\u0119dzie do weryfikacje zapewnie\u0144 tw\u00f3rc\u00f3w baz i system\u00f3w co do ich sp\u00f3jno\u015bci (takiej w rozumieniu \u201cconsistency\u201d w CAP Theorem - bo to wcale nie jest takie oczywiste). Z artyku\u0142u Jamesa Bakera (kt\u00f3ry pracuje jako Engineering Group Lead w Palantir Technologies) dowiecie si\u0119 nie tylko jak dzia\u0142a Jepsen (a tak\u017ce rykoszetem FoundationDB - naprawd\u0119 fascynuj\u0105ca sprawa), ale r\u00f3wnie\u017c dlaczego Loom mo\u017ce by\u0107 bardzo dobrym narz\u0119dziem dla ka\u017cdego, kto potrzebuje zasymulowa\u0107 dziwne przypadki brzegowe je\u015bli chodzi o kolejno\u015b\u0107 zapis\u00f3w i odczyt\u00f3w. Okazuje si\u0119, \u017ce kontrola przep\u0142ywu, kt\u00f3r\u0105 dostajemy wraz z now\u0105 zabawk\u0105 na JVMie jest na tyle deterministyczna, \u017ce mo\u017cna j\u0105 u\u017cywa\u0107 r\u00f3wnie\u017c w tym kontek\u015bcie. <a href=\"https:\/\/jbaker.io\/2022\/05\/09\/project-loom-for-distributed-systems\/\">Using Java's Project Loom to build more reliable distributed systems<\/a> to kawa\u0142 mocno krwistego mi\u0119cha dla ka\u017cdego, kto wie czym jest Paxos czy zegary logiczne.<\/p>\n","innerContent":["\n<p>Kontynuuj\u0105c temat Looma, poza tworzeniem kosmicznej ilo\u015bci zasob\u00f3w spo\u0142eczno\u015b\u0107 ju\u017c zaczyna wynajdowa\u0107 nowe sposoby na u\u017cycie tej technologii, niekt\u00f3re bardzo kreatywne. Fanatycy system\u00f3w rozproszonych z pewno\u015bci\u0105 kojarz\u0105 Jepsena - narz\u0119dzie do weryfikacje zapewnie\u0144 tw\u00f3rc\u00f3w baz i system\u00f3w co do ich sp\u00f3jno\u015bci (takiej w rozumieniu \u201cconsistency\u201d w CAP Theorem - bo to wcale nie jest takie oczywiste). Z artyku\u0142u Jamesa Bakera (kt\u00f3ry pracuje jako Engineering Group Lead w Palantir Technologies) dowiecie si\u0119 nie tylko jak dzia\u0142a Jepsen (a tak\u017ce rykoszetem FoundationDB - naprawd\u0119 fascynuj\u0105ca sprawa), ale r\u00f3wnie\u017c dlaczego Loom mo\u017ce by\u0107 bardzo dobrym narz\u0119dziem dla ka\u017cdego, kto potrzebuje zasymulowa\u0107 dziwne przypadki brzegowe je\u015bli chodzi o kolejno\u015b\u0107 zapis\u00f3w i odczyt\u00f3w. Okazuje si\u0119, \u017ce kontrola przep\u0142ywu, kt\u00f3r\u0105 dostajemy wraz z now\u0105 zabawk\u0105 na JVMie jest na tyle deterministyczna, \u017ce mo\u017cna j\u0105 u\u017cywa\u0107 r\u00f3wnie\u017c w tym kontek\u015bcie. <a href=\"https:\/\/jbaker.io\/2022\/05\/09\/project-loom-for-distributed-systems\/\">Using Java's Project Loom to build more reliable distributed systems<\/a> to kawa\u0142 mocno krwistego mi\u0119cha dla ka\u017cdego, kto wie czym jest Paxos czy zegary logiczne.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Na zako\u0144czenie, skoro ju\u017c jeste\u015bmy w temacie tekst\u00f3w na temat Looma, to pozwol\u0119 sobie przypomnie\u0107 o klasycznym (no bo sierpie\u0144 2020 to ju\u017c chyba klasyk) artykule <a href=\"https:\/\/inside.java\/2020\/08\/07\/loom-performance\/\">On the performance of user-mode threads and coroutines<\/a> autorstwa Rona Presslera. Dla os\u00f3b niezaznajomionych z tematem jest on bowiem (ca\u0142kiem przyst\u0119pn\u0105, mimo sporej ilo\u015bci wzor\u00f3w) podstaw\u0105 do dyskusji na temat wydajno\u015bci Looma.<\/p>\n","innerContent":["\n<p>Na zako\u0144czenie, skoro ju\u017c jeste\u015bmy w temacie tekst\u00f3w na temat Looma, to pozwol\u0119 sobie przypomnie\u0107 o klasycznym (no bo sierpie\u0144 2020 to ju\u017c chyba klasyk) artykule <a href=\"https:\/\/inside.java\/2020\/08\/07\/loom-performance\/\">On the performance of user-mode threads and coroutines<\/a> autorstwa Rona Presslera. Dla os\u00f3b niezaznajomionych z tematem jest on bowiem (ca\u0142kiem przyst\u0119pn\u0105, mimo sporej ilo\u015bci wzor\u00f3w) podstaw\u0105 do dyskusji na temat wydajno\u015bci Looma.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A, i Structured Concurrency jednak pojawi si\u0119 w inkubacji w JDK 19. To wydanie zapowiada si\u0119 jeszcze ciekawiej ni\u017c ostatnio.<\/p>\n","innerContent":["\n<p>A, i Structured Concurrency jednak pojawi si\u0119 w inkubacji w JDK 19. To wydanie zapowiada si\u0119 jeszcze ciekawiej ni\u017c ostatnio.<\/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\/2022\/06\/img_62a889b826a5c.png\" alt=\"\"\/><figcaption>Aczkolwiek zaczynam mie\u0107 powoli obawy, czy doczekamy si\u0119 tam jakiegokolwiek stabilnego feature \ud83d\ude09<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889b826a5c.png\" alt=\"\"\/><figcaption>Aczkolwiek zaczynam mie\u0107 powoli obawy, czy doczekamy si\u0119 tam jakiegokolwiek stabilnego feature \ud83d\ude09<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>\u0179r\u00f3d\u0142a<\/h3>\n","innerContent":["\n<h3>\u0179r\u00f3d\u0142a<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[],"innerHTML":"\n<ul><li><a href=\"https:\/\/www.morling.dev\/blog\/loom-and-thread-fairness\/\">Loom and Thread Fairness - Gunnar Morling<\/a><\/li><li><a href=\"https:\/\/pl.wikipedia.org\/wiki\/Problem_ucztuj%C4%85cych_filozof%C3%B3w\">Problem ucztuj\u0105cych filozof\u00f3w \u2013 Wikipedia, wolna encyklopedia<\/a><\/li><li><a href=\"https:\/\/www.javaspecialists.eu\/archive\/Issue301-Gazillion-Virtual-Threads.html\">[JavaSpecialists 301] - Gazillion Virtual Threads<\/a><\/li><li><a href=\"https:\/\/jbaker.io\/2022\/05\/09\/project-loom-for-distributed-systems\/\">Using Java's Project Loom to build more reliable distributed systems \u00b7 James Baker<\/a><\/li><li><a href=\"https:\/\/inside.java\/2020\/08\/07\/loom-performance\/\">On the performance of user-mode threads and coroutines \u2013 Inside.java<\/a><\/li><\/ul>\n","innerContent":["\n<ul><li><a href=\"https:\/\/www.morling.dev\/blog\/loom-and-thread-fairness\/\">Loom and Thread Fairness - Gunnar Morling<\/a><\/li><li><a href=\"https:\/\/pl.wikipedia.org\/wiki\/Problem_ucztuj%C4%85cych_filozof%C3%B3w\">Problem ucztuj\u0105cych filozof\u00f3w \u2013 Wikipedia, wolna encyklopedia<\/a><\/li><li><a href=\"https:\/\/www.javaspecialists.eu\/archive\/Issue301-Gazillion-Virtual-Threads.html\">[JavaSpecialists 301] - Gazillion Virtual Threads<\/a><\/li><li><a href=\"https:\/\/jbaker.io\/2022\/05\/09\/project-loom-for-distributed-systems\/\">Using Java's Project Loom to build more reliable distributed systems \u00b7 James Baker<\/a><\/li><li><a href=\"https:\/\/inside.java\/2020\/08\/07\/loom-performance\/\">On the performance of user-mode threads and coroutines \u2013 Inside.java<\/a><\/li><\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>2. Alternatywa dla Finalizer\u00f3w - JDK 9 i Cleaners<\/h2>\n","innerContent":["\n<h2>2. Alternatywa dla Finalizer\u00f3w - JDK 9 i Cleaners<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>No, ale Loom to akurat przysz\u0142o\u015b\u0107 JVM. Wiecie co jest jego przesz\u0142o\u015bci\u0105? Finalizery. I Oracle stara\u0142 si\u0119 to nam usilnie uzmys\u0142owi\u0107 w ostatnim tygodniu, publikuj\u0105c dwa teksty dotycz\u0105ce ich alternatywy, czyli Cleaner\u00f3w.<\/p>\n","innerContent":["\n<p>No, ale Loom to akurat przysz\u0142o\u015b\u0107 JVM. Wiecie co jest jego przesz\u0142o\u015bci\u0105? Finalizery. I Oracle stara\u0142 si\u0119 to nam usilnie uzmys\u0142owi\u0107 w ostatnim tygodniu, publikuj\u0105c dwa teksty dotycz\u0105ce ich alternatywy, czyli Cleaner\u00f3w.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Czym s\u0105 finalizery? Pewnie wi\u0119kszo\u015b\u0107 z naszych czytelnik\u00f3w zdaje sobie spraw\u0119, ale dla wyr\u00f3wnania poziomu - m\u00f3wimy tutaj o specjalnych blokach kodu w ramach obiektu, kt\u00f3re odpalaj\u0105 si\u0119 wraz z czyszczeniem przez Garbage Collector obiekt\u00f3w. Pozwala\u0142y min. na czyszczenie otwartych powi\u0105za\u0144 do plik\u00f3w czy po\u0142\u0105cze\u0144 do bazy - og\u00f3lnie rzeczy znajduj\u0105cych si\u0119 poza obszarem JVM. Brzmi dobrze w teorii, ale finalizery przez lata wypracowa\u0142y sobie (zas\u0142u\u017cenie) funkcjonalno\u015bci, kt\u00f3rej ci\u0119\u017cko zaufa\u0107, gdy\u017c w wielu przypadkach po prostu\u2026 nie dzia\u0142a\u0142y. To, a tak\u017ce poziom skomplikowania zwi\u0105zany z ich implementacj\u0105 (co pewnie w jaki\u015b spos\u00f3b si\u0119 \u0142\u0105czy) sprawi\u0142y, \u017ce tw\u00f3rcy JDK postanowili ostatecznie si\u0119 ich pozby\u0107, wi\u0119c w JDK 18 doczeka\u0142y si\u0119 deprekacji w ramach <a href=\"http:\/\/openjdk.java.net\/jeps\/421\">JEP 421: Deprecate Finalization for Removal<\/a>. Nie ma nad czym p\u0142aka\u0107, gdy\u017c przez lata JVM doczeka\u0142 si\u0119 wielu alternatywnych, bardziej wyspecjalizowanych rozwi\u0105za\u0144, jak try-with-resources czy w\u0142a\u015bnie Cleanery.<\/p>\n","innerContent":["\n<p>Czym s\u0105 finalizery? Pewnie wi\u0119kszo\u015b\u0107 z naszych czytelnik\u00f3w zdaje sobie spraw\u0119, ale dla wyr\u00f3wnania poziomu - m\u00f3wimy tutaj o specjalnych blokach kodu w ramach obiektu, kt\u00f3re odpalaj\u0105 si\u0119 wraz z czyszczeniem przez Garbage Collector obiekt\u00f3w. Pozwala\u0142y min. na czyszczenie otwartych powi\u0105za\u0144 do plik\u00f3w czy po\u0142\u0105cze\u0144 do bazy - og\u00f3lnie rzeczy znajduj\u0105cych si\u0119 poza obszarem JVM. Brzmi dobrze w teorii, ale finalizery przez lata wypracowa\u0142y sobie (zas\u0142u\u017cenie) funkcjonalno\u015bci, kt\u00f3rej ci\u0119\u017cko zaufa\u0107, gdy\u017c w wielu przypadkach po prostu\u2026 nie dzia\u0142a\u0142y. To, a tak\u017ce poziom skomplikowania zwi\u0105zany z ich implementacj\u0105 (co pewnie w jaki\u015b spos\u00f3b si\u0119 \u0142\u0105czy) sprawi\u0142y, \u017ce tw\u00f3rcy JDK postanowili ostatecznie si\u0119 ich pozby\u0107, wi\u0119c w JDK 18 doczeka\u0142y si\u0119 deprekacji w ramach <a href=\"http:\/\/openjdk.java.net\/jeps\/421\">JEP 421: Deprecate Finalization for Removal<\/a>. Nie ma nad czym p\u0142aka\u0107, gdy\u017c przez lata JVM doczeka\u0142 si\u0119 wielu alternatywnych, bardziej wyspecjalizowanych rozwi\u0105za\u0144, jak try-with-resources czy w\u0142a\u015bnie Cleanery.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Cleanery pojawi\u0142y si\u0119 w JDK 9 i stanowi\u0105 drugie podej\u015bcie do czyszczenia stanu po wyczyszczeniu obiektu przez Garbage Collector. Rozwi\u0105zuj\u0105 jednak powa\u017cny problem, kt\u00f3ry towarzysz\u0105 finalizerom. Ta zdeprecatowana funkcjonalno\u015b\u0107 definiowa\u0142a bowiem zachowanie, kt\u00f3re nale\u017cy uruchomi\u0107 po czyszczeniu jako\u2026 cz\u0119\u015b\u0107 czyszczonego obiektu. Prowadzi\u0142o to do urokliwych wy\u015bcig\u00f3w, czy funkcja czyszcz\u0105ca uruchomi si\u0119, zanim obiekt zostanie ostatecznie usuni\u0119ty przez GC.&nbsp;<\/p>\n","innerContent":["\n<p>Cleanery pojawi\u0142y si\u0119 w JDK 9 i stanowi\u0105 drugie podej\u015bcie do czyszczenia stanu po wyczyszczeniu obiektu przez Garbage Collector. Rozwi\u0105zuj\u0105 jednak powa\u017cny problem, kt\u00f3ry towarzysz\u0105 finalizerom. Ta zdeprecatowana funkcjonalno\u015b\u0107 definiowa\u0142a bowiem zachowanie, kt\u00f3re nale\u017cy uruchomi\u0107 po czyszczeniu jako\u2026 cz\u0119\u015b\u0107 czyszczonego obiektu. Prowadzi\u0142o to do urokliwych wy\u015bcig\u00f3w, czy funkcja czyszcz\u0105ca uruchomi si\u0119, zanim obiekt zostanie ostatecznie usuni\u0119ty przez GC.&nbsp;<\/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\/2022\/06\/img_62a889ba8875b.png\" alt=\"\"\/><figcaption>Po prostu nie mia\u0142a szans.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889ba8875b.png\" alt=\"\"\/><figcaption>Po prostu nie mia\u0142a szans.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Cleanery rozwi\u0105zuj\u0105 ten problem w bardzo sprytny spos\u00f3b - zamiast by\u0107 cz\u0119\u015bci\u0105 obiektu, tworz\u0105 (w formie lambdy) dodatkowy obiekt, rejestrowany r\u00f3wnolegle do czyszczonego przez nie obiektu. Dzi\u0119ki temu nie dochodzi do kuriozalnych race condition.<\/p>\n","innerContent":["\n<p>Cleanery rozwi\u0105zuj\u0105 ten problem w bardzo sprytny spos\u00f3b - zamiast by\u0107 cz\u0119\u015bci\u0105 obiektu, tworz\u0105 (w formie lambdy) dodatkowy obiekt, rejestrowany r\u00f3wnolegle do czyszczonego przez nie obiektu. Dzi\u0119ki temu nie dochodzi do kuriozalnych race condition.<\/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>class Foo {\n  private static final Cleaner cleaner = Cleaner.create();\n  private final char&#91;] data;\n    \n  Foo(char&#91;] chars) {\n    final char&#91;] array = chars.clone();\n    cleaner.register(this, \n          () -&gt; Arrays.fill(array, (char)0));\n    this.data = array;\n  }\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>class Foo {\n  private static final Cleaner cleaner = Cleaner.create();\n  private final char&#91;] data;\n    \n  Foo(char&#91;] chars) {\n    final char&#91;] array = chars.clone();\n    cleaner.register(this, \n          () -&gt; Arrays.fill(array, (char)0));\n    this.data = array;\n  }\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u017celi chcecie dowiedzie\u0107 si\u0119 wi\u0119cej, oficjalny blog inside.java republikowa\u0142 u siebie dwie \u015bwietne publikacje, b\u0119d\u0105ce bardzo dobrym opracowaniem tematu: <a href=\"https:\/\/inside.java\/2022\/05\/25\/clean-cleaner\/\">Replacing finalizers with cleaners<\/a> oraz <a href=\"https:\/\/inside.java\/2022\/05\/27\/testing-clean-cleaner-cleanup\/\">Testing clean cleaner cleanup<\/a> opublikowane oryginalnie na blogu <a href=\"https:\/\/inside.java\/2022\/05\/27\/testing-clean-cleaner-cleanup\/\">Musing on Java Core Libraries<\/a>. W nich znajdziecie wi\u0119cej szczeg\u00f3\u0142\u00f3w, a tak\u017ce przyk\u0142ad\u00f3w do czego mo\u017cna u\u017cy\u0107 cleaner\u00f3w, je\u015bli jeszcze nie macie pomys\u0142\u00f3w na eksploracj\u0119 tej funkcjonalno\u015bci.&nbsp;<\/p>\n","innerContent":["\n<p>Je\u017celi chcecie dowiedzie\u0107 si\u0119 wi\u0119cej, oficjalny blog inside.java republikowa\u0142 u siebie dwie \u015bwietne publikacje, b\u0119d\u0105ce bardzo dobrym opracowaniem tematu: <a href=\"https:\/\/inside.java\/2022\/05\/25\/clean-cleaner\/\">Replacing finalizers with cleaners<\/a> oraz <a href=\"https:\/\/inside.java\/2022\/05\/27\/testing-clean-cleaner-cleanup\/\">Testing clean cleaner cleanup<\/a> opublikowane oryginalnie na blogu <a href=\"https:\/\/inside.java\/2022\/05\/27\/testing-clean-cleaner-cleanup\/\">Musing on Java Core Libraries<\/a>. W nich znajdziecie wi\u0119cej szczeg\u00f3\u0142\u00f3w, a tak\u017ce przyk\u0142ad\u00f3w do czego mo\u017cna u\u017cy\u0107 cleaner\u00f3w, je\u015bli jeszcze nie macie pomys\u0142\u00f3w na eksploracj\u0119 tej funkcjonalno\u015bci.&nbsp;<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>\u0179r\u00f3d\u0142a<\/p>\n","innerContent":["\n<p>\u0179r\u00f3d\u0142a<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[],"innerHTML":"\n<ul><li><a href=\"https:\/\/inside.java\/2022\/05\/25\/clean-cleaner\/\">Replacing finalizers with cleaners<\/a><\/li><li><a href=\"https:\/\/inside.java\/2022\/05\/27\/testing-clean-cleaner-cleanup\/\">Testing clean cleaner cleanup<\/a><\/li><\/ul>\n","innerContent":["\n<ul><li><a href=\"https:\/\/inside.java\/2022\/05\/25\/clean-cleaner\/\">Replacing finalizers with cleaners<\/a><\/li><li><a href=\"https:\/\/inside.java\/2022\/05\/27\/testing-clean-cleaner-cleanup\/\">Testing clean cleaner cleanup<\/a><\/li><\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>3. Release Radar: Micronaut 3.5<\/h2>\n","innerContent":["\n<h2>3. Release Radar: Micronaut 3.5<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nowy tydzie\u0144, nowy Radar. Do\u015b\u0107 skromny, poniewa\u017c tylko z jednym wydaniem, i te\u017c nie jako\u015b mocno wybijaj\u0105cym si\u0119, ale dla porz\u0105dku stwierdzi\u0142em, \u017ce warto nim zako\u0144czy\u0107 tego tygodniowy przegl\u0105d.<\/p>\n","innerContent":["\n<p>Nowy tydzie\u0144, nowy Radar. Do\u015b\u0107 skromny, poniewa\u017c tylko z jednym wydaniem, i te\u017c nie jako\u015b mocno wybijaj\u0105cym si\u0119, ale dla porz\u0105dku stwierdzi\u0142em, \u017ce warto nim zako\u0144czy\u0107 tego tygodniowy przegl\u0105d.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ot\u00f3\u017c w zesz\u0142ym tygodniu swoj\u0105 premier\u0105 mia\u0142 nowy <a href=\"https:\/\/micronaut.io\/2022\/05\/26\/micronaut-framework-3-5-0\/\">Micronaut 3.5<\/a>. Poza podbiciem zale\u017cno\u015bci i kompatybilno\u015bci (min. z nowym GraalVM) przynosi on w zasadzie trzy nowe du\u017ce dodatki dla programist\u00f3w. Posiadaczy du\u017cych projekt\u00f3w w Micronaucie (co samo w sobie wydaje mi si\u0119 by\u0107 ciekawym konceptem, cho\u0107 i te mniejsze powinny skorzysta\u0107) ucieszy z pewno\u015bci\u0105 wprowadzenie inkrementalnej kompilacji dla build\u00f3w Gradle, co powinno skr\u00f3ci\u0107 czas budowania i da\u0107 lepszy developer experience. Mniej os\u00f3b zainteresuje pewnie wsparcie dla Turbo - w Micronaut Views. Jak pisz\u0105 sami tw\u00f3rcy:<br><br>Turbo to zbi\u00f3r technik umo\u017cliwiaj\u0105cych tworzenie szybkich, stopniowo ulepszonych aplikacji internetowych bez u\u017cycia du\u017cej ilo\u015bci JavaScriptu. Ca\u0142a logika jest przechowywana na serwerze, a przegl\u0105darka zajmuje si\u0119 tylko ko\u0144cowym kodem HTML.<\/p>\n","innerContent":["\n<p>Ot\u00f3\u017c w zesz\u0142ym tygodniu swoj\u0105 premier\u0105 mia\u0142 nowy <a href=\"https:\/\/micronaut.io\/2022\/05\/26\/micronaut-framework-3-5-0\/\">Micronaut 3.5<\/a>. Poza podbiciem zale\u017cno\u015bci i kompatybilno\u015bci (min. z nowym GraalVM) przynosi on w zasadzie trzy nowe du\u017ce dodatki dla programist\u00f3w. Posiadaczy du\u017cych projekt\u00f3w w Micronaucie (co samo w sobie wydaje mi si\u0119 by\u0107 ciekawym konceptem, cho\u0107 i te mniejsze powinny skorzysta\u0107) ucieszy z pewno\u015bci\u0105 wprowadzenie inkrementalnej kompilacji dla build\u00f3w Gradle, co powinno skr\u00f3ci\u0107 czas budowania i da\u0107 lepszy developer experience. Mniej os\u00f3b zainteresuje pewnie wsparcie dla Turbo - w Micronaut Views. Jak pisz\u0105 sami tw\u00f3rcy:<br><br>Turbo to zbi\u00f3r technik umo\u017cliwiaj\u0105cych tworzenie szybkich, stopniowo ulepszonych aplikacji internetowych bez u\u017cycia du\u017cej ilo\u015bci JavaScriptu. Ca\u0142a logika jest przechowywana na serwerze, a przegl\u0105darka zajmuje si\u0119 tylko ko\u0144cowym kodem HTML.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wychodz\u0105c poza bana\u0142, Turbo ma kilka interesuj\u0105cych as\u00f3w w r\u0119kawie, jak cho\u0107by \u201cpchanie\u201d HTMLa do przegl\u0105darki za pomoc\u0105 WebSocket\u00f3w. Je\u015bli mierzi Was tworzenie SPA, Turbo mo\u017ce by\u0107 interesuj\u0105c\u0105 alternatyw\u0105. Za ca\u0142o\u015bci\u0105 stoj\u0105 ludzie tworz\u0105cy wcze\u015bniej Ruby on Rails, a ten framework przez lata uchodzi\u0142 za szczyt programistycznej produktywno\u015bci.&nbsp;<\/p>\n","innerContent":["\n<p>Wychodz\u0105c poza bana\u0142, Turbo ma kilka interesuj\u0105cych as\u00f3w w r\u0119kawie, jak cho\u0107by \u201cpchanie\u201d HTMLa do przegl\u0105darki za pomoc\u0105 WebSocket\u00f3w. Je\u015bli mierzi Was tworzenie SPA, Turbo mo\u017ce by\u0107 interesuj\u0105c\u0105 alternatyw\u0105. Za ca\u0142o\u015bci\u0105 stoj\u0105 ludzie tworz\u0105cy wcze\u015bniej Ruby on Rails, a ten framework przez lata uchodzi\u0142 za szczyt programistycznej produktywno\u015bci.&nbsp;<\/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\/2022\/06\/img_62a889bb5d97f.png\" alt=\"\"\/><figcaption>Mimo \u017ce najlepsze czasy \u015bwietno\u015bci Ruby\u2019ego mamy za sob\u0105 - pami\u0119tamy!<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a889bb5d97f.png\" alt=\"\"\/><figcaption>Mimo \u017ce najlepsze czasy \u015bwietno\u015bci Ruby\u2019ego mamy za sob\u0105 - pami\u0119tamy!<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ostatnim z du\u017cych dodatk\u00f3w jest nowy modu\u0142, Micronaut <a href=\"https:\/\/microstream.one\/\">MicroStream<\/a>. MicroStream to swoista \u201cserializacja na sterydach\u201d, silnik persystencji do przechowywania obiekt\u00f3w Javowych w wielu r\u00f3\u017cnych formatach i storage, takich jak cho\u0107by S3 czy MongoDB. Oryginalnie cz\u0119\u015b\u0107 innego frameworka, Helidona, doczeka\u0142a si\u0119 teraz integracji z Micronautem<\/p>\n","innerContent":["\n<p>Ostatnim z du\u017cych dodatk\u00f3w jest nowy modu\u0142, Micronaut <a href=\"https:\/\/microstream.one\/\">MicroStream<\/a>. MicroStream to swoista \u201cserializacja na sterydach\u201d, silnik persystencji do przechowywania obiekt\u00f3w Javowych w wielu r\u00f3\u017cnych formatach i storage, takich jak cho\u0107by S3 czy MongoDB. Oryginalnie cz\u0119\u015b\u0107 innego frameworka, Helidona, doczeka\u0142a si\u0119 teraz integracji z Micronautem<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ma\u0142y bonusik: Spring.io opubklikowa\u0142 te\u017c w zesz\u0142ym tygodniu tekst <a href=\"https:\/\/spring.io\/blog\/2022\/05\/24\/preparing-for-spring-boot-3-0\">Preparing for Spring Boot 3.0<\/a>. W nim znajdziecie kroki, kt\u00f3re warto wykona\u0107 przed szykowan\u0105 na jesie\u0144 du\u017c\u0105 premier\u0105 du\u017cej wersji. Poza oczywisto\u015bciami pokroju upgrade do Javy 17 i sprawdzenia czy projekt dzia\u0142a, jest tam troch\u0119 mniej oczywistych sugestii. Dlatego ju\u017c dzisiaj sugeruje spojrze\u0107, mo\u017ce czas ju\u017c powoli szykowa\u0107 taski na backlogu?<\/p>\n","innerContent":["\n<p>Ma\u0142y bonusik: Spring.io opubklikowa\u0142 te\u017c w zesz\u0142ym tygodniu tekst <a href=\"https:\/\/spring.io\/blog\/2022\/05\/24\/preparing-for-spring-boot-3-0\">Preparing for Spring Boot 3.0<\/a>. W nim znajdziecie kroki, kt\u00f3re warto wykona\u0107 przed szykowan\u0105 na jesie\u0144 du\u017c\u0105 premier\u0105 du\u017cej wersji. Poza oczywisto\u015bciami pokroju upgrade do Javy 17 i sprawdzenia czy projekt dzia\u0142a, jest tam troch\u0119 mniej oczywistych sugestii. Dlatego ju\u017c dzisiaj sugeruje spojrze\u0107, mo\u017ce czas ju\u017c powoli szykowa\u0107 taski na backlogu?<\/p>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/9963","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=9963"}],"version-history":[{"count":1,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/9963\/revisions"}],"predecessor-version":[{"id":10489,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/9963\/revisions\/10489"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/8121"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=9963"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=9963"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=9963"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}