{"id":17664,"date":"2024-02-15T00:22:19","date_gmt":"2024-02-14T23:22:19","guid":{"rendered":"https:\/\/vived.io\/?p=17664"},"modified":"2024-02-15T06:42:25","modified_gmt":"2024-02-15T05:42:25","slug":"co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/","title":{"rendered":"Co nowego w Performance JDK? Project Skogsluft, FFM vs Unsafe, Benchmark JIT-\u00f3w &#8211; JVM Weekly vol. 163"},"content":{"rendered":"\n<h2 id=\"1-project-skogsluft-obiecuje-duze-zmiany-w-java-flight-recorder\" data-num=1>1. Project Skogsluft obiecuje du\u017ce zmiany w Java Flight Recorder<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"585\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-2-1024x585.png\" alt=\"\" class=\"wp-image-17666\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-2-1024x585.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-2-300x171.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-2-768x439.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-2-1536x878.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-2.png 1792w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Wraz z rych\u0142ym pojawieniem si\u0119 Foreign Function and Memory API, kt\u00f3re ju\u017c w marcu w stabilnej wersji trafi\u0105 do JDK 22, ju\u017c nied\u0142ugo okaza\u0107 si\u0119 mo\u017ce \u017ce coraz popularniejsze stanie si\u0119 u\u017cywanie wi\u0119kszej ilo\u015bci &#8222;natywnego&#8221; kodu. Temat staje si\u0119 coraz popularniejszy, przewija si\u0119 w r\u00f3\u017cnych wariantach w zasadzie ka\u017cdej kolejnej edycji tego przegl\u0105du (a nawet dzisiaj jeszcze do niego wr\u00f3cimy troch\u0119 p\u00f3\u017aniej), dlatego niezb\u0119dne jest r\u00f3wnie\u017c dopasowanie ca\u0142ej javowej &#8222;narz\u0119dziowki&#8221;, aby ta gotowa by\u0142a na ten spodziewany wzrost u\u017cycia. Dlatego te\u017c nie powinno dziwi\u0107, \u017ce pojawi\u0142a si\u0119 propozycja nowego projektu, kt\u00f3rego celem b\u0119dzie badanie wydajno\u015bci aplikacji.<\/p>\n\n\n\n<p><a href=\"https:\/\/mail.openjdk.org\/pipermail\/discuss\/2024-February\/006330.html\">Projekt &#8222;Skogsluft&#8221;<\/a>, zaproponowany przez Jaroslava Bachor\u00edka z DataDog, ma na celu znacz\u0105ce wzmocnienie mo\u017cliwo\u015bci profilowania Javy w ramach Java Flight Recorder (JFR) poprzez wprowadzenie zaawansowanych funkcji, kt\u00f3re zniweluj\u0105 r\u00f3\u017cnice mi\u0119dzy profilowaniem wykonania kodu Java i kodu natywnego. Skogsluft koncentrowa\u0107 ma si\u0119 na trzech g\u0142\u00f3wnych usprawnieniach: zintegrowany mechanizmie przechodzenia po stosie r\u00f3wnie\u017c dla kodu natywnego, elastycznym harmonogramie pr\u00f3bkowania CPU dostosowanym do mo\u017cliwo\u015bci r\u00f3\u017cnych system\u00f3w operacyjnych oraz rozszerzonym wsparciu dla labelowania w\u0105tk\u00f3w w JFR. Maj\u0105 one na celu dostarczenie programistom bardziej elastycznych opcji profilowania oraz bogatszego kontekstu dla analizy.<\/p>\n\n\n\n<p>Teraz projekt poszukuje wsparcia ze strony tw\u00f3rc\u00f3w OpenJDK. Proponowany rozw\u00f3j projektu ma odbywa\u0107 si\u0119 w oddzielnym forku (od wersji JDK 23) z zamiarem stopniowego wdra\u017cania nowych funkcji w serii JEP.<\/p>\n\n\n\n<p>Sk\u0105d nazwa &#8222;Skogsluft&#8221;? Pochodzi z norweskiego, w kt\u00f3rym &#8222;skog&#8221; oznacza &#8222;las&#8221;, a &#8222;luft&#8221; oznacza &#8222;powietrze&#8221;. Dos\u0142ownie przet\u0142umaczone, &#8222;Skogsluft&#8221; oznacza &#8222;powietrze le\u015bne&#8221; lub &#8222;powiew lasu&#8221;. My\u015bl\u0119, \u017ce to ca\u0142kiem dobra nazwa, bior\u0105c pod uwag\u0119 powiew \u015bwie\u017co\u015bci, kt\u00f3re projekt mo\u017ce wprowadzi\u0107 do profilowania w JFR, cho\u0107 pracowa\u0142em kiedy\u015b dla norweskiej firmy i ze zwrotami z ichniejszego j\u0119zyka to nigdy nie wiadomo.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"800\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-3.png\" alt=\"\" class=\"wp-image-17669\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-3.png 700w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-3-263x300.png 263w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><figcaption class=\"wp-element-caption\">Pozdrawiam czytelnik\u00f3w z Norwegii &#8211; widz\u0119 wszystko, wiem \u017ce zaskakuj\u0105co sporo Was jest <\/figcaption><\/figure><\/div>\n\n\n<p>A jak ju\u017c przy JFR, to podrzuc\u0119 Wam jeszcze tekst <a href=\"https:\/\/piotrminkowski.com\/2024\/02\/13\/java-flight-recorder-on-kubernetes\/\">Java Flight Recorder na Kubernetes<\/a>. Artyku\u0142 Piotra Minkowskiego dostarcza kompleksowego przewodnika na temat u\u017cycia Java Flight Recorder (JFR) na Kubernetes przy pomocy Cryostat do ci\u0105g\u0142ego monitorowania aplikacji Java. Cryostat to narz\u0119dzie umo\u017cliwiaj\u0105ce zdalne zarz\u0105dzanie nagraniami Java Flight Recorder dla aplikacji dzia\u0142aj\u0105cych w kontenerach, u\u0142atwiaj\u0105ce monitorowanie i diagnozowanie wydajno\u015bci aplikacji. Wyja\u015bnia pe\u0142en proces od instalacji Cryostat za pomoc\u0105 operatora (komponentu w Kubernetes, kt\u00f3ry automatyzuje wdra\u017canie, skalowanie i zarz\u0105dzanie aplikacjami i us\u0142ugami, u\u0142atwiaj\u0105c zarz\u0105dzanie z\u0142o\u017conymi, stanowymi aplikacjami) lub wykresu Helm, po utworzenie przyk\u0142adowej aplikacji Spring Bootowej generuj\u0105cej niestandardowe zdarzenia JFR. Post t\u0142umaczy te\u017c, jak zarz\u0105dza\u0107 niestandardowymi szablonami zdarze\u0144 i analizowa\u0107 dane za pomoc\u0105 JDK Mission Control.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"666\" height=\"374\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-4.png\" alt=\"\" class=\"wp-image-17672\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-4.png 666w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-4-300x168.png 300w\" sizes=\"auto, (max-width: 666px) 100vw, 666px\" \/><figcaption class=\"wp-element-caption\">A od siebie zdecydowanie polecam u\u017cywanie kubernetesowych operator\u00f3w.<\/figcaption><\/figure><\/div>\n\n\n<p>I ostatnia wrzutka &#8211; Gunnar Morling, kt\u00f3ry ostatnio jest znany z opisywanego cho\u0107by i tutaj 1BRC, opublikowa\u0142 kiedy\u015b <a href=\"https:\/\/www.morling.dev\/blog\/jdk-flight-recorder-file-format\/\">specyfikacje nieodokumentowanego do tej pory formatu pliku wynikowego JDK Flight Recorder<\/a>. Ot, takie ma\u0142y crossover, nie mog\u0142em sobie odpu\u015bci\u0107.<\/p>\n\n\n\n<h2 id=\"2-its-benchmarking-time-fma-vs-unsafe\" data-num=2>2. It&#8217;s benchmarking time! FMA vs Unsafe <\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"585\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-6-1024x585.png\" alt=\"\" class=\"wp-image-17682\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-6-1024x585.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-6-300x171.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-6-768x439.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-6-1536x878.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-6.png 1792w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Zaczeli\u015bmy od profilingu, ale to nie koniec temat\u00f3w zwi\u0105zanych z szeroko rozumian\u0105 wydajno\u015bci\u0105. Jak ju\u017c wcze\u015bniej obieca\u0142em, wracamy do tematu Foreign Memory Access API.<\/p>\n\n\n\n<p>W spo\u0142eczno\u015bci Java niedawno du\u017co dyskutowano o nowym JEP, kt\u00f3ry proponuje wycofanie i usuni\u0119cie metod dost\u0119pu i alokacji pami\u0119ci z klasy Unsafe &#8211; sam w poprzedniej edycji komentowa\u0142em, \u017ce w obliczu wynik\u00f3w 1BRC tw\u00f3rcy mog\u0105 mie\u0107 ci\u0119\u017cki orzech do zgryzienia. Unsafe pozwala\u0142o na alokacj\u0119 pami\u0119ci poza modelem pami\u0119ci Java, oferuj\u0105c bardzo szybki dost\u0119p do pami\u0119ci i umo\u017cliwiaj\u0105c operacje, kt\u00f3re w innym przypadku by\u0142yby niemo\u017cliwe w ramach modelu pami\u0119ci Java. Ta funkcjonalno\u015b\u0107 by\u0142a wykorzystywana w wielu bibliotekach wysokiej wydajno\u015bci, takich jak Netty, Spark, Avro, Kryo, kt\u00f3re teraz musz\u0105 znale\u017a\u0107 alternatywy. Jednak Tomer Zeltzer, Senior Software Engineer at Yahoo, w swoim artykule <a href=\"https:\/\/itnext.io\/javas-new-fma-renaissance-or-decay-372a2aee5f32\">Java\u2019s New FMA: Renaissance Or Decay?<\/a> zwraca uwag\u0119, \u017ce pomimo pocz\u0105tkowego szoku, istniej\u0105 alternatywy dla Unsafe, kt\u00f3re mog\u0105 okaza\u0107 si\u0119 obiecuj\u0105ce.<\/p>\n\n\n\n<p>Dokonuje on bowiem benchmarkingu nowego API dost\u0119pu do pami\u0119ci obcej (FMA), opracowanego jako cz\u0119\u015b\u0107 Projektu Panama (JEP-424), kt\u00f3ry ma zast\u0105pi\u0107 Unsafe, oferuj\u0105c bezpieczniejsze i oficjalnie wspierane rozwi\u0105zanie. FMA prezentuje si\u0119 obiecuj\u0105co, oferuj\u0105c por\u00f3wnywaln\u0105 pr\u0119dko\u015b\u0107 odczytu i 42% szybszy zapis na stercie w por\u00f3wnaniu z Unsafe, a tak\u017ce prawie trzykrotnie szybszy dost\u0119p do pami\u0119ci poza stert\u0105. Nowe API wykorzystuje obiekt <code>Arena<\/code> do alokacji pami\u0119ci, a segmenty pami\u0119ci, kt\u00f3re z niej pochodz\u0105, nie mog\u0105 by\u0107 indywidualnie zwalniane, co mo\u017ce u\u0142atwi\u0107 unikanie wyciek\u00f3w pami\u0119ci. Cho\u0107 zwolnienie pami\u0119ci jest mniej granularne ni\u017c w Unsafe, nowe API wydaje si\u0119 zachowa\u0107 te same mo\u017cliwo\u015bci przy jednoczesnym oferowaniu nieco wygodniejszego interfejsu. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"733\" height=\"340\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-5.png\" alt=\"\" class=\"wp-image-17675\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-5.png 733w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-5-300x139.png 300w\" sizes=\"auto, (max-width: 733px) 100vw, 733px\" \/><figcaption class=\"wp-element-caption\">Jak zawsze kiedy mowa o benchmarkingu &#8211; nale\u017cy traktowa\u0107 ca\u0142o\u015b\u0107 z lekk\u0105 doz\u0105 sceptycyzmu.<\/figcaption><\/figure><\/div>\n\n\n<p>Tutaj ma\u0142y disclaimer: oryginalny artyku\u0142 by\u0142 nieco d\u0142u\u017cszy, ale po <a href=\"https:\/\/www.reddit.com\/r\/java\/comments\/1ah8y1u\/javas_new_fma_renaissance_or_decay\/\">dyskusji na Reddicie<\/a> &#8211; w kt\u00f3rej zaanga\u017cowany by\u0142 sam Ron Pressler &#8211; niekt\u00f3re fragmenty zosta\u0142y wyedytowane. Dla porz\u0105dku: oryginaln\u0105 wersje <a href=\"https:\/\/web.archive.org\/web\/20240202214016\/https:\/\/itnext.io\/javas-new-fma-renaissance-or-decay-372a2aee5f32?gi=ddcd43f7a5bb\">znajdziecie tutaj<\/a>, ale osobi\u015bcie polecam po prostu sprawdzi\u0107 poprawn\u0105, najnowsz\u0105 wersje.<\/p>\n\n\n\n<p>Je\u015bli czujecie si\u0119 zainteresowani nowymi API i czujecie si\u0119 zaciekawieni, aby pozna\u0107 jego &#8222;bebechy&#8221;, nadarza si\u0119 \u015bwietna okazja. Pocz\u0105tkiem tygodnia na kanale Javy pojawi\u0142o si\u0119 bowiem wideo <a href=\"https:\/\/www.youtube.com\/watch?v=iwmVbeiA42E\">Foreign Function &amp; Memory API &#8211; A (Quick) Peek Under the Hood<\/a>, kt\u00f3re sam mia\u0142em okazje ju\u017c obejrze\u0107 i naprawd\u0119 polecam. Dowiecie si\u0119 z niego nie tylko o funkcjonalno\u015bciach Foreign Function and Memory API (te ju\u017c pewnie s\u0105 mniej wi\u0119cej znane) ale dowiecie si\u0119 za\u0142o\u017cenia dotycz\u0105ce projektu samego API, aby oferowa\u0142o podej\u015bcie &#8222;Java-first&#8221; do wywo\u0142ywania funkcji natywnych i zarz\u0105dzania segmentami pami\u0119ci, omijaj\u0105c przy tym ograniczenia JNI i <code>Direct Buffer API<\/code>, szczeg\u00f3lnie w obszarach wymagaj\u0105cych intensywnej oblicze\u0144 numerycznych, jak uczenie maszynowe.<\/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=\"Foreign Function &amp; Memory API - A (Quick) Peek Under the Hood\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/iwmVbeiA42E?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<h2 id=\"3-wielkie-porownanie-kompilatorow-jit\" data-num=3>3. Wielkie Por\u00f3wnanie kompilator\u00f3w JIT<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"585\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-8-1024x585.png\" alt=\"\" class=\"wp-image-17695\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-8-1024x585.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-8-300x171.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-8-768x439.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-8-1536x878.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-8.png 1792w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Ale mimo, \u017ce por\u00f3wnanie F(F)MA oraz Unsafe to ciekawy temat, blednie on nieco przy monumentalno\u015bci kolejnego z benchmark\u00f3w. Tekst <a href=\"https:\/\/ionutbalosin.com\/2024\/02\/jvm-performance-comparison-for-jdk-21\/\">JVM Performance Comparison for JDK 21<\/a> autorstwa Ionuta Balosina i Florina Blanaru przedstawia bowiem szczeg\u00f3\u0142owe por\u00f3wnanie wydajno\u015bci r\u00f3\u017cnych kompilator\u00f3w Just-In-Time (JIT), ze szczeg\u00f3lnym uwzgl\u0119dnieniem JDK 21. Ca\u0142o\u015b\u0107 to ponad godzina (!) lektury (i to w wypadku jak szybko czytacie), a benchmarki zosta\u0142y podzielone na r\u00f3\u017cne kategorie, pokrywaj\u0105ce szerokie spektrum scenariuszy, od niskopoziomowych optymalizacji kompilatora po wysokopoziomowe u\u017cycie API Javy i klasyczne problemy programistyczne, takie typowo programistyczne, jakich spodziewacie si\u0119 od rekrutacji do FAANG czy Advent of Code.<\/p>\n\n\n\n<p>Oceniane kompilatory to C2 (Server) JIT z OpenJDK 21 oraz dwie wersje kompilatora Graal JIT (z GraalVM CE 21+35.1 i Oracle GraalVM 21+35.1), testowane na architekturach x86_64 i arm64. Benchmarki przeprowadzono przy u\u017cyciu Java Microbenchmark Harness (JMH) wersji 1.37 na MacBooku Pro z chipem M1 (przyznaje &#8211; jest to bardzo ciekawy, nietypowy wyb\u00f3r) i Dell XPS 15 z procesorem Intel Core i7-9750H, w kontrolowanych warunkach, aby zminimalizowa\u0107 zmienno\u015b\u0107 wydajno\u015bci. Og\u00f3lnie wygl\u0105da na to, \u017ce tw\u00f3rcy bardzo przy\u0142o\u017cyli si\u0119 do odrobienia pracy domowej.<\/p>\n\n\n\n<p>Og\u00f3lnie rzecz bior\u0105c, kompilator Oracle GraalVM JIT okaza\u0142 si\u0119 najszybszy spo\u015br\u00f3d testowanych kompilator\u00f3w, wykazuj\u0105c znacz\u0105c\u0105 przewag\u0119 wydajno\u015bci nad kompilatorem C2 JIT, si\u0119gaj\u0105cy od 23% na x86_64 do 17% na arm64. Zyski te s\u0105 wynikaj\u0105 z optymalizacji dawnego Enterprise Edition, takich jak ulepszona analiza cz\u0119\u015bciowej ucieczki i bardziej agresywne strategie inliningu. Co ciekawe, cho\u0107 wyniki kompilator\u00f3w C2 JIT i GraalVM CE JIT u\u015bredniaj\u0105c by\u0142y zbli\u017cone, r\u00f3\u017cni\u0142y si\u0119 znacznie pod wzgl\u0119dem konkretnych mo\u017cliwo\u015bci optymalizacji. C2 oferuje zaawansowane wsparcie dla intrinsics (wbudowanych funkcji specjalnie obs\u0142ugiwanych przez procesor) i wektoryzacji (przetwarzanie danych w blokach zamiast pojedynczo) oraz lepsze zarz\u0105dzanie wyj\u0105tkami ni\u017c GraalVM CE JIT, ale ma ograniczenia w heurystyce inliningu (wstawiania tre\u015bci funkcji w miejsce jej wywo\u0142ania), devirtualizacji (optymalizacji wywo\u0142a\u0144 metod w obiektach) skomplikowanych wywo\u0142a\u0144 i w rzadkich przypadkach mo\u017ce nie dokona\u0107 kompilacji, co skutkuje u\u017cyciem mniej optymalnych \u015bcie\u017cek wykonania (takich jak zatrzymanie kompilacji na poziomie C1 lub nawet kodu interpretowanego).<\/p>\n\n\n\n<p>Tak jak wspomnia\u0142em, tekst jest naprawd\u0119, naprawd\u0119 przekrojowy, wi\u0119c je\u015bli jeste\u015bcie ciekawi (i macie cierpliwo\u015b\u0107), mo\u017cecie sprawdzi\u0107 poszczeg\u00f3lne wyniki. Ja b\u0119d\u0119 u\u017cywa\u0142 go pewnie nie raz, i b\u0119dzie mi s\u0142u\u017cy\u0142 jako szczeg\u00f3\u0142owe (naprawd\u0119 szczeg\u00f3\u0142owe) \u017ar\u00f3d\u0142o informacji na temat mocnych i s\u0142abych strony r\u00f3\u017cnych kompilator\u00f3w JIT. Oczywi\u015bcie, jak to zwykle w tego typu publikacjach, artyku\u0142 ko\u0144czy si\u0119 przypomnieniem, \u017ce cho\u0107 kompilator Oracle GraalVM JIT rzeczywi\u015bcie prowadzi pod wzgl\u0119dem wydajno\u015bci, wyb\u00f3r dystrybucji JVM nie powinien opiera\u0107 si\u0119 wy\u0142\u0105cznie na wynikach mikro-benchmark\u00f3w &#8211; nie da si\u0119 jedna ukry\u0107, \u017ce w 2024 GraalVM ma naprawd\u0119 dobr\u0105 pass\u0119.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dzisiejsze wydanie mamy stricte tematyczne, poniewa\u017c od r\u00f3\u017cnych stron b\u0119dziemy przygl\u0105da\u0107 si\u0119 r\u00f3\u017cnym inicjatywom dotycz\u0105cym wydajno\u015bci w Javie.<\/p>\n","protected":false},"author":10,"featured_media":17687,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[259,1],"tags":[],"class_list":["post-17664","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jvm-pl","category-no-category"],"acf":{"estimated_reading_time":"7","feature_image_blog":false,"weekly_summary":false,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/Group-780-2.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>Co nowego w Performance JDK? Project Skogsluft, FFM vs Unsafe, Benchmark JIT-\u00f3w - JVM Weekly vol. 163 - 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\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Co nowego w Performance JDK? Project Skogsluft, FFM vs Unsafe, Benchmark JIT-\u00f3w - JVM Weekly vol. 163 - Vived\" \/>\n<meta property=\"og:description\" content=\"Dzisiejsze wydanie mamy stricte tematyczne, poniewa\u017c od r\u00f3\u017cnych stron b\u0119dziemy przygl\u0105da\u0107 si\u0119 r\u00f3\u017cnym inicjatywom dotycz\u0105cym wydajno\u015bci w Javie.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2024-02-14T23:22:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-02-15T05:42:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/Group-780-2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\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\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"Co nowego w Performance JDK? Project Skogsluft, FFM vs Unsafe, Benchmark JIT-\u00f3w &#8211; JVM Weekly vol. 163\",\"datePublished\":\"2024-02-14T23:22:19+00:00\",\"dateModified\":\"2024-02-15T05:42:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/\"},\"wordCount\":1568,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/Group-780-2.png\",\"articleSection\":[\"JVM\",\"No category\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/\",\"url\":\"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/\",\"name\":\"Co nowego w Performance JDK? Project Skogsluft, FFM vs Unsafe, Benchmark JIT-\u00f3w - JVM Weekly vol. 163 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/Group-780-2.png\",\"datePublished\":\"2024-02-14T23:22:19+00:00\",\"dateModified\":\"2024-02-15T05:42:25+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/Group-780-2.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/Group-780-2.png\",\"width\":1920,\"height\":1080},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Co nowego w Performance JDK? Project Skogsluft, FFM vs Unsafe, Benchmark JIT-\u00f3w &#8211; JVM Weekly vol. 163\"}]},{\"@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":"Co nowego w Performance JDK? Project Skogsluft, FFM vs Unsafe, Benchmark JIT-\u00f3w - JVM Weekly vol. 163 - 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\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/","og_locale":"pl_PL","og_type":"article","og_title":"Co nowego w Performance JDK? Project Skogsluft, FFM vs Unsafe, Benchmark JIT-\u00f3w - JVM Weekly vol. 163 - Vived","og_description":"Dzisiejsze wydanie mamy stricte tematyczne, poniewa\u017c od r\u00f3\u017cnych stron b\u0119dziemy przygl\u0105da\u0107 si\u0119 r\u00f3\u017cnym inicjatywom dotycz\u0105cym wydajno\u015bci w Javie.","og_url":"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/","og_site_name":"Vived","article_published_time":"2024-02-14T23:22:19+00:00","article_modified_time":"2024-02-15T05:42:25+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/Group-780-2.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\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"Co nowego w Performance JDK? Project Skogsluft, FFM vs Unsafe, Benchmark JIT-\u00f3w &#8211; JVM Weekly vol. 163","datePublished":"2024-02-14T23:22:19+00:00","dateModified":"2024-02-15T05:42:25+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/"},"wordCount":1568,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/Group-780-2.png","articleSection":["JVM","No category"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/","url":"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/","name":"Co nowego w Performance JDK? Project Skogsluft, FFM vs Unsafe, Benchmark JIT-\u00f3w - JVM Weekly vol. 163 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/Group-780-2.png","datePublished":"2024-02-14T23:22:19+00:00","dateModified":"2024-02-15T05:42:25+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/Group-780-2.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/Group-780-2.png","width":1920,"height":1080},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/co-nowego-w-performance-jdk-project-skogsluft-ffm-vs-unsafe-benchmark-jit-ow-jvm-weekly-vol-163\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Co nowego w Performance JDK? Project Skogsluft, FFM vs Unsafe, Benchmark JIT-\u00f3w &#8211; JVM Weekly vol. 163"}]},{"@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. Project Skogsluft obiecuje du\u017ce zmiany w Java Flight Recorder<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">1. Project Skogsluft obiecuje du\u017ce zmiany w Java Flight Recorder<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":17666,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-2-1024x585.png\" alt=\"\" class=\"wp-image-17666\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-2-1024x585.png\" alt=\"\" class=\"wp-image-17666\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wraz z rych\u0142ym pojawieniem si\u0119 Foreign Function and Memory API, kt\u00f3re ju\u017c w marcu w stabilnej wersji trafi\u0105 do JDK 22, ju\u017c nied\u0142ugo okaza\u0107 si\u0119 mo\u017ce \u017ce coraz popularniejsze stanie si\u0119 u\u017cywanie wi\u0119kszej ilo\u015bci \"natywnego\" kodu. Temat staje si\u0119 coraz popularniejszy, przewija si\u0119 w r\u00f3\u017cnych wariantach w zasadzie ka\u017cdej kolejnej edycji tego przegl\u0105du (a nawet dzisiaj jeszcze do niego wr\u00f3cimy troch\u0119 p\u00f3\u017aniej), dlatego niezb\u0119dne jest r\u00f3wnie\u017c dopasowanie ca\u0142ej javowej \"narz\u0119dziowki\", aby ta gotowa by\u0142a na ten spodziewany wzrost u\u017cycia. Dlatego te\u017c nie powinno dziwi\u0107, \u017ce pojawi\u0142a si\u0119 propozycja nowego projektu, kt\u00f3rego celem b\u0119dzie badanie wydajno\u015bci aplikacji.<\/p>\n","innerContent":["\n<p>Wraz z rych\u0142ym pojawieniem si\u0119 Foreign Function and Memory API, kt\u00f3re ju\u017c w marcu w stabilnej wersji trafi\u0105 do JDK 22, ju\u017c nied\u0142ugo okaza\u0107 si\u0119 mo\u017ce \u017ce coraz popularniejsze stanie si\u0119 u\u017cywanie wi\u0119kszej ilo\u015bci \"natywnego\" kodu. Temat staje si\u0119 coraz popularniejszy, przewija si\u0119 w r\u00f3\u017cnych wariantach w zasadzie ka\u017cdej kolejnej edycji tego przegl\u0105du (a nawet dzisiaj jeszcze do niego wr\u00f3cimy troch\u0119 p\u00f3\u017aniej), dlatego niezb\u0119dne jest r\u00f3wnie\u017c dopasowanie ca\u0142ej javowej \"narz\u0119dziowki\", aby ta gotowa by\u0142a na ten spodziewany wzrost u\u017cycia. Dlatego te\u017c nie powinno dziwi\u0107, \u017ce pojawi\u0142a si\u0119 propozycja nowego projektu, kt\u00f3rego celem b\u0119dzie badanie wydajno\u015bci aplikacji.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/mail.openjdk.org\/pipermail\/discuss\/2024-February\/006330.html\">Projekt \"Skogsluft\"<\/a>, zaproponowany przez Jaroslava Bachor\u00edka z DataDog, ma na celu znacz\u0105ce wzmocnienie mo\u017cliwo\u015bci profilowania Javy w ramach Java Flight Recorder (JFR) poprzez wprowadzenie zaawansowanych funkcji, kt\u00f3re zniweluj\u0105 r\u00f3\u017cnice mi\u0119dzy profilowaniem wykonania kodu Java i kodu natywnego. Skogsluft koncentrowa\u0107 ma si\u0119 na trzech g\u0142\u00f3wnych usprawnieniach: zintegrowany mechanizmie przechodzenia po stosie r\u00f3wnie\u017c dla kodu natywnego, elastycznym harmonogramie pr\u00f3bkowania CPU dostosowanym do mo\u017cliwo\u015bci r\u00f3\u017cnych system\u00f3w operacyjnych oraz rozszerzonym wsparciu dla labelowania w\u0105tk\u00f3w w JFR. Maj\u0105 one na celu dostarczenie programistom bardziej elastycznych opcji profilowania oraz bogatszego kontekstu dla analizy.<\/p>\n","innerContent":["\n<p><a href=\"https:\/\/mail.openjdk.org\/pipermail\/discuss\/2024-February\/006330.html\">Projekt \"Skogsluft\"<\/a>, zaproponowany przez Jaroslava Bachor\u00edka z DataDog, ma na celu znacz\u0105ce wzmocnienie mo\u017cliwo\u015bci profilowania Javy w ramach Java Flight Recorder (JFR) poprzez wprowadzenie zaawansowanych funkcji, kt\u00f3re zniweluj\u0105 r\u00f3\u017cnice mi\u0119dzy profilowaniem wykonania kodu Java i kodu natywnego. Skogsluft koncentrowa\u0107 ma si\u0119 na trzech g\u0142\u00f3wnych usprawnieniach: zintegrowany mechanizmie przechodzenia po stosie r\u00f3wnie\u017c dla kodu natywnego, elastycznym harmonogramie pr\u00f3bkowania CPU dostosowanym do mo\u017cliwo\u015bci r\u00f3\u017cnych system\u00f3w operacyjnych oraz rozszerzonym wsparciu dla labelowania w\u0105tk\u00f3w w JFR. Maj\u0105 one na celu dostarczenie programistom bardziej elastycznych opcji profilowania oraz bogatszego kontekstu dla analizy.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Teraz projekt poszukuje wsparcia ze strony tw\u00f3rc\u00f3w OpenJDK. Proponowany rozw\u00f3j projektu ma odbywa\u0107 si\u0119 w oddzielnym forku (od wersji JDK 23) z zamiarem stopniowego wdra\u017cania nowych funkcji w serii JEP.<\/p>\n","innerContent":["\n<p>Teraz projekt poszukuje wsparcia ze strony tw\u00f3rc\u00f3w OpenJDK. Proponowany rozw\u00f3j projektu ma odbywa\u0107 si\u0119 w oddzielnym forku (od wersji JDK 23) z zamiarem stopniowego wdra\u017cania nowych funkcji w serii JEP.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Sk\u0105d nazwa \"Skogsluft\"? Pochodzi z norweskiego, w kt\u00f3rym \"skog\" oznacza \"las\", a \"luft\" oznacza \"powietrze\". Dos\u0142ownie przet\u0142umaczone, \"Skogsluft\" oznacza \"powietrze le\u015bne\" lub \"powiew lasu\". My\u015bl\u0119, \u017ce to ca\u0142kiem dobra nazwa, bior\u0105c pod uwag\u0119 powiew \u015bwie\u017co\u015bci, kt\u00f3re projekt mo\u017ce wprowadzi\u0107 do profilowania w JFR, cho\u0107 pracowa\u0142em kiedy\u015b dla norweskiej firmy i ze zwrotami z ichniejszego j\u0119zyka to nigdy nie wiadomo.<\/p>\n","innerContent":["\n<p>Sk\u0105d nazwa \"Skogsluft\"? Pochodzi z norweskiego, w kt\u00f3rym \"skog\" oznacza \"las\", a \"luft\" oznacza \"powietrze\". Dos\u0142ownie przet\u0142umaczone, \"Skogsluft\" oznacza \"powietrze le\u015bne\" lub \"powiew lasu\". My\u015bl\u0119, \u017ce to ca\u0142kiem dobra nazwa, bior\u0105c pod uwag\u0119 powiew \u015bwie\u017co\u015bci, kt\u00f3re projekt mo\u017ce wprowadzi\u0107 do profilowania w JFR, cho\u0107 pracowa\u0142em kiedy\u015b dla norweskiej firmy i ze zwrotami z ichniejszego j\u0119zyka to nigdy nie wiadomo.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17669,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-3.png\" alt=\"\" class=\"wp-image-17669\"\/><figcaption class=\"wp-element-caption\">Pozdrawiam czytelnik\u00f3w z Norwegii - widz\u0119 wszystko, wiem \u017ce zaskakuj\u0105co sporo Was jest <\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-3.png\" alt=\"\" class=\"wp-image-17669\"\/><figcaption class=\"wp-element-caption\">Pozdrawiam czytelnik\u00f3w z Norwegii - widz\u0119 wszystko, wiem \u017ce zaskakuj\u0105co sporo Was jest <\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A jak ju\u017c przy JFR, to podrzuc\u0119 Wam jeszcze tekst <a href=\"https:\/\/piotrminkowski.com\/2024\/02\/13\/java-flight-recorder-on-kubernetes\/\">Java Flight Recorder na Kubernetes<\/a>. Artyku\u0142 Piotra Minkowskiego dostarcza kompleksowego przewodnika na temat u\u017cycia Java Flight Recorder (JFR) na Kubernetes przy pomocy Cryostat do ci\u0105g\u0142ego monitorowania aplikacji Java. Cryostat to narz\u0119dzie umo\u017cliwiaj\u0105ce zdalne zarz\u0105dzanie nagraniami Java Flight Recorder dla aplikacji dzia\u0142aj\u0105cych w kontenerach, u\u0142atwiaj\u0105ce monitorowanie i diagnozowanie wydajno\u015bci aplikacji. Wyja\u015bnia pe\u0142en proces od instalacji Cryostat za pomoc\u0105 operatora (komponentu w Kubernetes, kt\u00f3ry automatyzuje wdra\u017canie, skalowanie i zarz\u0105dzanie aplikacjami i us\u0142ugami, u\u0142atwiaj\u0105c zarz\u0105dzanie z\u0142o\u017conymi, stanowymi aplikacjami) lub wykresu Helm, po utworzenie przyk\u0142adowej aplikacji Spring Bootowej generuj\u0105cej niestandardowe zdarzenia JFR. Post t\u0142umaczy te\u017c, jak zarz\u0105dza\u0107 niestandardowymi szablonami zdarze\u0144 i analizowa\u0107 dane za pomoc\u0105 JDK Mission Control.<\/p>\n","innerContent":["\n<p>A jak ju\u017c przy JFR, to podrzuc\u0119 Wam jeszcze tekst <a href=\"https:\/\/piotrminkowski.com\/2024\/02\/13\/java-flight-recorder-on-kubernetes\/\">Java Flight Recorder na Kubernetes<\/a>. Artyku\u0142 Piotra Minkowskiego dostarcza kompleksowego przewodnika na temat u\u017cycia Java Flight Recorder (JFR) na Kubernetes przy pomocy Cryostat do ci\u0105g\u0142ego monitorowania aplikacji Java. Cryostat to narz\u0119dzie umo\u017cliwiaj\u0105ce zdalne zarz\u0105dzanie nagraniami Java Flight Recorder dla aplikacji dzia\u0142aj\u0105cych w kontenerach, u\u0142atwiaj\u0105ce monitorowanie i diagnozowanie wydajno\u015bci aplikacji. Wyja\u015bnia pe\u0142en proces od instalacji Cryostat za pomoc\u0105 operatora (komponentu w Kubernetes, kt\u00f3ry automatyzuje wdra\u017canie, skalowanie i zarz\u0105dzanie aplikacjami i us\u0142ugami, u\u0142atwiaj\u0105c zarz\u0105dzanie z\u0142o\u017conymi, stanowymi aplikacjami) lub wykresu Helm, po utworzenie przyk\u0142adowej aplikacji Spring Bootowej generuj\u0105cej niestandardowe zdarzenia JFR. Post t\u0142umaczy te\u017c, jak zarz\u0105dza\u0107 niestandardowymi szablonami zdarze\u0144 i analizowa\u0107 dane za pomoc\u0105 JDK Mission Control.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17672,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-4.png\" alt=\"\" class=\"wp-image-17672\"\/><figcaption class=\"wp-element-caption\">A od siebie zdecydowanie polecam u\u017cywanie kubernetesowych operator\u00f3w.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-4.png\" alt=\"\" class=\"wp-image-17672\"\/><figcaption class=\"wp-element-caption\">A od siebie zdecydowanie polecam u\u017cywanie kubernetesowych operator\u00f3w.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>I ostatnia wrzutka - Gunnar Morling, kt\u00f3ry ostatnio jest znany z opisywanego cho\u0107by i tutaj 1BRC, opublikowa\u0142 kiedy\u015b <a href=\"https:\/\/www.morling.dev\/blog\/jdk-flight-recorder-file-format\/\">specyfikacje nieodokumentowanego do tej pory formatu pliku wynikowego JDK Flight Recorder<\/a>. Ot, takie ma\u0142y crossover, nie mog\u0142em sobie odpu\u015bci\u0107.<\/p>\n","innerContent":["\n<p>I ostatnia wrzutka - Gunnar Morling, kt\u00f3ry ostatnio jest znany z opisywanego cho\u0107by i tutaj 1BRC, opublikowa\u0142 kiedy\u015b <a href=\"https:\/\/www.morling.dev\/blog\/jdk-flight-recorder-file-format\/\">specyfikacje nieodokumentowanego do tej pory formatu pliku wynikowego JDK Flight Recorder<\/a>. Ot, takie ma\u0142y crossover, nie mog\u0142em sobie odpu\u015bci\u0107.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">2. It's benchmarking time! FMA vs Unsafe <\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">2. It's benchmarking time! FMA vs Unsafe <\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":17682,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-6-1024x585.png\" alt=\"\" class=\"wp-image-17682\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-6-1024x585.png\" alt=\"\" class=\"wp-image-17682\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zaczeli\u015bmy od profilingu, ale to nie koniec temat\u00f3w zwi\u0105zanych z szeroko rozumian\u0105 wydajno\u015bci\u0105. Jak ju\u017c wcze\u015bniej obieca\u0142em, wracamy do tematu Foreign Memory Access API.<\/p>\n","innerContent":["\n<p>Zaczeli\u015bmy od profilingu, ale to nie koniec temat\u00f3w zwi\u0105zanych z szeroko rozumian\u0105 wydajno\u015bci\u0105. Jak ju\u017c wcze\u015bniej obieca\u0142em, wracamy do tematu Foreign Memory Access API.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>W spo\u0142eczno\u015bci Java niedawno du\u017co dyskutowano o nowym JEP, kt\u00f3ry proponuje wycofanie i usuni\u0119cie metod dost\u0119pu i alokacji pami\u0119ci z klasy Unsafe - sam w poprzedniej edycji komentowa\u0142em, \u017ce w obliczu wynik\u00f3w 1BRC tw\u00f3rcy mog\u0105 mie\u0107 ci\u0119\u017cki orzech do zgryzienia. Unsafe pozwala\u0142o na alokacj\u0119 pami\u0119ci poza modelem pami\u0119ci Java, oferuj\u0105c bardzo szybki dost\u0119p do pami\u0119ci i umo\u017cliwiaj\u0105c operacje, kt\u00f3re w innym przypadku by\u0142yby niemo\u017cliwe w ramach modelu pami\u0119ci Java. Ta funkcjonalno\u015b\u0107 by\u0142a wykorzystywana w wielu bibliotekach wysokiej wydajno\u015bci, takich jak Netty, Spark, Avro, Kryo, kt\u00f3re teraz musz\u0105 znale\u017a\u0107 alternatywy. Jednak Tomer Zeltzer, Senior Software Engineer at Yahoo, w swoim artykule <a href=\"https:\/\/itnext.io\/javas-new-fma-renaissance-or-decay-372a2aee5f32\">Java\u2019s New FMA: Renaissance Or Decay?<\/a> zwraca uwag\u0119, \u017ce pomimo pocz\u0105tkowego szoku, istniej\u0105 alternatywy dla Unsafe, kt\u00f3re mog\u0105 okaza\u0107 si\u0119 obiecuj\u0105ce.<\/p>\n","innerContent":["\n<p>W spo\u0142eczno\u015bci Java niedawno du\u017co dyskutowano o nowym JEP, kt\u00f3ry proponuje wycofanie i usuni\u0119cie metod dost\u0119pu i alokacji pami\u0119ci z klasy Unsafe - sam w poprzedniej edycji komentowa\u0142em, \u017ce w obliczu wynik\u00f3w 1BRC tw\u00f3rcy mog\u0105 mie\u0107 ci\u0119\u017cki orzech do zgryzienia. Unsafe pozwala\u0142o na alokacj\u0119 pami\u0119ci poza modelem pami\u0119ci Java, oferuj\u0105c bardzo szybki dost\u0119p do pami\u0119ci i umo\u017cliwiaj\u0105c operacje, kt\u00f3re w innym przypadku by\u0142yby niemo\u017cliwe w ramach modelu pami\u0119ci Java. Ta funkcjonalno\u015b\u0107 by\u0142a wykorzystywana w wielu bibliotekach wysokiej wydajno\u015bci, takich jak Netty, Spark, Avro, Kryo, kt\u00f3re teraz musz\u0105 znale\u017a\u0107 alternatywy. Jednak Tomer Zeltzer, Senior Software Engineer at Yahoo, w swoim artykule <a href=\"https:\/\/itnext.io\/javas-new-fma-renaissance-or-decay-372a2aee5f32\">Java\u2019s New FMA: Renaissance Or Decay?<\/a> zwraca uwag\u0119, \u017ce pomimo pocz\u0105tkowego szoku, istniej\u0105 alternatywy dla Unsafe, kt\u00f3re mog\u0105 okaza\u0107 si\u0119 obiecuj\u0105ce.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dokonuje on bowiem benchmarkingu nowego API dost\u0119pu do pami\u0119ci obcej (FMA), opracowanego jako cz\u0119\u015b\u0107 Projektu Panama (JEP-424), kt\u00f3ry ma zast\u0105pi\u0107 Unsafe, oferuj\u0105c bezpieczniejsze i oficjalnie wspierane rozwi\u0105zanie. FMA prezentuje si\u0119 obiecuj\u0105co, oferuj\u0105c por\u00f3wnywaln\u0105 pr\u0119dko\u015b\u0107 odczytu i 42% szybszy zapis na stercie w por\u00f3wnaniu z Unsafe, a tak\u017ce prawie trzykrotnie szybszy dost\u0119p do pami\u0119ci poza stert\u0105. Nowe API wykorzystuje obiekt <code>Arena<\/code> do alokacji pami\u0119ci, a segmenty pami\u0119ci, kt\u00f3re z niej pochodz\u0105, nie mog\u0105 by\u0107 indywidualnie zwalniane, co mo\u017ce u\u0142atwi\u0107 unikanie wyciek\u00f3w pami\u0119ci. Cho\u0107 zwolnienie pami\u0119ci jest mniej granularne ni\u017c w Unsafe, nowe API wydaje si\u0119 zachowa\u0107 te same mo\u017cliwo\u015bci przy jednoczesnym oferowaniu nieco wygodniejszego interfejsu. <\/p>\n","innerContent":["\n<p>Dokonuje on bowiem benchmarkingu nowego API dost\u0119pu do pami\u0119ci obcej (FMA), opracowanego jako cz\u0119\u015b\u0107 Projektu Panama (JEP-424), kt\u00f3ry ma zast\u0105pi\u0107 Unsafe, oferuj\u0105c bezpieczniejsze i oficjalnie wspierane rozwi\u0105zanie. FMA prezentuje si\u0119 obiecuj\u0105co, oferuj\u0105c por\u00f3wnywaln\u0105 pr\u0119dko\u015b\u0107 odczytu i 42% szybszy zapis na stercie w por\u00f3wnaniu z Unsafe, a tak\u017ce prawie trzykrotnie szybszy dost\u0119p do pami\u0119ci poza stert\u0105. Nowe API wykorzystuje obiekt <code>Arena<\/code> do alokacji pami\u0119ci, a segmenty pami\u0119ci, kt\u00f3re z niej pochodz\u0105, nie mog\u0105 by\u0107 indywidualnie zwalniane, co mo\u017ce u\u0142atwi\u0107 unikanie wyciek\u00f3w pami\u0119ci. Cho\u0107 zwolnienie pami\u0119ci jest mniej granularne ni\u017c w Unsafe, nowe API wydaje si\u0119 zachowa\u0107 te same mo\u017cliwo\u015bci przy jednoczesnym oferowaniu nieco wygodniejszego interfejsu. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17675,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-5.png\" alt=\"\" class=\"wp-image-17675\"\/><figcaption class=\"wp-element-caption\">Jak zawsze kiedy mowa o benchmarkingu - nale\u017cy traktowa\u0107 ca\u0142o\u015b\u0107 z lekk\u0105 doz\u0105 sceptycyzmu.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-5.png\" alt=\"\" class=\"wp-image-17675\"\/><figcaption class=\"wp-element-caption\">Jak zawsze kiedy mowa o benchmarkingu - nale\u017cy traktowa\u0107 ca\u0142o\u015b\u0107 z lekk\u0105 doz\u0105 sceptycyzmu.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Tutaj ma\u0142y disclaimer: oryginalny artyku\u0142 by\u0142 nieco d\u0142u\u017cszy, ale po <a href=\"https:\/\/www.reddit.com\/r\/java\/comments\/1ah8y1u\/javas_new_fma_renaissance_or_decay\/\">dyskusji na Reddicie<\/a> - w kt\u00f3rej zaanga\u017cowany by\u0142 sam Ron Pressler - niekt\u00f3re fragmenty zosta\u0142y wyedytowane. Dla porz\u0105dku: oryginaln\u0105 wersje <a href=\"https:\/\/web.archive.org\/web\/20240202214016\/https:\/\/itnext.io\/javas-new-fma-renaissance-or-decay-372a2aee5f32?gi=ddcd43f7a5bb\">znajdziecie tutaj<\/a>, ale osobi\u015bcie polecam po prostu sprawdzi\u0107 poprawn\u0105, najnowsz\u0105 wersje.<\/p>\n","innerContent":["\n<p>Tutaj ma\u0142y disclaimer: oryginalny artyku\u0142 by\u0142 nieco d\u0142u\u017cszy, ale po <a href=\"https:\/\/www.reddit.com\/r\/java\/comments\/1ah8y1u\/javas_new_fma_renaissance_or_decay\/\">dyskusji na Reddicie<\/a> - w kt\u00f3rej zaanga\u017cowany by\u0142 sam Ron Pressler - niekt\u00f3re fragmenty zosta\u0142y wyedytowane. Dla porz\u0105dku: oryginaln\u0105 wersje <a href=\"https:\/\/web.archive.org\/web\/20240202214016\/https:\/\/itnext.io\/javas-new-fma-renaissance-or-decay-372a2aee5f32?gi=ddcd43f7a5bb\">znajdziecie tutaj<\/a>, ale osobi\u015bcie polecam po prostu sprawdzi\u0107 poprawn\u0105, najnowsz\u0105 wersje.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u015bli czujecie si\u0119 zainteresowani nowymi API i czujecie si\u0119 zaciekawieni, aby pozna\u0107 jego \"bebechy\", nadarza si\u0119 \u015bwietna okazja. Pocz\u0105tkiem tygodnia na kanale Javy pojawi\u0142o si\u0119 bowiem wideo <a href=\"https:\/\/www.youtube.com\/watch?v=iwmVbeiA42E\">Foreign Function &amp; Memory API - A (Quick) Peek Under the Hood<\/a>, kt\u00f3re sam mia\u0142em okazje ju\u017c obejrze\u0107 i naprawd\u0119 polecam. Dowiecie si\u0119 z niego nie tylko o funkcjonalno\u015bciach Foreign Function and Memory API (te ju\u017c pewnie s\u0105 mniej wi\u0119cej znane) ale dowiecie si\u0119 za\u0142o\u017cenia dotycz\u0105ce projektu samego API, aby oferowa\u0142o podej\u015bcie \"Java-first\" do wywo\u0142ywania funkcji natywnych i zarz\u0105dzania segmentami pami\u0119ci, omijaj\u0105c przy tym ograniczenia JNI i <code>Direct Buffer API<\/code>, szczeg\u00f3lnie w obszarach wymagaj\u0105cych intensywnej oblicze\u0144 numerycznych, jak uczenie maszynowe.<\/p>\n","innerContent":["\n<p>Je\u015bli czujecie si\u0119 zainteresowani nowymi API i czujecie si\u0119 zaciekawieni, aby pozna\u0107 jego \"bebechy\", nadarza si\u0119 \u015bwietna okazja. Pocz\u0105tkiem tygodnia na kanale Javy pojawi\u0142o si\u0119 bowiem wideo <a href=\"https:\/\/www.youtube.com\/watch?v=iwmVbeiA42E\">Foreign Function &amp; Memory API - A (Quick) Peek Under the Hood<\/a>, kt\u00f3re sam mia\u0142em okazje ju\u017c obejrze\u0107 i naprawd\u0119 polecam. Dowiecie si\u0119 z niego nie tylko o funkcjonalno\u015bciach Foreign Function and Memory API (te ju\u017c pewnie s\u0105 mniej wi\u0119cej znane) ale dowiecie si\u0119 za\u0142o\u017cenia dotycz\u0105ce projektu samego API, aby oferowa\u0142o podej\u015bcie \"Java-first\" do wywo\u0142ywania funkcji natywnych i zarz\u0105dzania segmentami pami\u0119ci, omijaj\u0105c przy tym ograniczenia JNI i <code>Direct Buffer API<\/code>, szczeg\u00f3lnie w obszarach wymagaj\u0105cych intensywnej oblicze\u0144 numerycznych, jak uczenie maszynowe.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/embed","attrs":{"url":"https:\/\/www.youtube.com\/watch?v=iwmVbeiA42E","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=iwmVbeiA42E\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=iwmVbeiA42E\n<\/div><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">3. Wielkie Por\u00f3wnanie kompilator\u00f3w JIT<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">3. Wielkie Por\u00f3wnanie kompilator\u00f3w JIT<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":17695,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-8-1024x585.png\" alt=\"\" class=\"wp-image-17695\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-8-1024x585.png\" alt=\"\" class=\"wp-image-17695\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ale mimo, \u017ce por\u00f3wnanie F(F)MA oraz Unsafe to ciekawy temat, blednie on nieco przy monumentalno\u015bci kolejnego z benchmark\u00f3w. Tekst <a href=\"https:\/\/ionutbalosin.com\/2024\/02\/jvm-performance-comparison-for-jdk-21\/\">JVM Performance Comparison for JDK 21<\/a> autorstwa Ionuta Balosina i Florina Blanaru przedstawia bowiem szczeg\u00f3\u0142owe por\u00f3wnanie wydajno\u015bci r\u00f3\u017cnych kompilator\u00f3w Just-In-Time (JIT), ze szczeg\u00f3lnym uwzgl\u0119dnieniem JDK 21. Ca\u0142o\u015b\u0107 to ponad godzina (!) lektury (i to w wypadku jak szybko czytacie), a benchmarki zosta\u0142y podzielone na r\u00f3\u017cne kategorie, pokrywaj\u0105ce szerokie spektrum scenariuszy, od niskopoziomowych optymalizacji kompilatora po wysokopoziomowe u\u017cycie API Javy i klasyczne problemy programistyczne, takie typowo programistyczne, jakich spodziewacie si\u0119 od rekrutacji do FAANG czy Advent of Code.<\/p>\n","innerContent":["\n<p>Ale mimo, \u017ce por\u00f3wnanie F(F)MA oraz Unsafe to ciekawy temat, blednie on nieco przy monumentalno\u015bci kolejnego z benchmark\u00f3w. Tekst <a href=\"https:\/\/ionutbalosin.com\/2024\/02\/jvm-performance-comparison-for-jdk-21\/\">JVM Performance Comparison for JDK 21<\/a> autorstwa Ionuta Balosina i Florina Blanaru przedstawia bowiem szczeg\u00f3\u0142owe por\u00f3wnanie wydajno\u015bci r\u00f3\u017cnych kompilator\u00f3w Just-In-Time (JIT), ze szczeg\u00f3lnym uwzgl\u0119dnieniem JDK 21. Ca\u0142o\u015b\u0107 to ponad godzina (!) lektury (i to w wypadku jak szybko czytacie), a benchmarki zosta\u0142y podzielone na r\u00f3\u017cne kategorie, pokrywaj\u0105ce szerokie spektrum scenariuszy, od niskopoziomowych optymalizacji kompilatora po wysokopoziomowe u\u017cycie API Javy i klasyczne problemy programistyczne, takie typowo programistyczne, jakich spodziewacie si\u0119 od rekrutacji do FAANG czy Advent of Code.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Oceniane kompilatory to C2 (Server) JIT z OpenJDK 21 oraz dwie wersje kompilatora Graal JIT (z GraalVM CE 21+35.1 i Oracle GraalVM 21+35.1), testowane na architekturach x86_64 i arm64. Benchmarki przeprowadzono przy u\u017cyciu Java Microbenchmark Harness (JMH) wersji 1.37 na MacBooku Pro z chipem M1 (przyznaje - jest to bardzo ciekawy, nietypowy wyb\u00f3r) i Dell XPS 15 z procesorem Intel Core i7-9750H, w kontrolowanych warunkach, aby zminimalizowa\u0107 zmienno\u015b\u0107 wydajno\u015bci. Og\u00f3lnie wygl\u0105da na to, \u017ce tw\u00f3rcy bardzo przy\u0142o\u017cyli si\u0119 do odrobienia pracy domowej.<\/p>\n","innerContent":["\n<p>Oceniane kompilatory to C2 (Server) JIT z OpenJDK 21 oraz dwie wersje kompilatora Graal JIT (z GraalVM CE 21+35.1 i Oracle GraalVM 21+35.1), testowane na architekturach x86_64 i arm64. Benchmarki przeprowadzono przy u\u017cyciu Java Microbenchmark Harness (JMH) wersji 1.37 na MacBooku Pro z chipem M1 (przyznaje - jest to bardzo ciekawy, nietypowy wyb\u00f3r) i Dell XPS 15 z procesorem Intel Core i7-9750H, w kontrolowanych warunkach, aby zminimalizowa\u0107 zmienno\u015b\u0107 wydajno\u015bci. Og\u00f3lnie wygl\u0105da na to, \u017ce tw\u00f3rcy bardzo przy\u0142o\u017cyli si\u0119 do odrobienia pracy domowej.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Og\u00f3lnie rzecz bior\u0105c, kompilator Oracle GraalVM JIT okaza\u0142 si\u0119 najszybszy spo\u015br\u00f3d testowanych kompilator\u00f3w, wykazuj\u0105c znacz\u0105c\u0105 przewag\u0119 wydajno\u015bci nad kompilatorem C2 JIT, si\u0119gaj\u0105cy od 23% na x86_64 do 17% na arm64. Zyski te s\u0105 wynikaj\u0105 z optymalizacji dawnego Enterprise Edition, takich jak ulepszona analiza cz\u0119\u015bciowej ucieczki i bardziej agresywne strategie inliningu. Co ciekawe, cho\u0107 wyniki kompilator\u00f3w C2 JIT i GraalVM CE JIT u\u015bredniaj\u0105c by\u0142y zbli\u017cone, r\u00f3\u017cni\u0142y si\u0119 znacznie pod wzgl\u0119dem konkretnych mo\u017cliwo\u015bci optymalizacji. C2 oferuje zaawansowane wsparcie dla intrinsics (wbudowanych funkcji specjalnie obs\u0142ugiwanych przez procesor) i wektoryzacji (przetwarzanie danych w blokach zamiast pojedynczo) oraz lepsze zarz\u0105dzanie wyj\u0105tkami ni\u017c GraalVM CE JIT, ale ma ograniczenia w heurystyce inliningu (wstawiania tre\u015bci funkcji w miejsce jej wywo\u0142ania), devirtualizacji (optymalizacji wywo\u0142a\u0144 metod w obiektach) skomplikowanych wywo\u0142a\u0144 i w rzadkich przypadkach mo\u017ce nie dokona\u0107 kompilacji, co skutkuje u\u017cyciem mniej optymalnych \u015bcie\u017cek wykonania (takich jak zatrzymanie kompilacji na poziomie C1 lub nawet kodu interpretowanego).<\/p>\n","innerContent":["\n<p>Og\u00f3lnie rzecz bior\u0105c, kompilator Oracle GraalVM JIT okaza\u0142 si\u0119 najszybszy spo\u015br\u00f3d testowanych kompilator\u00f3w, wykazuj\u0105c znacz\u0105c\u0105 przewag\u0119 wydajno\u015bci nad kompilatorem C2 JIT, si\u0119gaj\u0105cy od 23% na x86_64 do 17% na arm64. Zyski te s\u0105 wynikaj\u0105 z optymalizacji dawnego Enterprise Edition, takich jak ulepszona analiza cz\u0119\u015bciowej ucieczki i bardziej agresywne strategie inliningu. Co ciekawe, cho\u0107 wyniki kompilator\u00f3w C2 JIT i GraalVM CE JIT u\u015bredniaj\u0105c by\u0142y zbli\u017cone, r\u00f3\u017cni\u0142y si\u0119 znacznie pod wzgl\u0119dem konkretnych mo\u017cliwo\u015bci optymalizacji. C2 oferuje zaawansowane wsparcie dla intrinsics (wbudowanych funkcji specjalnie obs\u0142ugiwanych przez procesor) i wektoryzacji (przetwarzanie danych w blokach zamiast pojedynczo) oraz lepsze zarz\u0105dzanie wyj\u0105tkami ni\u017c GraalVM CE JIT, ale ma ograniczenia w heurystyce inliningu (wstawiania tre\u015bci funkcji w miejsce jej wywo\u0142ania), devirtualizacji (optymalizacji wywo\u0142a\u0144 metod w obiektach) skomplikowanych wywo\u0142a\u0144 i w rzadkich przypadkach mo\u017ce nie dokona\u0107 kompilacji, co skutkuje u\u017cyciem mniej optymalnych \u015bcie\u017cek wykonania (takich jak zatrzymanie kompilacji na poziomie C1 lub nawet kodu interpretowanego).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Tak jak wspomnia\u0142em, tekst jest naprawd\u0119, naprawd\u0119 przekrojowy, wi\u0119c je\u015bli jeste\u015bcie ciekawi (i macie cierpliwo\u015b\u0107), mo\u017cecie sprawdzi\u0107 poszczeg\u00f3lne wyniki. Ja b\u0119d\u0119 u\u017cywa\u0142 go pewnie nie raz, i b\u0119dzie mi s\u0142u\u017cy\u0142 jako szczeg\u00f3\u0142owe (naprawd\u0119 szczeg\u00f3\u0142owe) \u017ar\u00f3d\u0142o informacji na temat mocnych i s\u0142abych strony r\u00f3\u017cnych kompilator\u00f3w JIT. Oczywi\u015bcie, jak to zwykle w tego typu publikacjach, artyku\u0142 ko\u0144czy si\u0119 przypomnieniem, \u017ce cho\u0107 kompilator Oracle GraalVM JIT rzeczywi\u015bcie prowadzi pod wzgl\u0119dem wydajno\u015bci, wyb\u00f3r dystrybucji JVM nie powinien opiera\u0107 si\u0119 wy\u0142\u0105cznie na wynikach mikro-benchmark\u00f3w - nie da si\u0119 jedna ukry\u0107, \u017ce w 2024 GraalVM ma naprawd\u0119 dobr\u0105 pass\u0119.<\/p>\n","innerContent":["\n<p>Tak jak wspomnia\u0142em, tekst jest naprawd\u0119, naprawd\u0119 przekrojowy, wi\u0119c je\u015bli jeste\u015bcie ciekawi (i macie cierpliwo\u015b\u0107), mo\u017cecie sprawdzi\u0107 poszczeg\u00f3lne wyniki. Ja b\u0119d\u0119 u\u017cywa\u0142 go pewnie nie raz, i b\u0119dzie mi s\u0142u\u017cy\u0142 jako szczeg\u00f3\u0142owe (naprawd\u0119 szczeg\u00f3\u0142owe) \u017ar\u00f3d\u0142o informacji na temat mocnych i s\u0142abych strony r\u00f3\u017cnych kompilator\u00f3w JIT. Oczywi\u015bcie, jak to zwykle w tego typu publikacjach, artyku\u0142 ko\u0144czy si\u0119 przypomnieniem, \u017ce cho\u0107 kompilator Oracle GraalVM JIT rzeczywi\u015bcie prowadzi pod wzgl\u0119dem wydajno\u015bci, wyb\u00f3r dystrybucji JVM nie powinien opiera\u0107 si\u0119 wy\u0142\u0105cznie na wynikach mikro-benchmark\u00f3w - nie da si\u0119 jedna ukry\u0107, \u017ce w 2024 GraalVM ma naprawd\u0119 dobr\u0105 pass\u0119.<\/p>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/17664","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=17664"}],"version-history":[{"count":18,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/17664\/revisions"}],"predecessor-version":[{"id":17700,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/17664\/revisions\/17700"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/17687"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=17664"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=17664"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=17664"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}