<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Performance on foojay.io - Friends of OpenJDK</title><link>https://foojayio.github.io/website/today/category/performance/</link><description>Recent content in Performance on foojay.io - Friends of OpenJDK</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 22 Jul 2026 21:31:56 +0000</lastBuildDate><atom:link href="https://foojayio.github.io/website/today/category/performance/index.xml" rel="self" type="application/rss+xml"/><item><title>Toward a Durable Spring PetClinic</title><link>https://foojayio.github.io/website/today/toward-a-durable-spring-petclinic/</link><pubDate>Sun, 19 Jul 2026 18:06:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/toward-a-durable-spring-petclinic/</guid><description>&lt;h2 id="h2-0-overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Durable Execution&lt;/strong&gt; is a way of running code so that its progress survives failure. A normal program keeps its state in memory: if the process crashes, the machine reboots, or a network call times out halfway through a multi-step operation, that state is gone and the work is left half-done.&lt;/p&gt;
&lt;p&gt;Temporal, the Durable Execution platform, persists every step of a process to its &lt;strong&gt;Event History&lt;/strong&gt; &amp;mdash; a durable, append-only log of Events &amp;mdash; so that after any failure the work resumes exactly where it left off, as if the crash never happened.&lt;/p&gt;</description></item><item><title>BoxLang 1.15.0 Released: Blazing Fast Strings, Runtime Portability, and much more</title><link>https://foojayio.github.io/website/today/boxlang-1-15-0-released-blazing-fast-strings-runtime-portability-and-much-more/</link><pubDate>Tue, 14 Jul 2026 17:57:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-1-15-0-released-blazing-fast-strings-runtime-portability-and-much-more/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-1-15-0-released-blazing-fast-strings-runtime-portability-and-much-more/boxlang-v1.15.0-700x467.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BoxLang 1.15.0&lt;/strong&gt; is a high-impact release with two big headlines and a long tail of hardening. The first headline is a &lt;strong&gt;massive performance upgrade to string handling&lt;/strong&gt; : a new first-class &lt;code&gt;BoxStringBuilder&lt;/code&gt; type, compile-time literal folding, smarter &lt;code&gt;&amp;amp;=&lt;/code&gt; semantics, and a runtime concat strategy that automatically switches to builder-backed accumulation once your expression gets big enough. Your existing string-heavy code just got faster. No rewrites required.&lt;/p&gt;
&lt;p&gt;The second headline is architectural. Every class loader in the BoxLang runtime and module system has been fully abstracted behind a pluggable &lt;code&gt;IClassLoaderFactory&lt;/code&gt; interface. That single seam is what unlocks the &lt;strong&gt;Android runtime&lt;/strong&gt; and &lt;strong&gt;Ahead-of-Time (AOT) compiled runtimes&lt;/strong&gt; such as GraalVM Native Image that we have on the roadmap. The default behavior is unchanged, but the ceiling just got a lot higher.&lt;/p&gt;</description></item><item><title>Temporal Is to Your Code What a Database Is to Your Data</title><link>https://foojayio.github.io/website/today/temporal-is-to-your-code-what-a-database-is-to-your-data/</link><pubDate>Sat, 11 Jul 2026 10:31:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/temporal-is-to-your-code-what-a-database-is-to-your-data/</guid><description>&lt;p&gt;&lt;strong&gt;Once upon a time, applications managed their own data files. Every program hand-rolled its own locking, its own crash recovery, its own consistency guarantees. Every program did it badly, in its own unique way.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Then the relational database arrived and made a deal with application developers: &lt;em&gt;&lt;strong&gt;you declare what you want, and I guarantee it survives&lt;/strong&gt;.&lt;/em&gt; Atomicity, durability, crash recovery: all of it moved out of application code and into a dedicated platform. Nobody writes their own file-based transaction log anymore.&lt;/p&gt;</description></item><item><title>"This Can't Possibly Work": What I Learned at a Temporal.io Workshop</title><link>https://foojayio.github.io/website/today/this-cant-possibly-work-what-i-learned-at-a-temporal-io-workshop-on-durable-execution/</link><pubDate>Fri, 10 Jul 2026 08:41:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/this-cant-possibly-work-what-i-learned-at-a-temporal-io-workshop-on-durable-execution/</guid><description>&lt;p&gt;&lt;strong&gt;When developers first hear about &lt;a href="https://temporal.io/" target="_blank" rel="noopener noreferrer"&gt;Temporal&lt;/a&gt;
, they tend to move through a predictable sequence of emotions. First comes disbelief &amp;mdash; the claim that your application can crash mid-execution and simply pick up where it left off, variables intact, sounds like nonsense. Then comes irritation that anyone would even say such a thing is possible. Then they try it, discover it actually works, and get very excited. And finally they ask the only question that matters: &lt;em&gt;how?&lt;/em&gt;&lt;/strong&gt;
&lt;img src="https://foojayio.github.io/website/today/this-cant-possibly-work-what-i-learned-at-a-temporal-io-workshop-on-durable-execution/IMG_2977-1024x768.jpeg" alt="" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>Nulling Out References Won't Help Your Garbage Collector</title><link>https://foojayio.github.io/website/today/nulling-out-references-wont-help-your-garbage-collector/</link><pubDate>Thu, 09 Jul 2026 13:49:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/nulling-out-references-wont-help-your-garbage-collector/</guid><description>&lt;p&gt;One of the misconceptions that I continuously run into is that nulling out references in Java helps garbage collection.&lt;/p&gt;
&lt;p&gt;This attitude is particularly prevalent from those developers used to C/C++ where &lt;code&gt;delete ptr&lt;/code&gt; becomes &lt;code&gt;ref = null&lt;/code&gt;. To be fair, it&amp;rsquo;s a reasonable thing to believe.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also wrong, and the way it&amp;rsquo;s wrong tells you most of what&amp;rsquo;s worth knowing about how a tracing collector actually works.&lt;/p&gt;
&lt;p&gt;That is, the vast majority of data allocated in a tracing garbage collected runtime becomes collectable as soon as a variable falls out of scope.&lt;/p&gt;</description></item><item><title>Jurassic JDK: Migrate or Extinct</title><link>https://foojayio.github.io/website/today/jurassic-jdk-migrate-or-extinct/</link><pubDate>Fri, 26 Jun 2026 07:28:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/jurassic-jdk-migrate-or-extinct/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/jurassic-jdk-migrate-or-extinct/1_wul-KqE6vXk4ynnh_IljSQ-1-1024x562.webp" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;65 million years ago, dinosaurs didn&amp;rsquo;t adapt. They&amp;rsquo;re gone. Your JDK 7 app is giving the same energy. 🫠&lt;/p&gt;
&lt;p&gt;I spent a year and a half migrating more than 15 projects in production. Full time. Real teams, real deadlines, real 2am breakage. This is everything I wish someone had written before I started.&lt;/p&gt;
&lt;h2 id="h2-0-why-are-we-still-here"&gt;Why Are We Still Here? 👀&lt;/h2&gt;
&lt;p&gt;Walk into any company with a codebase older than 5 years and you&amp;rsquo;ll hear the same thing:&lt;/p&gt;</description></item><item><title>Quarkus Unpacked: Insights from the Foojay Podcast</title><link>https://foojayio.github.io/website/today/quarkus-unpacked-insights-from-the-foojay-podcast/</link><pubDate>Tue, 23 Jun 2026 12:36:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/quarkus-unpacked-insights-from-the-foojay-podcast/</guid><description>&lt;figure class="alignleft is-resized"&gt;
 &lt;img decoding="async" src="3-Quarkus-Unpacked-2-2.jpeg" alt="Quarkus: A Runtime and Framework for Cloud-Native Java" style="width:300px"&gt;
&lt;/figure&gt;
&lt;p&gt;I recently had the pleasure of joining the &lt;a href="https://www.youtube.com/watch?v=_nJCTTrnZkE" target="_blank" rel="noopener noreferrer"&gt;Foojay podcast&lt;/a&gt;
 to talk about Quarkus in depth. The conversation covered a lot of ground, from what makes Quarkus different to the practical trade-offs between JVM and native mode. This post captures the key questions and answers from that discussion, lightly edited for readability.{#_quarkus_unpacked_insights_from_the_foojay_podcast}&lt;/p&gt;
&lt;p&gt;If you have been following this blog series, note that the third installment on building your own stack with Quarkus is coming next. Consider this a bonus entry that distills the podcast conversation into a format you can read, reference, and share.&lt;/p&gt;</description></item><item><title>Your TLS Stack Is Lying to You About Zero-Copy</title><link>https://foojayio.github.io/website/today/your-tls-stack-is-lying-about-zero-copy/</link><pubDate>Wed, 10 Jun 2026 12:00:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/your-tls-stack-is-lying-about-zero-copy/</guid><description>&lt;h2 id="h2-0-the-no-waste-compute-constraint"&gt;The &amp;ldquo;No Waste Compute&amp;rdquo; Constraint&lt;/h2&gt;
&lt;p&gt;When I started designing the Exeris Kernel, I set one non-negotiable rule very early: no waste compute. That rule sounds like a performance slogan until it starts killing otherwise normal design decisions.&lt;/p&gt;
&lt;p&gt;I had already banned &lt;code&gt;ThreadLocal&lt;/code&gt;, moved context propagation to Scoped Values, and pushed more of the runtime into explicit off-heap ownership. The idea was simple: if the hot path is supposed to stay outside GC pressure, then memory shape and lifetime cannot be treated as incidental details.&lt;/p&gt;</description></item><item><title>BoxLang v1.13.0: Compatibility, Concurrency, and Formatter Maturity</title><link>https://foojayio.github.io/website/today/boxlang-v1-13-0-compatibility-concurrency-and-formatter-maturity/</link><pubDate>Tue, 19 May 2026 12:11:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-v1-13-0-compatibility-concurrency-and-formatter-maturity/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-v1-13-0-compatibility-concurrency-and-formatter-maturity/boxlang-v1.13.0-700x467.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BoxLang 1.13.0&lt;/strong&gt; is a stability-first release with deep compatibility work and runtime hardening. This build closes 48 issues, with the majority focused on CFML compatibility edge cases, concurrency correctness, formatting parity, and miniserver/runtime reliability under real production loads.&lt;/p&gt;
&lt;p&gt;While this release is bug-fix heavy, it still introduces several meaningful features and quality-of-life improvements: character-aware trimming, class metadata lookup by absolute path, process environment control in SystemExecute(), SOAP headers, new query column rename capabilities, and safer miniserver routing/security defaults.&lt;/p&gt;</description></item><item><title>AWS Nitro and CPU Graviton Meets Unikernels</title><link>https://foojayio.github.io/website/today/aws-nitro-and-cpu-graviton-meets-unikernels/</link><pubDate>Fri, 10 Apr 2026 16:26:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/aws-nitro-and-cpu-graviton-meets-unikernels/</guid><description>&lt;h2 id="h2-0-aws-nitro-and-cpu-graviton-meets-unikernels-java-and-quarkus-on-arm64-aws-graviton-with-nanos-unikernel"&gt;AWS Nitro and CPU Graviton Meets Unikernels: Java and Quarkus on ARM64 AWS Graviton with Nanos Unikernel&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://github.com/user-attachments/assets/2c957ea8-2c6b-4caa-86f8-5adeb9e8bedc" alt="image" loading="lazy"&gt;
&lt;/p&gt;
&lt;h2 id="h2-1-java-and-jakarta-ee-truly-meet-unikernels"&gt;Java and Jakarta EE Truly Meet Unikernels&lt;/h2&gt;
&lt;p&gt;The key message of this article is simple and strong:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;any Java or Jakarta EE application is already ready&lt;/strong&gt; to benefit from the advantages of unikernels.&lt;/p&gt;
&lt;p&gt;Java and Jakarta EE, including modern frameworks such as Quarkus, can immediately take advantage of the unikernel model &lt;strong&gt;without waiting for new languages, new runtimes, or radical rewrites&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Thread Safe Native Memory in Java</title><link>https://foojayio.github.io/website/today/java-native-memory-access-modes/</link><pubDate>Tue, 07 Apr 2026 10:00:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-native-memory-access-modes/</guid><description>&lt;h2 id="h2-0-what-is-memory-order-and-why-does-it-matter-for-native-memory"&gt;What is Memory Order and Why Does It Matter for Native Memory?&lt;/h2&gt;
&lt;p&gt;The Foreign Function and Memory (FFM) API is Java&amp;rsquo;s way of interacting with native code and memory. In the previous post, you learned how to do so using Java&amp;rsquo;s built-in &lt;code&gt;Arena&lt;/code&gt; types. The Arena provides temporal safety and bounds checks, but what about thread safety? MemorySegments created by &lt;code&gt;.ofShared()&lt;/code&gt;, &lt;code&gt;.auto()&lt;/code&gt;, and &lt;code&gt;.global()&lt;/code&gt; can be used by multiple threads at the same time. Using a VarHandle with just get/set can backfire if you don&amp;rsquo;t use something like locking. The downside is that locks are slow and heavy. So let us take a look at a more granular, hardware-aware approach: using VarHandle access modes.&lt;/p&gt;</description></item><item><title>TestBox 7: Real-Time Feedback, a Browser-Based IDE, and Modern Testing Workflows on the JVM</title><link>https://foojayio.github.io/website/today/testbox-7-real-time-feedback-a-browser-based-ide-and-modern-testing-workflows-on-the-jvm/</link><pubDate>Tue, 24 Mar 2026 16:58:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/testbox-7-real-time-feedback-a-browser-based-ide-and-modern-testing-workflows-on-the-jvm/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/testbox-7-real-time-feedback-a-browser-based-ide-and-modern-testing-workflows-on-the-jvm/testbox-7-1-700x467.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;TestBox 7.x focuses on improving testing workflows for BoxLang and CFML applications. This release introduces improvements to the &lt;strong&gt;BoxLang CLI runner&lt;/strong&gt; , real-time &lt;strong&gt;streaming test execution via SSE&lt;/strong&gt; , &lt;strong&gt;dry run&lt;/strong&gt; capabilities, a browser-based &lt;strong&gt;TestBox RUN&lt;/strong&gt; interface, and several developer experience enhancements.&lt;/p&gt;
&lt;p&gt;Check out the what&amp;rsquo;s new here: &lt;a href="https://testbox.ortusbooks.com/readme/release-history/whats-new-with-7.0.0" target="_blank" rel="noopener noreferrer"&gt;https://testbox.ortusbooks.com/readme/release-history/whats-new-with-7.0.0&lt;/a&gt;
&lt;/p&gt;
&lt;h4 id="testbox-run-a-browser-ide-for-your-tests"&gt;TestBox RUN: A Browser IDE for Your Tests&lt;/h4&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/testbox-7-real-time-feedback-a-browser-based-ide-and-modern-testing-workflows-on-the-jvm/image-700x155.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;The centerpiece of TestBox 7 is &lt;strong&gt;TestBox RUN&lt;/strong&gt; : a self-hosted, single-page web app (&lt;code&gt;bx/tests/index.bxm&lt;/code&gt;) that you drop into any &lt;strong&gt;BoxLang&lt;/strong&gt; project and open in a browser. No build toolchain. No external service. Just BoxLang.&lt;/p&gt;</description></item><item><title>Native Memory in Java: Arenas, Malloc, and Pools</title><link>https://foojayio.github.io/website/today/java-native-memory-allocation-ffm-api/</link><pubDate>Fri, 20 Mar 2026 10:20:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-native-memory-allocation-ffm-api/</guid><description>&lt;h2 id="h2-0-what-is-the-memory-api"&gt;What is the Memory API&lt;/h2&gt;
&lt;p&gt;The Foreign Function &amp;amp; Memory (FFM) API is Java&amp;rsquo;s new way of interacting with native code and memory. It is mostly useful when storing data off-heap or passing arguments to a native method. Handling this native memory comes down to balancing how much control you need against the risk of memory leaks. You can rely on the provided &lt;code&gt;Arena&lt;/code&gt;s to bind memory to safe scopes, or you do it yourself using &lt;code&gt;malloc&lt;/code&gt; and &lt;code&gt;free&lt;/code&gt; for absolute control, or implement custom pools and slices to optimize allocations for your use case.&lt;/p&gt;</description></item><item><title>How is Leyden improving Java Performance? Part 3 of 3</title><link>https://foojayio.github.io/website/today/how-is-leyden-improving-java-performance-part-3-of-3/</link><pubDate>Thu, 19 Mar 2026 12:10:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-is-leyden-improving-java-performance-part-3-of-3/</guid><description>&lt;p&gt;In part 1 of this series of 3 blog posts we introduced the specific performance challenges OpenJDK faces lowering application &amp;lsquo;startup&amp;rsquo;, &amp;lsquo;warmup&amp;rsquo; and &amp;lsquo;initial footprint&amp;rsquo; costs and provided an overview of what Leyden is doing to address those challenges.&lt;/p&gt;
&lt;p&gt;Part 2 described how to use the new capabilities offered by Leyden and presented test results which show that very significant progress has already been made and is set to continue.&lt;/p&gt;</description></item><item><title>How is Leyden improving Java Performance? Part 2 of</title><link>https://foojayio.github.io/website/today/how-is-leyden-improving-java-performance-part-2-of-3/</link><pubDate>Wed, 18 Mar 2026 12:05:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-is-leyden-improving-java-performance-part-2-of-3/</guid><description>&lt;p&gt;In part 1 of this series of 3 blog posts we introduced the specific performance challenges OpenJDK faces lowering application &amp;lsquo;startup&amp;rsquo;, &amp;lsquo;warmup&amp;rsquo; and &amp;lsquo;initial footprint&amp;rsquo; costs and provided an overview of what Leyden is doing to address those challenges.&lt;/p&gt;
&lt;p&gt;Part 2 describes how to use the new AOT capabilities offered by Leyden and presents test results which show that very significant progress has already been made and is set to continue.&lt;/p&gt;</description></item><item><title>How is Leyden improving Java Performance? Part 1 of 3</title><link>https://foojayio.github.io/website/today/how-is-leyden-improving-java-performance-part-1-of-3/</link><pubDate>Tue, 17 Mar 2026 12:00:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-is-leyden-improving-java-performance-part-1-of-3/</guid><description>&lt;p&gt;In this series of 3 blog posts we will explain how OpenJDK project Leyden is helping to improve a specific area of performance where Java has notably lagged behind other languages i.e. application &amp;lsquo;startup&amp;rsquo;, &amp;lsquo;warmup&amp;rsquo;, and &amp;lsquo;initial footprint&amp;rsquo;.&lt;/p&gt;
&lt;p&gt;Part 1 explains what those terms mean and why Java faces challenges in matching the behaviour of other languages. It then provides an overview of what Leyden has done to improve startup and warmup in existing JDK releases and what is planned for upcoming releases.&lt;/p&gt;</description></item><item><title>BoxLang 1.11.0 Release</title><link>https://foojayio.github.io/website/today/boxlang-1-11-0-release/</link><pubDate>Tue, 17 Mar 2026 09:40:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-1-11-0-release/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-1-11-0-release/boxlang-v1.11.0-700x467.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re proud to announce &lt;strong&gt;BoxLang 1.11.0&lt;/strong&gt;, a highly focused performance and stability release that delivers measurable speed improvements across every BoxLang application, with zero code changes required. The team invested deeply in bytecode generation, class loading, lock management, and type casting to produce one of the most impactful runtime optimization releases to date. Alongside the performance wave, this release resolves critical concurrency bugs, hardens DateTime handling, and ships powerful new developer tooling.&lt;/p&gt;</description></item><item><title>I Benchmarked Java on Single-Board Computers: Orange Pi 5 Ultra and Raspberry Pi 5 Lead the Pack</title><link>https://foojayio.github.io/website/today/java-benchmarks-on-single-board-computers/</link><pubDate>Wed, 04 Mar 2026 06:52:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-benchmarks-on-single-board-computers/</guid><description>&lt;hr&gt;
&lt;p&gt;In my &amp;ldquo;Java on Single Board Computers&amp;rdquo; series, I already published several posts and videos in which I unpack the board, connect it for the first time, and try to install and run some simple Java code. In this post, I want to share some benchmarks of Java on these boards to get a better idea of the performance we can expect from Java on these platforms.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/efLS8pBtqZ0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;p&gt;Already published in this series:&lt;/p&gt;</description></item><item><title>JC-AI Newsletter #14</title><link>https://foojayio.github.io/website/today/jc-ai-newsletter-14/</link><pubDate>Tue, 03 Mar 2026 15:11:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/jc-ai-newsletter-14/</guid><description>&lt;p&gt;&lt;strong&gt;Two&lt;/strong&gt; weeks have passed and a lot have been happening on the field of artificial-intelligence.&lt;/p&gt;
&lt;p&gt;Two weeks have passed and a lot has been silently yet visibly happening in the field of artificial intelligence. This newsletter brings interesting developments, including Dario Amodei&amp;rsquo;s (Anthropic) view on the progress achieved in the LLM field and his response to the utilization of these models for specific kinds of military purposes, as well as OpenAI&amp;rsquo;s response to it. Aside from the fact that development may follow more sigmoids instead of exponential progress, it is important to have awareness of utilization across branches. Does prompting and clarifying the goal influence agent responses, and if so, how? How far are we from reliable robotics applications? How much bias is introduced when clinical data is being analyzed?&lt;/p&gt;</description></item><item><title>Runtime Code Analysis in the Age of Vibe Coding</title><link>https://foojayio.github.io/website/today/runtime-code-analysis-in-the-age-of-vibe-coding/</link><pubDate>Tue, 17 Feb 2026 14:00:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/runtime-code-analysis-in-the-age-of-vibe-coding/</guid><description>&lt;p&gt;In the era of &lt;strong&gt;vibe coding&lt;/strong&gt;&amp;mdash;where large amounts of code are introduced or refactored in short bursts, often with the help of LLMs&amp;mdash;you need immediate feedback on how new logic actually executes. Not comprehensive analysis. Not nanosecond-precise timing. Just a quick confirmation that your loops aren&amp;rsquo;t spinning 10,000x more than they should.&lt;/p&gt;
&lt;p&gt;However, traditional profilers can feel like overkill for quick validation. In addition, they present results at method/stack granularity and require context-switching to interpret. They also introduce overhead, ranging from negligible (e.g., JFR/sampling) to noticeable (call tracing/instrumentation). As a result, they are less convenient as always-on feedback during rapid iteration.&lt;/p&gt;</description></item><item><title>Unikernel: Profiling and Troubleshooting JVM on Nanos Unikernel</title><link>https://foojayio.github.io/website/today/unikernel-profiling-and-troubleshooting-jvm-on-nanos-unikernel/</link><pubDate>Wed, 11 Feb 2026 13:50:41 +0000</pubDate><guid>https://foojayio.github.io/website/today/unikernel-profiling-and-troubleshooting-jvm-on-nanos-unikernel/</guid><description>&lt;h3 id="h3-0-profiling-a-java-application-running-inside-an-unikernel-with-jprofiler"&gt;Profiling a Java Application Running Inside an Unikernel with JProfiler&lt;/h3&gt;
&lt;p&gt;Unikernels are often associated with minimalism and tight resource control.&lt;/p&gt;
&lt;p&gt;But can we profile a Java application running inside a unikernel using a standard JVM profiler?&lt;/p&gt;
&lt;p&gt;The answer is yes.&lt;/p&gt;
&lt;p&gt;In this guide, we will walk step by step through profiling a Quarkus&lt;/p&gt;
&lt;p&gt;application running inside a Nanos unikernel using &lt;strong&gt;JProfiler&lt;/strong&gt; and&lt;br&gt;
&lt;strong&gt;IBM Semeru JRE 25 (OpenJ9)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;No special hacks. Just standard JVM tooling.&lt;/p&gt;</description></item><item><title>Webinar: "Moving Applications From JDK 21 to JDK 25: What You Need to Know"</title><link>https://foojayio.github.io/website/today/webinar-moving-applications-from-jdk-21-to-jdk-25-what-you-need-to-know/</link><pubDate>Mon, 26 Jan 2026 14:14:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/webinar-moving-applications-from-jdk-21-to-jdk-25-what-you-need-to-know/</guid><description>&lt;p&gt;JDK 25 has arrived as the latest long-term support (LTS) release for Java, bringing performance improvements and enhanced stability for modern applications. If your organization is running JDK 21, now is the time to start planning your migration path.&lt;/p&gt;
&lt;h2 id="h2-0-why-upgrade"&gt;Why Upgrade?&lt;/h2&gt;
&lt;p&gt;Each new LTS release represents years of refinements, optimizations, and new capabilities. JDK 25 builds on the foundation of JDK 21 while delivering the reliability that enterprise applications demand. But understanding what&amp;rsquo;s changed&amp;mdash;and what might break&amp;mdash;is essential for a smooth transition.&lt;/p&gt;</description></item><item><title>Get high performance Java applications with IBM Semeru Runtimes</title><link>https://foojayio.github.io/website/today/high-performance-java-semeru/</link><pubDate>Tue, 20 Jan 2026 13:53:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/high-performance-java-semeru/</guid><description>&lt;p&gt;Originally published at &lt;a href="https://developer.ibm.com/articles/j-java-performance/" title="developer.ibm.com" target="_blank" rel="noopener noreferrer"&gt;developer.ibm.com&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;By Vijay Sundaresan, Mark Stoodley, Marius Pirvu, Grace Robinson, Laura Cowen&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Explore real‑world benchmarks, tuning options, and best‑practice strategies to optimize latency, throughput, and memory on modern hardware with Semeru Runtimes, an OpenJDK distribution.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When running applications in the cloud, performance matters. An application that handles more requests with less CPU and memory is cheaper to run. Java and its associated frameworks are widely appreciated for stability, throughput performance, and portability but not typically recognized for starting quickly, ramping up quickly, or consuming resources frugally. These limitations can pose significant challenges, especially when migrating Java applications to the cloud or developing new cloud-native Java solutions where more resources immediately make deployments more expensive.&lt;/p&gt;</description></item><item><title>JC-AI Newsletter #12</title><link>https://foojayio.github.io/website/today/jc-ai-newsletter-12/</link><pubDate>Wed, 14 Jan 2026 07:15:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/jc-ai-newsletter-12/</guid><description>&lt;p&gt;&lt;strong&gt;F&lt;/strong&gt; irst of all, &lt;strong&gt;Happy New Year 2026!&lt;/strong&gt; This year is designated in the Chinese Calendar as the Year of the Fire Horse (starting on February 17.). The year 2026 brings not only tremendous energy to AI development but also, in my humble opinion, many breakthroughs in the field.&lt;/p&gt;
&lt;p&gt;Although there have been many small steps toward the field&amp;rsquo;s evolution, it often feels that development is stagnating, applying known or slightly tweaked strategies to non-deterministic problems while expecting deterministic results. This includes the often misleading benchmarking strategies (deterministic) performed on synthetic datasets.&lt;/p&gt;</description></item><item><title>Java Warmup and the Scaling Loop Problem</title><link>https://foojayio.github.io/website/today/java-warmup-and-the-scaling-loop-problem/</link><pubDate>Wed, 07 Jan 2026 06:50:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-warmup-and-the-scaling-loop-problem/</guid><description>&lt;p&gt;In cloud environments with auto-scaling, a &amp;ldquo;scaling loop&amp;rdquo; can make Java application warmup even worse. It can cause you to run unnecessary instances. Even worse, Java warmup might never end. Fortunately, there are four reliable fixes for this issue.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;In this post you will learn:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;High CPU during startup triggers auto-scaling and spins up more instances&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;One solution is to give the compiler more resources&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;A second solution is to &lt;em&gt;lower the compilation threshold&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;A third solution is to use the ReadyNow feature in Azul Platform Prime to start fast every time&lt;/li&gt;
&lt;li&gt;In a fourth solution, we add Azul&amp;rsquo;s Optimizer Hub to offload compilations to dedicated hardware&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;You&amp;rsquo;ve probably noticed it: You start a Java application and the CPU usage spikes. It remains high for a while, then gradually settles. That&amp;rsquo;s the warmup phase, and it&amp;rsquo;s completely normal. But in cloud environments with auto-scaling, it creates a nasty problem. High CPU during startup triggers auto-scaling. More instances spin up. Those new instances also undergo this warmup phase with high CPU utilization. More scaling gets triggered. You see where this is going? Let&amp;rsquo;s call it the &amp;ldquo;scaling loop problem,&amp;rdquo; and it&amp;rsquo;s both expensive and frustrating.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Optimizing Java for the Cloud-Native Era with Quarkus</title><link>https://foojayio.github.io/website/today/optimizing-java-for-the-cloud-native-era-with-quarkus/</link><pubDate>Tue, 06 Jan 2026 21:09:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/optimizing-java-for-the-cloud-native-era-with-quarkus/</guid><description>&lt;p&gt;This article explores how Quarkus can help organizations reduce costs, streamline development, and modernize their Java applications for today&amp;rsquo;s cloud-native environments. It outlines the real-world benefits of adopting Quarkus and highlights how its core features address the performance and scalability challenges commonly associated with traditional Java frameworks.&lt;/p&gt;
&lt;p&gt;Quarkus is already being adopted across industries. One example is Orange, a global telecom provider that selected Quarkus to support its 5G API initiative, and benefited from fast startup times, a lightweight footprint, and seamless integration with Kubernetes.&lt;/p&gt;</description></item><item><title>Java and Jakarta EE and the Evolution of the Cloud with Nanos Unikernel</title><link>https://foojayio.github.io/website/today/java-jakarta-ee-and-the-evolution-of-the-cloud-with-nanos-unikernel/</link><pubDate>Tue, 06 Jan 2026 20:51:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-jakarta-ee-and-the-evolution-of-the-cloud-with-nanos-unikernel/</guid><description>&lt;p&gt;The evolution of the Java and Jakarta Enterprise ecosystem is converging toward an increasingly simple, efficient, and scalable architecture that improves security, delivers higher performance, and reduces hardware and infrastructure costs.&lt;/p&gt;
&lt;p&gt;For years, Kubernetes has been considered the de‑facto standard for modernizing Java applications in a cloud‑native direction. However, Kubernetes is not the only way to achieve scalability, continuous upgrades, and isolation. An alternative approach &amp;mdash; often underestimated &amp;mdash; is to leverage the &lt;strong&gt;hypervisors already included and fully managed by major cloud providers&lt;/strong&gt; , using &lt;strong&gt;Unikernel&lt;/strong&gt; images based on &lt;a href="https://nanovms.com" target="_blank" rel="noopener noreferrer"&gt;&lt;strong&gt;Nanos&lt;/strong&gt;&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Make Java Fleets Warm Up Faster on AWS With Azul Optimizer Hub</title><link>https://foojayio.github.io/website/today/make-java-fleets-warm-up-faster-on-aws-with-azul-optimizer-hub/</link><pubDate>Thu, 18 Dec 2025 08:35:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/make-java-fleets-warm-up-faster-on-aws-with-azul-optimizer-hub/</guid><description>&lt;p&gt;&lt;em&gt;Traditional Java executes code in slower interpreted mode, known as Java warmup, until it can build an optimized profile. This means it can only start optimizing once the application takes traffic and touches the critical code paths. Just when you are scaling out for a large bump in traffic, your machines are running at their slowest and are splitting their available CPU power between handling requests and performing expensive JIT optimizations&lt;/em&gt;&lt;/p&gt;</description></item><item><title>More Java From Azul!</title><link>https://foojayio.github.io/website/today/more-java-from-azul/</link><pubDate>Wed, 10 Dec 2025 17:14:23 +0000</pubDate><guid>https://foojayio.github.io/website/today/more-java-from-azul/</guid><description>&lt;p&gt;&lt;strong&gt;Azul is a company focused purely on Java through builds of OpenJDK, in the form of Platform Core, and our high-performance Java platform (including JVM), Platform Prime. We build on these with Intelligence Cloud to deliver precise information about security vulnerabilities in running code, unused code and an inventory of all JVMs in use.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When looking at expanding the company through acquisition, we obviously wanted to maintain that dedication to all things Java, so what better company than Payara?&lt;/p&gt;</description></item><item><title>The Art of Performance Tuning: Why Saving 30% in the Cloud Means Nothing if Your Code Wastes 1000× More</title><link>https://foojayio.github.io/website/today/the-art-of-performance-tuning-why-saving-30-in-the-cloud-means-nothing-if-your-code-wastes-1000x-more/</link><pubDate>Tue, 25 Nov 2025 06:46:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-art-of-performance-tuning-why-saving-30-in-the-cloud-means-nothing-if-your-code-wastes-1000x-more/</guid><description>&lt;h2 id="h2-0-the-hidden-cost-of-good-enough-code"&gt;The Hidden Cost of &amp;ldquo;Good Enough&amp;rdquo; Code&lt;/h2&gt;
&lt;p&gt;A few weeks ago, Kirk Pepperdine published a fascinating performance challenge &amp;mdash; a small Java code snippet that appeared trivial but produced puzzling runtime behavior.&lt;/p&gt;
&lt;p&gt;He invited readers to take a shot at solving it. If you haven&amp;rsquo;t seen it yet, stop here for a moment and try it yourself &amp;mdash; and when you&amp;rsquo;re done, check his Kirk&amp;rsquo;s official solution&lt;/p&gt;
&lt;p&gt;When I saw it, I thought it would be a fun exercise to revisit some fundamentals &amp;mdash; but the deeper I went, the more I realized it wasn&amp;rsquo;t just about performance. It was about how we think.&lt;/p&gt;</description></item><item><title>Java Security Starts with the JVM</title><link>https://foojayio.github.io/website/today/java-security-starts-with-the-jvm/</link><pubDate>Mon, 10 Nov 2025 12:37:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-security-starts-with-the-jvm/</guid><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;When it comes to Java security, the first thing that comes to mind should be the JVM. If you&amp;rsquo;re relying on outdated, unpatched, or unsupported Java runtimes, you&amp;rsquo;re taking unnecessary risks.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;In this article, you will learn:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Timely, predictable updates are critical for Java security&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Long-term security hinges on long-term support&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;If your Java runtime is compromised, every application that runs on it could be compromised too&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;As environments become cluttered with multiple JDK versions and unpatched workloads, organizations lose visibility into what&amp;rsquo;s deployed&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When it comes to securing your Java applications, the JVM might not be the first thing that comes to mind&amp;mdash;but it should be. Your JDK isn&amp;rsquo;t just a runtime; it&amp;rsquo;s part of your software supply chain. If you&amp;rsquo;re relying on outdated, unpatched, or unsupported Java runtimes, you&amp;rsquo;re taking unnecessary risks.&lt;/p&gt;</description></item><item><title>JC-AI Newsletter: Easy Access to Expanding Challenges</title><link>https://foojayio.github.io/website/today/jc-ai-newsletter-easy-access-to-expanding-challenges/</link><pubDate>Tue, 04 Nov 2025 18:13:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/jc-ai-newsletter-easy-access-to-expanding-challenges/</guid><description>&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt; few months ago, I launched the &lt;a href="https://foojayio.github.io/website/today/category/jc-ai-newsletter/"&gt;AI Newsletter&lt;/a&gt;
 to provide a minimally biased perspective on the growing challenges surrounding artificial intelligence.&lt;/p&gt;
&lt;p&gt;My primary motivation was and remains to be serving the community not only by showing how to use and access specific services for utilizing Large Language Models, but also by support a deeper understanding of the broader artificial intelligence landscape.&lt;/p&gt;
&lt;p&gt;Many of the core challenges that have emerged around LLMs have not been and still not properly addressed, often omitted due to their uncomfortable implications.&lt;/p&gt;</description></item><item><title>What Happens When 10,000 JVMs Collaborate</title><link>https://foojayio.github.io/website/today/what-happens-when-10000-jvms-collaborate-in-one-production-environment/</link><pubDate>Mon, 13 Oct 2025 07:03:51 +0000</pubDate><guid>https://foojayio.github.io/website/today/what-happens-when-10000-jvms-collaborate-in-one-production-environment/</guid><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;A large global enterprise achieved a performance and efficiency milestone, running 10,000 Java Virtual Machines (JVMs) that collaborate and share optimizations with one another, using Azul Platform Prime&amp;rsquo;s Optimizer Hub. The enterprise improved application responsiveness and stability at scale while reducing infrastructure costs, which has resulted in better user experiences and greater business efficiency.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;In this post you will learn: how&lt;/em&gt;&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;A global enterprise sustained rising cloud costs to support the company&amp;rsquo;s ongoing success&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Azul Platform Prime with Optimizer Hub is delivering cloud cost savings of more than 20%&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Optimizer Hub is improving cloud-centric Java application startup, warmup and runtime performance by offloading optimization tasks from JVMs to a centralized set of services&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Earlier this year, an &lt;a href="https://www.azul.com/products/prime/" target="_blank" rel="noopener noreferrer"&gt;Azul Platform Prime&lt;/a&gt;
 enterprise customer achieved something no other organization has ever accomplished: seamless collaboration between more than 10,000 JVMs across hundreds of applications using a single instance of Platform Prime&amp;rsquo;s Optimizer Hub. In case you&amp;rsquo;re wondering, here&amp;rsquo;s why that&amp;rsquo;s big news.&lt;/p&gt;</description></item><item><title>Take the State of Java 2025 Survey</title><link>https://foojayio.github.io/website/today/take-the-state-of-java-2025-survey/</link><pubDate>Mon, 06 Oct 2025 12:23:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/take-the-state-of-java-2025-survey/</guid><description>&lt;p&gt;Do you want to know which Java JDK distribution is used where for what and when? The time has come again to take the State of Java Survey and share insights while gaining Java ecosystem knowledge.&lt;/p&gt;
&lt;p&gt;All those participating will get the complete research, which can be of great benefit in your technology choices in the Java ecosystem.&lt;/p&gt;
&lt;p&gt;Click the image below to get started:
&lt;a href="https://survey.alchemer.com/s3/8466906/Azul-State-of-Java-Survey" target="_blank" rel="noopener noreferrer"&gt;&lt;img src="https://foojayio.github.io/website/today/take-the-state-of-java-2025-survey/which-1024x387.png" alt="" loading="lazy"&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Or simply click this link:&lt;/p&gt;</description></item><item><title>Azul’s High-Performance Java Platform Achieves Historic First</title><link>https://foojayio.github.io/website/today/azuls-high-performance-java-platform-achieves-historic-first-with-10000-customer-jvms-collaborating-and-sharing-performance-optimizations-cutting-cloud-costs-by-20/</link><pubDate>Wed, 17 Sep 2025 16:49:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/azuls-high-performance-java-platform-achieves-historic-first-with-10000-customer-jvms-collaborating-and-sharing-performance-optimizations-cutting-cloud-costs-by-20/</guid><description>&lt;p&gt;&lt;strong&gt;Azul Platform Prime Achieves Historic First with 10,000+ JVMs Collaborating and Sharing Performance Optimizations, Cutting Cloud Costs by More than 20%&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Fleet-level advantages achieved for cloud-native Java applications with faster warm-up, smoother scaling and reduced cost&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SUNNYVALE, Calif. &amp;mdash; September 17, 2025 &amp;mdash;&lt;/strong&gt; &lt;a href="https://www.azul.com/" target="_blank" rel="noopener noreferrer"&gt;Azul&lt;/a&gt;
, the only company 100% focused on Java, today announced a breakthrough in cloud deployment at scale with &lt;a href="https://www.azul.com/products/prime/" target="_blank" rel="noopener noreferrer"&gt;Azul Platform Prime&lt;/a&gt;
, its high-performance Java platform. A leading global enterprise has deployed hundreds of applications and micro-services across more than 10,000 Java Virtual Machines (JVMs) using Platform Prime&amp;rsquo;s Optimizer Hub, a unique capability that allows JVMs to collaborate and share performance optimizations.&lt;/p&gt;</description></item><item><title>JetBrains and Azul Collaborate on Kotlin Performance in Various JVMs</title><link>https://foojayio.github.io/website/today/jetbrains-and-azul-collaborate-on-kotlin-performance-in-various-jvms/</link><pubDate>Wed, 10 Sep 2025 07:11:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/jetbrains-and-azul-collaborate-on-kotlin-performance-in-various-jvms/</guid><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;JetBrains and Azul are collaborating on a shared vision of running Kotlin-generated bytecode on a high-performance &lt;a href="https://www.azul.com/" target="_blank" rel="noopener noreferrer"&gt;Java platform&lt;/a&gt;
 to find new ways to enhance runtime performance. Benchmarks of Kotlin performance on Azul Platform Prime have yielded some eye-opening results.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;In this article you will learn:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Kotlin is a high-level programming language designed to interoperate fully with the JVM&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Runtime performance and scalability are derived predominantly from the JVM&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;JetBrains and Azul benchmarked Kotlin on both standard OpenJDK and on Azul Platform Prime, a high-performance &lt;a href="https://www.azul.com/" target="_blank" rel="noopener noreferrer"&gt;Java platform&lt;/a&gt;
&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Platform Prime reduced latencies by 23.9% and improved throughput by as much as 30.5%&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As modern JVMs combine language features and runtime optimizations, they unlock new levels of performance.&lt;/p&gt;</description></item><item><title>Boosting Kafka Latency Performance by 3x with Zing JVM and AutoMQ</title><link>https://foojayio.github.io/website/today/boosting-kafka-latency-performance-by-3x-with-zing-jvm-and-automq/</link><pubDate>Fri, 29 Aug 2025 12:57:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/boosting-kafka-latency-performance-by-3x-with-zing-jvm-and-automq/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boosting-kafka-latency-performance-by-3x-with-zing-jvm-and-automq/kafka-with-zing-and-automq.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;h2 id="h2-0-why-is-latency-so-important-to-kafka"&gt;Why is Latency so Important to Kafka?&lt;/h2&gt;
&lt;p&gt;The importance of low latency in Kafka stems from the use cases it enables. Many applications that rely on Kafka are time-sensitive.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Real-time applications&lt;/strong&gt;, such as financial trading platforms, fraud detection systems, and real-time monitoring services, depend on obtaining the most current information available. A delay of even a few seconds could mean the difference between a successful trade and a missed opportunity, or a prevented fraudulent transaction and a financial loss.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User experience&lt;/strong&gt; is another area where latency plays a significant role. Think about in-app notifications, live-updating dashboards, or multiplayer games. A snappy, responsive system feels good to use. Sluggishness, on the other hand, can be a significant turn-off for users.&lt;/li&gt;
&lt;li&gt;From an &lt;strong&gt;operational perspective&lt;/strong&gt;, latency is a key indicator of health for your Kafka cluster. A spike in latency can be an early warning sign of a problem, such as a network bottleneck or a slow consumer, which can lead to message backlogs and system instability if left unaddressed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Maintaining low latency in the cloud with traditional Kafka is challenging. Its architecture couples compute and storage, making scaling slow and expensive due to data rebalancing. This creates a complex trade-off between high costs from overprovisioning and poor performance during traffic spikes. To solve this, new cloud-native streaming systems have emerged with a different architectural approach.&lt;/p&gt;</description></item><item><title>Preparing for Spring Boot 4 and Spring Framework 7: What’s New?</title><link>https://foojayio.github.io/website/today/preparing-for-spring-framework-7-and-spring-boot-4/</link><pubDate>Mon, 11 Aug 2025 14:42:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/preparing-for-spring-framework-7-and-spring-boot-4/</guid><description>&lt;p&gt;&lt;strong&gt;I&amp;rsquo;m a passionate Spring Framework and Spring Boot enthusiast, and I always look forward to exploring and experimenting with the latest features and improvements they introduce. With Spring Boot 4 and Spring Boot Framework 7 right around the corner, now&amp;rsquo;s the perfect time to dive into the key enhancements that will shape the future of modern Java and enterprise application development.&lt;/strong&gt;
&lt;img src="https://foojayio.github.io/website/today/preparing-for-spring-framework-7-and-spring-boot-4/SpringImage.jpg" alt="Spring Boot 4" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;In this blog post, we will discuss some key features enhanced as part of Spring Framework 7 and Spring Boot 4.&lt;/p&gt;</description></item><item><title>Sustainability Starts with Your Runtime: Meet a Green JVM</title><link>https://foojayio.github.io/website/today/sustainability-starts-with-your-runtime-meet-a-green-jvm/</link><pubDate>Tue, 15 Jul 2025 14:20:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/sustainability-starts-with-your-runtime-meet-a-green-jvm/</guid><description>&lt;p&gt;&lt;strong&gt;Reducing spend in the cloud is a top priority for many organizations, and a high-performance Java platform can help cloud cost reduction efforts. These same optimizations can help organizations achieve sustainability goals, including achieving carbon net-zero. And pursuing sustainability goals can also lead to financial advantages.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cloud costs are under the microscope, and reducing spend in the cloud is a top priority for many organizations. We&amp;rsquo;ve been helping customers on that journey with Azul Platform Prime, a &lt;a href="https://www.azul.com/blog/5-ways-to-reduce-cloud-waste/" target="_blank" rel="noopener noreferrer"&gt;high-performance Java platform that runs code faster, uses fewer compute resources, and helps cut your cloud bill&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Prime Time: The High Performance Java Event</title><link>https://foojayio.github.io/website/today/prime-time-the-high-performance-java-event/</link><pubDate>Tue, 08 Jul 2025 07:05:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/prime-time-the-high-performance-java-event/</guid><description>&lt;p&gt;&lt;strong&gt;Java is the engine behind mission-critical applications and end user experiences. From faster response times to consistent performance, Java can have a significant impact on business results and cloud costs.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Join Azul and leading voices from the Java community for Prime Time, a dynamic virtual event dedicated to innovations, strategies, and real-world insights that power high-performance Java estates. No matter where you&amp;rsquo;re running your apps &amp;ndash; on-prem or in the cloud, or if you&amp;rsquo;re looking to modernize legacy Java workloads &amp;ndash; when performance, elasticity, scale and cloud cost matter, &lt;strong&gt;Make It Prime&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>When ReadyNow Can Only Compile on Traffic Loads</title><link>https://foojayio.github.io/website/today/when-readynow-can-only-compile-on-traffic-loads/</link><pubDate>Fri, 04 Jul 2025 19:36:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/when-readynow-can-only-compile-on-traffic-loads/</guid><description>&lt;p&gt;&lt;em&gt;This is the fifth and final blog post in a series on faster Java application warmup with ReadyNow. If you haven&amp;rsquo;t been following the series, go back to the first blog post, &lt;a href="https://foojayio.github.io/website/today/faster-java-warmup-crac-versus-readynow/"&gt;Faster Java Warmup: CRaC versus ReadyNow&lt;/a&gt;
, and catch up. This post examines how to resolve a situation when traffic loads and gets redirected to an application before ReadyNow has completed compiling and optimizing bytecode.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;ReadyNow enables applications to handle load optimally by compiling bytecode to native code shortly after startup. It also optimizes the compiled code by removing unused pathways, inlining, etc. But this compiling and optimizing can&amp;rsquo;t be fully executed in specific situations before traffic gets redirected to the application.&lt;/p&gt;</description></item><item><title>Improve Your Java Applications’ Startup and Compilation Speed with Optimizer Hub</title><link>https://foojayio.github.io/website/today/improve-your-java-applications-startup-and-compilation-speed-with-optimizer-hub/</link><pubDate>Fri, 27 Jun 2025 09:35:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/improve-your-java-applications-startup-and-compilation-speed-with-optimizer-hub/</guid><description>&lt;p&gt;&lt;em&gt;This is the fourth blog post in a series on faster Java application warmup with ReadyNow. If you haven&amp;rsquo;t been following the series, go back to the first blog post, &lt;a href="https://foojayio.github.io/website/today/faster-java-warmup-crac-versus-readynow/"&gt;Faster Java Warmup: CRaC versus ReadyNow&lt;/a&gt;
, and catch up. This post examines Optimizer Hub, a set of services external to the JVM within Azul Platform Prime that you can run in your cloud or on-premises environment&lt;/em&gt; to improve your applications&amp;rsquo; startup and compilation speed*.*&lt;/p&gt;</description></item><item><title>Benchmark and profiling Java with JMH</title><link>https://foojayio.github.io/website/today/benchmarking-and-profiling-java-with-jmh/</link><pubDate>Tue, 24 Jun 2025 21:49:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/benchmarking-and-profiling-java-with-jmh/</guid><description>&lt;h2 id="h2-0-introduction-why-jmh"&gt;Introduction: Why JMH?&lt;/h2&gt;
&lt;p&gt;Performance matters in Java applications, but measuring it accurately is harder than you might think. I&amp;rsquo;ve seen countless developers try to measure performance by wrapping code in System.currentTimeMillis() calls or using simple timing loops, only to get misleading results due to JVM optimizations, garbage collection, or just mistakes during measurement.&lt;/p&gt;
&lt;p&gt;The JVM is incredibly good at optimizing code, sometimes so good that it optimizes away the very code you&amp;rsquo;re trying to benchmark. Dead code elimination, constant folding, and just-in-time compilation can all skew your measurements in ways that don&amp;rsquo;t reflect real-world performance.&lt;/p&gt;</description></item><item><title>How to Train ReadyNow to Achieve Optimal Java Performance</title><link>https://foojayio.github.io/website/today/how-to-train-readynow-to-achieve-optimal-java-performance/</link><pubDate>Fri, 20 Jun 2025 19:31:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-train-readynow-to-achieve-optimal-java-performance/</guid><description>&lt;p&gt;&lt;em&gt;This is the third blog post in a series on faster Java application warmup with ReadyNow. If you haven&amp;rsquo;t been following the series, go back to the first blog post, &lt;a href="https://foojayio.github.io/website/today/faster-java-warmup-crac-versus-readynow/"&gt;Faster Java Warmup: CRaC versus ReadyNow&lt;/a&gt;
, and catch up. This post explains how you can train the ReadyNow feature in Azul Platform Prime to achieve optimal Java performance.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Using a profile log made from a single run is only a first step in Java warmup. ReadyNow learns from previous executions and incrementally improves the warmup time at every new invocation. By using several training runs, you can improve your application&amp;rsquo;s performance even further. ReadyNow gathers data from training runs and stores it in a profile log, which ensures better performance after the first and subsequent runs.&lt;/p&gt;</description></item><item><title>Your Complete Guide to Diagnose Slow Queries in MongoDB</title><link>https://foojayio.github.io/website/today/your-complete-guide-to-diagnose-slow-queries-in-mongodb/</link><pubDate>Tue, 17 Jun 2025 04:06:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/your-complete-guide-to-diagnose-slow-queries-in-mongodb/</guid><description>&lt;p&gt;MongoDB is built to be fast. The real win comes from knowing how to keep it that way, even as your app grows and your data gets more complex.&lt;/p&gt;
&lt;p&gt;This tutorial is for those developers and engineers who want to understand how MongoDB behaves when queries or writes slow down. We&amp;rsquo;re not here to hand you indexing tips or premature advice about schema design. We&amp;rsquo;re here to walk through the actual tools MongoDB gives you to observe, measure, and reason about query performance, before you start optimizing anything.&lt;/p&gt;</description></item><item><title>How ReadyNow Improves Java Warmup Time</title><link>https://foojayio.github.io/website/today/how-readynow-improves-java-warmup-time/</link><pubDate>Fri, 13 Jun 2025 07:55:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-readynow-improves-java-warmup-time/</guid><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;This is the second article in a series on faster Java application warmup. The first blog post, &lt;a href="https://foojayio.github.io/website/today/faster-java-warmup-crac-versus-readynow/"&gt;Faster Java Warmup: CRaC versus ReadyNow&lt;/a&gt;
, explained how CRaC and ReadyNow use different methods to achieve faster Java warmup. This post takes a deeper look into how ReadyNow improves Java warmup time and reduces latency.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;ReadyNow in Azul Zing Builds of OpenJDK (Zing) helps Java applications reach their optimal performance much faster after the startup of the JVM. Using a text file containing the history of compiler decisions from a previous run, it can reduce the application&amp;rsquo;s total Java warmup time.&lt;/p&gt;</description></item><item><title>Faster Java Warmup: CRaC versus ReadyNow</title><link>https://foojayio.github.io/website/today/faster-java-warmup-crac-versus-readynow/</link><pubDate>Fri, 06 Jun 2025 17:23:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/faster-java-warmup-crac-versus-readynow/</guid><description>&lt;p&gt;&lt;em&gt;This is the first blog post in a series on faster Java application warmup with ReadyNow.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Azul has developed different solutions to help achieve faster Java application warmup, including Coordinated Restore at Checkpoint (CRaC) and ReadyNow. While CRaC and ReadyNow aim to solve the same challenge, they take different approaches. This post explains the differences.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;One of the challenges in a Java system is application warmup.&lt;/p&gt;
&lt;p&gt;Java is the beating heart of many applications. It powers countless applications, from small business processes on a single machine to massive clusters handling vast amounts of data and transactions. Azul optimizes performance, especially Java warmup in complex setups and time-sensitive use cases.&lt;/p&gt;</description></item><item><title>10 Best Practises For Jakarta EE Performance Optimization</title><link>https://foojayio.github.io/website/today/10-best-practises-for-jakarta-ee-performance-optimization/</link><pubDate>Thu, 29 May 2025 13:44:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/10-best-practises-for-jakarta-ee-performance-optimization/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;With this article, we start a series where we compiled 10 best practices for performance optimizations and suggestions how to implement them using &lt;a href="https://jakarta.ee/" target="_blank" rel="noopener noreferrer"&gt;Jakarta EE&lt;/a&gt;
 &amp;amp; &lt;a href="https://omnifish.ee/glassfish/" target="_blank" rel="noopener noreferrer"&gt;Eclipse GlassFish&lt;/a&gt;
.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Enjoy reading this initial overview and watching the video about performance tuning Java applications, and stay tuned for upcoming articles from our &lt;a href="https://omnifish.ee/" target="_blank" rel="noopener noreferrer"&gt;OmniFish team&lt;/a&gt;
 that will go into details about each best practice.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To make your &lt;a href="https://jakarta.ee/" target="_blank" rel="noopener noreferrer"&gt;Jakarta EE&lt;/a&gt;
 applications faster and more efficient, here are &lt;strong&gt;10 proven best practices&lt;/strong&gt; you can easily implement:&lt;/p&gt;</description></item><item><title>Optimizing the Garbage Collector when Migrating Cloud Workloads</title><link>https://foojayio.github.io/website/today/optimizing-the-garbage-collector-when-migrating-cloud-workloads/</link><pubDate>Wed, 16 Apr 2025 10:27:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/optimizing-the-garbage-collector-when-migrating-cloud-workloads/</guid><description>&lt;p&gt;&lt;strong&gt;You might associate Arm primarily with smartphones and the Java-based Android runtime. However, OpenJDK has supported AArch64 on Linux since 2014&amp;mdash; before Arm-based cloud instances were widely available.&lt;/strong&gt; &lt;strong&gt;Fast forward a decade and major cloud providers have their own Arm-based instances like AWS Graviton, Microsoft Azure Cobalt, and others, prompting many organizations to migrate Java workloads from x86 to multi-architecture environments.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A multi-architecture deployment shift allows an organization to be adaptable and choose the architecture with the ideal price to performance ratio. Large independent software vendors, such as Uber, are &lt;a href="https://www.uber.com/en-GB/blog/adopting-arm-at-scale-bootstrapping-infrastructure/" target="_blank" rel="noopener noreferrer"&gt;already making this transition&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Building JavaFX Native Images</title><link>https://foojayio.github.io/website/today/a-guide-to-creating-javafx-native-images/</link><pubDate>Tue, 15 Apr 2025 09:57:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/a-guide-to-creating-javafx-native-images/</guid><description>&lt;p&gt;&lt;strong&gt;Combining JavaFX-based applications with GraalVM Native Image will enable you to create platform-specific executables that don&amp;rsquo;t require the JVM to run.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this article, we will look into two ways of turning JavaFX applications into native images: manually and with the Maven plugin. We will also learn to integrate this process into the CI/CD pipeline with GitHub Actions.&lt;/p&gt;
&lt;p&gt;This article was originally published &lt;a href="https://bell-sw.com/blog/how-to-create-javafx-native-images/" title="here" target="_blank" rel="noopener noreferrer"&gt;here&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;The code for the project I use in this article is available &lt;a href="https://github.com/des-felins/raffle" target="_blank" rel="noopener noreferrer"&gt;on GitHub&lt;/a&gt;
. It was built using &lt;a href="https://bell-sw.com/pages/downloads/#jdk-21-lts" target="_blank" rel="noopener noreferrer"&gt;Liberica JDK Full&lt;/a&gt;
 that includes an OpenJFX bundle. It facilitates developing and building JavaFX applications as there&amp;rsquo;s no need to add separate dependencies for JavaFX.&lt;/p&gt;</description></item><item><title>A Glance into JFR Class and Method Tagging</title><link>https://foojayio.github.io/website/today/a-glance-into-jfr-class-and-method-tagging/</link><pubDate>Mon, 17 Feb 2025 09:26:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/a-glance-into-jfr-class-and-method-tagging/</guid><description>&lt;p&gt;Ever wonder how the JDK Flight Recorder (JFR) keeps track of the classes and methods it has collected for stack traces and more?&lt;/p&gt;
&lt;p&gt;In this short article, I&amp;rsquo;ll explore JFR tagging and how it works in the OpenJDK.&lt;/p&gt;
&lt;h2 id="h2-0-tags"&gt;Tags&lt;/h2&gt;
&lt;p&gt;JFR files consist of self-contained chunks. Every chunk contains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;metadata&lt;/li&gt;
&lt;li&gt;events&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mail.openjdk.org/pipermail/hotspot-jfr-dev/2020-February/001154.html" target="_blank" rel="noopener noreferrer"&gt;mappings of IDs to actual values&lt;/a&gt;
, the IDs are used in the events in place of stack traces, classes, methods, strings, &amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The maximum chunk size is usually 12MB, but you can configure it:&lt;/p&gt;</description></item><item><title>Warp: the new CRaC engine</title><link>https://foojayio.github.io/website/today/warp-the-new-crac-engine/</link><pubDate>Wed, 18 Dec 2024 16:04:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/warp-the-new-crac-engine/</guid><description>&lt;p&gt;&lt;strong&gt;Many regular Foojay readers are already familiar with project CRaC - a technology that can checkpoint (suspend) running Java application into a snapshot image and later restore it to the already warmed-up state. The most common motivation for this is significantly faster startup than if the application (and JVM) started normally. Traditionally this was supported by CRIU (Checkpoint and Restore in Userspace), coming with the burden of root privileges required for execution. Since Azul Zulu October 2024 release, this pain-point can be gone: meet Warp.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Speed up your Spring Batch with Native Image and GraalVM</title><link>https://foojayio.github.io/website/today/speed-up-your-spring-batch-with-native-image-and-graalvm/</link><pubDate>Tue, 10 Dec 2024 15:47:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/speed-up-your-spring-batch-with-native-image-and-graalvm/</guid><description>&lt;p&gt;&lt;strong&gt;Spring Batch is often used for&lt;/strong&gt; data processing &lt;strong&gt;jobs that don&amp;rsquo;t run continuously.&lt;/strong&gt; Instead, they start, process, and stop,&lt;strong&gt;which makes them a perfect candidate for GraalVM Native Image.&lt;/strong&gt; Unlike traditional Java applications that require a long JVM startup time, Native Images execute almost instantly, giving a significant performance boost.&lt;/p&gt;
&lt;p&gt;In this article, you&amp;rsquo;ll learn how to build a Spring Batch application that reads a CSV file, logs its content, and writes it to a PostgreSQL database.&lt;strong&gt;We&amp;rsquo;ll see how to compile it into a Native Image using GraalVM&lt;/strong&gt; , and most importantly**, we&amp;rsquo;ll benchmark the difference between** running it as &lt;strong&gt;a traditional JAR and&lt;/strong&gt; as &lt;strong&gt;a native binary&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>How Organizations Became Stuck on Outdated Java Versions</title><link>https://foojayio.github.io/website/today/how-organizations-became-stuck-on-outdated-java-versions/</link><pubDate>Wed, 27 Nov 2024 15:46:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-organizations-became-stuck-on-outdated-java-versions/</guid><description>&lt;p&gt;My recent article &lt;a href="https://foojayio.github.io/website/today/why-java-8-is-a-ticking-time-bomb-hiding-within-your-organization/"&gt;&amp;ldquo;Why Java 8 is a Ticking Time Bomb Hiding Within Your Organization&amp;rdquo;&lt;/a&gt;
 triggered quit some reactions&amp;hellip; and so I went a step further and asked on social media: &amp;ldquo;&lt;em&gt;Why is your company still on Java 8 (or older)? And why did you never move to 9, 10,&amp;hellip; and got stuck on this outdated version?&lt;/em&gt;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Here is a summary of what I learned from the reactions!&lt;/p&gt;
&lt;h2 id="h2-0-reasons-to-stick-to-8"&gt;Reasons to Stick to 8&lt;/h2&gt;
&lt;p&gt;Of course, there are many reasons why some projects deliberately are kept on Java 8 or don&amp;rsquo;t succeed on moving to a newer version.&lt;/p&gt;</description></item><item><title>Why Java 8 is a Ticking Time Bomb Hiding Within Your Organization</title><link>https://foojayio.github.io/website/today/why-java-8-is-a-ticking-time-bomb-hiding-within-your-organization/</link><pubDate>Fri, 15 Nov 2024 11:16:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-java-8-is-a-ticking-time-bomb-hiding-within-your-organization/</guid><description>&lt;p&gt;When I spoke to developers at Devoxx in Belgium in October, I was surprised to learn how many of them are maintaining systems that are still running on Java 8 (released in 2014). One of them even still has a Java 5 application in production, with a runtime of 20 years old!&lt;/p&gt;
&lt;p&gt;I know I&amp;rsquo;m biased, as I experiment extensively with the latest Java versions to learn what improvements they bring. But it hurts my heart to think of all those developers maintaining old systems, missing out on all the coding and performance improvements that newer versions offer. In this post, I want to highlight some of the many reasons why staying on Java 8 is a ticking time bomb&amp;hellip;&lt;/p&gt;</description></item><item><title>Book Review: Mastering the Java Virtual Machine</title><link>https://foojayio.github.io/website/today/book-review-mastering-the-java-virtual-machine/</link><pubDate>Fri, 18 Oct 2024 13:54:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/book-review-mastering-the-java-virtual-machine/</guid><description>&lt;p&gt;&lt;strong&gt;Otávio Santana&amp;rsquo;s&lt;/strong&gt; &lt;strong&gt;&amp;ldquo;Mastering the Java Virtual Machine&amp;rdquo;&lt;/strong&gt; takes readers on an insightful journey through the inner workings of the JVM. As I read this book, I found myself reconnecting with the fundamentals of Java programming while also discovering new depths of understanding.&lt;/p&gt;
&lt;p&gt;The book strikes a perfect balance between nostalgia and innovation. It reminded me of my early programming days, while also introducing cutting-edge concepts that are crucial for modern Java development. Santana uses clever technical metaphors to make complex JVM internals more accessible, bridging the gap between theory and practical application.&lt;/p&gt;</description></item><item><title>How to profile a performance issue using Spring Boot profiling tools</title><link>https://foojayio.github.io/website/today/how-to-profile-a-performance-issue-using-spring-boot-profiling-tools/</link><pubDate>Mon, 02 Sep 2024 09:56:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-profile-a-performance-issue-using-spring-boot-profiling-tools/</guid><description>&lt;p&gt;&lt;strong&gt;In today&amp;rsquo;s fast-paced development environment, ensuring the performance and reliability of your services is critical. Imagine you are part of a team responsible for several services essential to both internal teams and external customers. These services are the backbone of various business operations, and any downtime or performance degradation can have significant repercussions.&lt;/strong&gt;{#c79c}&lt;/p&gt;
&lt;p&gt;Now, picture this scenario: your team has not yet implemented a robust monitoring and observability system. One day, you start receiving emails and messages from frustrated clients reporting that your service is down. Panic sets in as your team tries to figure out what went wrong. Without proper monitoring tools, finding the root cause of issues in production is challenging. Persistent downtime increases pressure, affecting business operations and customer satisfaction.{#acf3}&lt;/p&gt;</description></item><item><title>Unsupported OpenJDK Distributions are at Risk of Non-Compliance with DORA</title><link>https://foojayio.github.io/website/today/unsupported-openjdk-distributions-are-at-risk-of-non-compliance-with-dora/</link><pubDate>Mon, 26 Aug 2024 12:24:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/unsupported-openjdk-distributions-are-at-risk-of-non-compliance-with-dora/</guid><description>&lt;p&gt;&lt;strong&gt;For the EU Digital Operations Resilience Act (DORA) to have any meaning at all in the context of OpenJDK (and surely it must have application there since it is explicitly focused on &amp;ldquo;ICT Assets&amp;rdquo;, which it defines as broadly as possible as &amp;ldquo;a software or hardware asset in the network and information systems used by a financial entity&amp;rdquo;), it can only be interpreted to, at the very least, very strongly encourage the usage of supported OpenJDK distributions.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Running JavaFX applications on ARM with Azul Zulu</title><link>https://foojayio.github.io/website/today/running-javafx-applications-on-arm-with-azul-zulu/</link><pubDate>Thu, 22 Aug 2024 08:51:57 +0000</pubDate><guid>https://foojayio.github.io/website/today/running-javafx-applications-on-arm-with-azul-zulu/</guid><description>&lt;p&gt;&lt;strong&gt;Since the April release of Azul Zulu Builds of OpenJDK, packages with JavaFX support for ARM 64-bit systems have been available.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As ARM processors are the &amp;ldquo;core&amp;rdquo; of most embedded systems, these runtimes provide the additional benefit of bringing user interface development into the Java space. Having your full code base, from server to end device, based on the same Java code and dependencies, brings many improvements in total cost, development approach, and test and deployment strategies.&lt;/p&gt;</description></item><item><title>Connecting Resilience to Performance in Relation to OpenJDK</title><link>https://foojayio.github.io/website/today/connecting-resilience-to-performance-in-relation-to-openjdk/</link><pubDate>Thu, 22 Aug 2024 08:22:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/connecting-resilience-to-performance-in-relation-to-openjdk/</guid><description>&lt;p&gt;&lt;strong&gt;When considering the connection between performance and resilience in Java, especially in the context of OpenJDK distributions, specific distributions&amp;mdash;like &lt;a href="https://www.azul.com/products/prime/" target="_blank" rel="noopener noreferrer"&gt;Azul Platform Prime&lt;/a&gt;
, which includes Azul Zing, an enhanced build of OpenJDK for superior performance, consistency, and efficiency&amp;mdash;offer unique features that can significantly influence how these two aspects are managed.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://foojayio.github.io/website/today/the-impact-of-the-digital-operational-resilience-act-dora-on-java-investment-with-azul/"&gt;Digital Operational Resilience Act (DORA) by the European Union&lt;/a&gt;
 adds another layer of importance to these considerations, particularly for financial institutions operating within the EU, &lt;a href="https://foojayio.github.io/website/today/the-impact-of-the-eu-dora-act-on-non-eu-financial-organizations/"&gt;regardless of whether they are themselves EU-based institutions&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>The Impact of the EU DORA Act on Non-EU Financial Organizations</title><link>https://foojayio.github.io/website/today/the-impact-of-the-eu-dora-act-on-non-eu-financial-organizations/</link><pubDate>Wed, 14 Aug 2024 05:33:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-impact-of-the-eu-dora-act-on-non-eu-financial-organizations/</guid><description>&lt;p&gt;&lt;strong&gt;The &lt;a href="https://foojayio.github.io/website/today/the-impact-of-the-digital-operational-resilience-act-dora-on-java-investment-with-azul/"&gt;EU Digital Operational Resilience Act (DORA)&lt;/a&gt;
 is a significant regulatory framework designed to strengthen the digital resilience of financial institutions within the European Union.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;While the primary focus of DORA is on EU-based entities, its impact extends beyond the EU&amp;rsquo;s borders, particularly to financial organizations outside the EU that have business ties with the region.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how DORA impacts financial organizations outside the EU.&lt;/p&gt;
&lt;h3 id="h3-0-1-third-party-service-providers"&gt;1. &lt;strong&gt;Third-Party Service Providers&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Scope of Regulation&lt;/strong&gt;. DORA covers not just financial entities within the EU but also third-party service providers, including Cloud services, software providers, and IT services. If these providers serve EU financial institutions, they must comply with DORA&amp;rsquo;s requirements, even if they are based outside the EU.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Increased Compliance Costs&lt;/strong&gt;. Non-EU service providers might need to invest in compliance infrastructure to meet DORA standards, which include stringent cybersecurity measures, operational resilience requirements, and incident reporting protocols.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operational Changes&lt;/strong&gt;. These providers may need to adapt their operations to comply with DORA&amp;rsquo;s requirements, potentially impacting service delivery, pricing, and contractual arrangements with their EU clients.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="h3-1-2-cross-border-operations"&gt;2. &lt;strong&gt;Cross-Border Operations&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;EU Subsidiaries&lt;/strong&gt;. Non-EU financial organizations with subsidiaries or branches in the EU must ensure that these entities comply with DORA. This might require significant changes in internal processes, governance structures, and IT systems.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Protection and Transfer&lt;/strong&gt;. DORA&amp;rsquo;s focus on operational resilience and cybersecurity intersects with data protection regulations. Non-EU organizations must ensure that data transfers and processing are compliant with EU standards, which could involve changes in data management practices.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="h3-2-3-competitive-pressure"&gt;3. &lt;strong&gt;Competitive Pressure&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Market Access&lt;/strong&gt;. To maintain or gain access to the EU market, non-EU financial organizations must align with DORA&amp;rsquo;s requirements. Failure to comply might restrict their ability to operate within the EU or provide services to EU-based clients.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reputation and Trust&lt;/strong&gt;. Organizations that proactively comply with DORA may gain a competitive edge by being seen as trustworthy and secure partners. Conversely, those that lag may face reputational risks, especially in a market increasingly focused on cybersecurity and operational resilience.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="h3-3-4-indirect-impact-through-business-relationships"&gt;4. &lt;strong&gt;Indirect Impact Through Business Relationships&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Supply Chain Scrutiny&lt;/strong&gt;. DORA requires EU financial entities to ensure that their supply chain, including non-EU entities, adheres to operational resilience standards. Non-EU organizations in these supply chains may face increased scrutiny and pressure to comply with DORA, indirectly impacting their operations and costs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contractual Obligations&lt;/strong&gt;. Financial institutions in the EU may impose new contractual obligations on non-EU partners to ensure DORA compliance. This could lead to renegotiation of contracts and increased legal and operational overheads for non-EU entities.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="h3-4-5-global-regulatory-influence"&gt;5. &lt;strong&gt;Global Regulatory Influence&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Precedent for Other Jurisdictions&lt;/strong&gt;. DORA could set a precedent, encouraging other jurisdictions to adopt similar regulatory frameworks. Non-EU financial organizations may find themselves needing to adapt to a broader wave of operational resilience regulations globally, beyond just the EU.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="h3-5-6-impact-on-financial-services-market"&gt;6. &lt;strong&gt;Impact on Financial Services Market&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Barrier to Entry&lt;/strong&gt;. DORA&amp;rsquo;s stringent requirements might act as a barrier to entry for smaller or less-resourced non-EU financial firms seeking to enter the EU market, potentially limiting competition.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Innovation and Fintech&lt;/strong&gt;. While aiming to enhance security, DORA may also slow down innovation, as non-EU fintech firms might find the compliance burden heavy, possibly leading to a more cautious approach in launching new products or services in the EU.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="h3-6-summary"&gt;Summary&lt;/h3&gt;
&lt;p&gt;The EU DORA Act significantly impacts financial organizations outside the EU, especially those providing services to or operating within the EU.&lt;/p&gt;</description></item><item><title>Consequences of DORA on Java and OpenJDK with Azul</title><link>https://foojayio.github.io/website/today/consequences-of-dora-on-java-and-openjdk-with-azul/</link><pubDate>Fri, 02 Aug 2024 13:49:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/consequences-of-dora-on-java-and-openjdk-with-azul/</guid><description>&lt;p&gt;&lt;strong&gt;The EU&amp;rsquo;s &lt;a href="https://foojayio.github.io/website/today/the-impact-of-the-digital-operational-resilience-act-dora-on-java-investment-with-azul/"&gt;Digital Operational Resilience Act (DORA)&lt;/a&gt;
 is a regulatory framework aimed at enhancing the digital operational resilience of financial institutions within the European Union.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Its primary goal is to ensure that financial entities can withstand, respond to, and recover from all types of ICT-related disruptions and threats, such as cyberattacks.&lt;/p&gt;
&lt;p&gt;DORA establishes a uniform set of requirements for managing ICT risks across the financial sector, promoting a harmonized approach to digital resilience.&lt;/p&gt;</description></item><item><title>The Impact of the Digital Operational Resilience Act (DORA) on Java Investment with Azul</title><link>https://foojayio.github.io/website/today/the-impact-of-the-digital-operational-resilience-act-dora-on-java-investment-with-azul/</link><pubDate>Sun, 14 Jul 2024 13:26:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-impact-of-the-digital-operational-resilience-act-dora-on-java-investment-with-azul/</guid><description>&lt;p&gt;&lt;strong&gt;The &lt;a href="https://eur-lex.europa.eu/eli/reg/2022/2554/oj" target="_blank" rel="noopener noreferrer"&gt;Digital Operational Resilience Act (DORA)&lt;/a&gt;
, Regulation (EU) 2022/2554&lt;/strong&gt; ,&lt;strong&gt;is a key piece of European Union legislation focused on strengthening the resilience of the financial sector against digital operational risks, such as cyber attacks and other ICT-related disruptions.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;DORA is part of the broader &lt;a href="https://finance.ec.europa.eu/publications/digital-finance-package_en" target="_blank" rel="noopener noreferrer"&gt;Digital Finance Package&lt;/a&gt;
 introduced by the European Commission to enable innovation and competition in the financial sector while ensuring its security and resilience.&lt;/p&gt;
&lt;p&gt;It is focused on enhancing ICT risk management, strengthening cybersecurity, ensuring continuity and recovery, managing risks arising from dependencies on third-party ICT service providers, and incident reporting.&lt;/p&gt;</description></item><item><title>A Beginner's Guide to IntelliJ Profiler</title><link>https://foojayio.github.io/website/today/beginners-guide-to-java-profiler/</link><pubDate>Thu, 04 Jul 2024 06:26:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/beginners-guide-to-java-profiler/</guid><description>&lt;p&gt;Read in other languages: &lt;a href="https://flounder.dev/zh/posts/get-started-with-profiling/" target="_blank" rel="noopener noreferrer"&gt;中文&lt;/a&gt;
 &lt;a href="https://flounder.dev/es/posts/get-started-with-profiling/" target="_blank" rel="noopener noreferrer"&gt;Español&lt;/a&gt;
 &lt;a href="https://flounder.dev/pt/posts/get-started-with-profiling/" target="_blank" rel="noopener noreferrer"&gt;Português&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Sometimes your app works, but you want to increase performance by boosting its throughput or reducing latency. Other times, you just want to know how code behaves at runtime, determine where the hot spots are, or figure out how a framework operates under the hood.&lt;/p&gt;
&lt;p&gt;This is a perfect use case for profilers. They offer a bird&amp;rsquo;s eye view of arbitrarily large execution chunks, which helps you see problems at scale.&lt;/p&gt;</description></item><item><title>Exploring New Features in JDK 23: Simplifying Java with Module Import Declarations with JEP 476</title><link>https://foojayio.github.io/website/today/exploring-new-features-in-jdk-23-simplifying-java-with-module-import-declarations-with-jep-476/</link><pubDate>Thu, 20 Jun 2024 16:14:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/exploring-new-features-in-jdk-23-simplifying-java-with-module-import-declarations-with-jep-476/</guid><description>&lt;p&gt;As Java evolves, simplifying code and improving developer productivity remain priorities.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://openjdk.org/jeps/476" target="_blank" rel="noopener noreferrer"&gt;JEP 476&lt;/a&gt;
 introduces a new feature in JDK 23: Module Import Declarations.&lt;/p&gt;
&lt;p&gt;This feature aims to streamline the process of importing multiple packages from a module, enhancing code readability and reducing boilerplate.&lt;/p&gt;
&lt;h3 id="h3-0-what-is-jep-476"&gt;&lt;strong&gt;What is JEP 476?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;JEP 476 proposes the ability to import all packages exported by a module with a single declaration. This is particularly useful for developers who frequently use multiple packages from the same module, as it eliminates the need for numerous individual import statements.&lt;/p&gt;</description></item><item><title>Five Java Developer Must-Haves For Ultra-Fast Startup Solutions</title><link>https://foojayio.github.io/website/today/five-java-developer-must-haves/</link><pubDate>Wed, 29 May 2024 20:15:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/five-java-developer-must-haves/</guid><description>&lt;p&gt;&lt;strong&gt;Faster Java startup must not compromise developer experience, throughput performance, or security. We discuss how we achieved this with Liberty InstantOn.&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;By Vijay Sundaresan, Thomas Watson, Laura Cowen&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Many solutions that promise ultra-fast startup times for serverless Java apps force you to compromise on developer experience, throughput performance, or security. We&amp;rsquo;ll show you how to get ultra-fast startup of your Java apps without these compromises.&lt;/p&gt;
&lt;p&gt;Say, for example, you&amp;rsquo;re writing a Java web service that provides a catalog of items that your business sells. At quiet times, your application needs to stop all unneeded instances of the catalog service so that your business is not paying unnecessary cloud bills; at busy times, your application needs to rapidly spin up more instances so that your customers get instantaneous response times on your website. This is &amp;ldquo;scale-to-zero,&amp;rdquo; and your application needs to do it fast.&lt;/p&gt;</description></item><item><title>Indexing all of Wikipedia, on a laptop</title><link>https://foojayio.github.io/website/today/indexing-all-of-wikipedia-on-a-laptop/</link><pubDate>Wed, 29 May 2024 15:54:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/indexing-all-of-wikipedia-on-a-laptop/</guid><description>&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;In November, &lt;a href="https://huggingface.co/datasets/Cohere/wikipedia-2023-11-embed-multilingual-v3" target="_blank" rel="noopener noreferrer"&gt;Cohere released a dataset containing all of Wikipedia&lt;/a&gt;
, chunked and embedded to vectors with &lt;a href="https://cohere.com/blog/introducing-embed-v3" target="_blank" rel="noopener noreferrer"&gt;their multilingual-v3 model&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Computing this many embeddings yourself would cost in the neighborhood of $5000, so the public release of this dataset makes creating &lt;a href="https://www.datastax.com/guides/what-is-vector-search" target="_blank" rel="noopener noreferrer"&gt;a semantic, vector-based index&lt;/a&gt;
 of Wikipedia practical for an individual for the first time.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what we&amp;rsquo;re building:
&lt;img src="https://lh7-us.googleusercontent.com/ydeHYk97v6Bza1GF0wbbHUEzxgCAJLfwbRcVnWvUP6QDPKKY5YQH00Dvi2n6VgkioW_PGqwckcCnQu9cJ2nOz2XSuL_27HNPAAbZdv2vXPOy_vUJ_Vcg-ii83E4jaqMycskzmzt8wBP1XsOYh5b7Cv4" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;You can try searching the completed index &lt;a href="https://jvectordemo.com:8443/" target="_blank" rel="noopener noreferrer"&gt;on a public demo instance here&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Exploring Cost-Effective Solutions for Stateful Rest Services</title><link>https://foojayio.github.io/website/today/exploring-cost-effective-solutions-for-stateful-rest-services/</link><pubDate>Mon, 27 May 2024 13:13:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/exploring-cost-effective-solutions-for-stateful-rest-services/</guid><description>&lt;h2 id="h2-0-a-case-study-with-ibm-cloud-code-engine-eclipsestore-and-ibm-cloud-object-storage"&gt;A Case Study with IBM Cloud Code Engine, EclipseStore, and IBM Cloud Object Storage&lt;/h2&gt;
&lt;p&gt;In the dynamic realm of cloud computing, finding cost-effective solutions for stateful rest services that don&amp;rsquo;t necessarily require scaling can be a nuanced challenge.&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll take a pragmatic look at a use case leveraging &lt;a href="https://www.ibm.com/products/code-engine" title="IBM Cloud Code Engine" target="_blank" rel="noopener noreferrer"&gt;IBM Cloud Code Engine&lt;/a&gt;
, &lt;a href="https://eclipsestore.io/" title="EclipseStore" target="_blank" rel="noopener noreferrer"&gt;EclipseStore&lt;/a&gt;
, and &lt;a href="https://www.ibm.com/products/cloud-object-storage" title="IBM Cloud Object Storage (COS)" target="_blank" rel="noopener noreferrer"&gt;IBM Cloud Object Storage (COS)&lt;/a&gt;
. The goal is to shed light on how this can be a practical and economical alternative, particularly when scalability is not a primary concern.&lt;/p&gt;</description></item><item><title>Improve DevOps Productivity with Azul Intelligence Cloud for Any JVM</title><link>https://foojayio.github.io/website/today/improve-devops-productivity-with-azul-intelligence-cloud-for-any-jvm/</link><pubDate>Fri, 24 May 2024 09:46:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/improve-devops-productivity-with-azul-intelligence-cloud-for-any-jvm/</guid><description>&lt;p&gt;For decades DevOps teams have been under pressure to do four things: make software faster, make it cheaper, keep it secure, and accelerate time to market.&lt;/p&gt;
&lt;p&gt;But with fewer engineering resources, enterprises that use Java must find a way to speed up application innovation and fortify application security across their entire Java estate more efficiently.&lt;/p&gt;
&lt;p&gt;The rewards (and costs of not doing so) are high &amp;ndash; companies in the top quartile of &lt;a href="https://www.mckinsey.com/industries/technology-media-and-telecommunications/our-insights/developer-velocity-how-software-excellence-fuels-business-performance" target="_blank" rel="noopener noreferrer"&gt;McKinsey&amp;rsquo;s Developer Velocity Index (DVI)&lt;/a&gt;
 perform significantly higher than bottom-quartile companies:&lt;/p&gt;</description></item><item><title>Oracle Alternatives Survey &amp; Report</title><link>https://foojayio.github.io/website/today/oracle-alternatives-survey-report/</link><pubDate>Mon, 13 May 2024 19:27:51 +0000</pubDate><guid>https://foojayio.github.io/website/today/oracle-alternatives-survey-report/</guid><description>&lt;p&gt;&lt;a href="https://azul.com/" target="_blank" rel="noopener noreferrer"&gt;Azul&lt;/a&gt;
 is planning to issue an Oracle Java &amp;ldquo;alternatives&amp;rdquo; Report in late July, and would like your help to complete the survey.&lt;/p&gt;
&lt;p&gt;The focus of this report is to explore the following themes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;highlight the frictions created by Oracle with their pricing policies and tactics&lt;/li&gt;
&lt;li&gt;show whether customers are in fact moving off of Oracle Java to OpenJDK alternatives&lt;/li&gt;
&lt;li&gt;prove the extent to which customers are willing to pay for commercial support and application migration expertise&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Below is the link to the survey.&lt;/p&gt;</description></item><item><title>How to improve your spring boot skills</title><link>https://foojayio.github.io/website/today/how-to-improve-your-spring-boot-skills/</link><pubDate>Wed, 20 Mar 2024 15:10:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-improve-your-spring-boot-skills/</guid><description>&lt;p&gt;&lt;strong&gt;Does anyone else ever feel overwhelmed by Spring Boot? With a rich set of options and eco-system libraries on the one hand, and a very opinionated framework on the other, I often spend considerable time deciphering the &amp;ldquo;Spring Way&amp;rdquo; of doing things. I&amp;rsquo;ve been working with &lt;a href="https://digma.ai/10-spring-boot-performance-best-practices/" target="_blank" rel="noopener noreferrer"&gt;Spring Boot&lt;/a&gt;
 for over three years, yet there are moments when I sense I&amp;rsquo;m not fully harnessing the capabilities of this remarkable framework and that I need to improve my Spring Boot skills.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>foojay – 12 Lessons Learned From Doing The 1BRC Challenge</title><link>https://foojayio.github.io/website/today/12-lessons-learned-from-doing-the-one-billion-row-challenge/</link><pubDate>Thu, 22 Feb 2024 10:44:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/12-lessons-learned-from-doing-the-one-billion-row-challenge/</guid><description>&lt;p&gt;The One Billion Row Challenge or 1BRC or 1️⃣🐝🏎 was a challenge to read a CSV file of one billion rows with &amp;ldquo;station name;temperature&amp;rdquo; data and compute the min/average/max temperature per weather station as fast as possible.&lt;/p&gt;
&lt;p&gt;If you want to know what is the fastest algorithm, you can go the the &lt;a href="https://github.com/gunnarmorling/1brc" target="_blank" rel="noopener noreferrer"&gt;1BRC page&lt;/a&gt;
. But the real answer is &amp;ldquo;&lt;strong&gt;it depends&lt;/strong&gt;&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;It depends:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The machine you&amp;rsquo;re running it on&lt;/li&gt;
&lt;li&gt;How far are you ready to use hacks in your code&lt;/li&gt;
&lt;li&gt;The JVM&lt;/li&gt;
&lt;li&gt;The data in the file&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-0-it-works-on-my-machine"&gt;It works on my machine&lt;/h2&gt;
&lt;p&gt;or to be more precise, it&amp;rsquo;s faster on my machine.&lt;/p&gt;</description></item><item><title>Cloud Cost Optimization Is Hard, Java Can Help</title><link>https://foojayio.github.io/website/today/cloud-cost-optimization-is-hard-java-can-help/</link><pubDate>Wed, 21 Feb 2024 12:07:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/cloud-cost-optimization-is-hard-java-can-help/</guid><description>&lt;p&gt;In my recent conversation with William Fellows, Research Director at S&amp;amp;P Global Market Research, we &lt;a href="https://www.youtube.com/watch?v=nAP3bYxdsZw&amp;amp;t=1s" target="_blank" rel="noopener noreferrer"&gt;discussed ways to reduce cloud waste&lt;/a&gt;
 specifically for Java workloads. After all, cloud cost optimization is hard.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/nAP3bYxdsZw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;p&gt;A large delta is growing between budgeted and actual spending. Top areas for spending are cloud integration and modernization services, security and compliance monitoring, and application modernization &amp;ndash; specifically applications written in Java.&lt;/p&gt;</description></item><item><title>Minimize costs utilizing the cloud with Spring-Data-Eclipse-Store</title><link>https://foojayio.github.io/website/today/minimize-costs-by-utilizing-cloud-storage-with-spring-data-eclipse-store/</link><pubDate>Tue, 13 Feb 2024 15:26:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/minimize-costs-by-utilizing-cloud-storage-with-spring-data-eclipse-store/</guid><description>&lt;p&gt;Sooner or later any Spring application needs to store data. And of course, the first and easiest move is to utilize &lt;a href="https://spring.io/projects/spring-data-jpa" target="_blank" rel="noopener noreferrer"&gt;Spring Data JPA&lt;/a&gt;
. You can set up your data storage without knowing which relational database you will use in production and simply start coding without worrying about that.&lt;/p&gt;
&lt;p&gt;It is the easiest and most convenient way to store data (in a relational database like PostgreSQL), yet in the cloud environment it is also an expensive way. Pricing at AWS RDS starts at 30$/month with tiny-Instances and always have &lt;strong&gt;fixed monthly costs regardless of its usage&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Profiling Maven Projects with my IntelliJ Profiler Plugin</title><link>https://foojayio.github.io/website/today/profiling-maven-projects-with-my-intellij-profiler-plugin/</link><pubDate>Thu, 14 Dec 2023 10:41:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/profiling-maven-projects-with-my-intellij-profiler-plugin/</guid><description>&lt;h3 id="h3-0-or-i-just-released-version-0-0-11-with-a-cool-new-feature-that-i-can-t-wait-to-tell-you-about"&gt;Or: I just released version 0.0.11 with a cool new feature that I can&amp;rsquo;t wait to tell you about&amp;hellip;&lt;/h3&gt;
&lt;p&gt;According to the recent &lt;a href="https://www.jetbrains.com/lp/devecosystem-2023/java/" target="_blank" rel="noopener noreferrer"&gt;JetBrains survey&lt;/a&gt;
, most people use Maven as their build system and build Spring Boot applications with Java. Yet my profiling plugin for IntelliJ only supports profiling pure Java run configurations. Configurations where the JVM gets passed the main class to run. This is great for tiny examples where you directly right-click on the &lt;code&gt;main&lt;/code&gt; method and profile the whole application using the context menu:
&lt;img src="https://mostlynerdless.de/wp-content/uploads/2023/12/image-2.png" alt="" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>Chopping the monolith in a smarter way</title><link>https://foojayio.github.io/website/today/chopping-the-monolith-in-a-smarter-way/</link><pubDate>Thu, 07 Dec 2023 07:40:55 +0000</pubDate><guid>https://foojayio.github.io/website/today/chopping-the-monolith-in-a-smarter-way/</guid><description>&lt;p&gt;&lt;strong&gt;In my previous post &lt;a href="https://foojayio.github.io/website/today/chopping-monolith/"&gt;Chopping the Monolith&lt;/a&gt;
, I explained that some parts of a monolith are pretty stable and only the fast-changing parts are worth being &amp;ldquo;chopped.&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I turned the post into a talk and presented it at several conferences. I think it&amp;rsquo;s pretty well received; I believe it&amp;rsquo;s because most developers understand, or have direct experience, that microservices are not a good fit for traditional organizations, as per &lt;a href="https://en.wikipedia.org/wiki/Conway%27s_law" target="_blank" rel="noopener noreferrer"&gt;Conway&amp;rsquo;s Law&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Custom Events in the Blocky World: Using JFR in Minecraft</title><link>https://foojayio.github.io/website/today/custom-events-in-the-blocky-world-using-jfr-in-minecraft/</link><pubDate>Tue, 28 Nov 2023 19:12:50 +0000</pubDate><guid>https://foojayio.github.io/website/today/custom-events-in-the-blocky-world-using-jfr-in-minecraft/</guid><description>&lt;p&gt;I was searching for some JFR-related settings on the internet when I stumbled upon the &lt;a href="https://minecraft.fandom.com/wiki/Commands/jfr" target="_blank" rel="noopener noreferrer"&gt;&lt;code&gt;/jfr&lt;/code&gt; command&lt;/a&gt;
 that exists in &lt;a href="https://www.minecraft.net" target="_blank" rel="noopener noreferrer"&gt;Minecraft&lt;/a&gt;
:&lt;/p&gt;
&lt;figure class="aligncenter size-full is-resized"&gt;
 &lt;a target="_blank" href="https://minecraft.fandom.com/wiki/Commands/jfr"&gt;&lt;img decoding="async" src="https://mostlynerdless.de/wp-content/uploads/2023/11/image-2.png" alt="" class="wp-image-1298" style="width:614px;height:auto"&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;p&gt;This, of course, intrigued me, especially as Minecraft apparently adds some custom JFR events:
&lt;a href="https://minecraft.fandom.com/wiki/Commands/jfr" target="_blank" rel="noopener noreferrer"&gt;&lt;img src="https://mostlynerdless.de/wp-content/uploads/2023/11/image-3.png" alt="" loading="lazy"&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;So I had to check it out. I downloaded and started the &lt;a href="https://www.minecraft.net/en-us/download/server" target="_blank" rel="noopener noreferrer"&gt;Java server&lt;/a&gt;
, got a demo account, and connected to my local instance. &lt;em&gt;This works with a demo account when you launch the demo world, enable the cheat mode in the settings, kick yourself via &amp;ldquo;/kick @p,&amp;rdquo; and then select your own server. I found this via &lt;a href="https://bugs.mojang.com/browse/MC-138478" target="_blank" rel="noopener noreferrer"&gt;this bug report&lt;/a&gt;
.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Custom JFR Events: A Short Introduction</title><link>https://foojayio.github.io/website/today/custom-jfr-events-a-short-introduction/</link><pubDate>Sun, 26 Nov 2023 21:08:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/custom-jfr-events-a-short-introduction/</guid><description>&lt;p&gt;&lt;strong&gt;JDK Flight Recorder (JFR) is one of the two prominent open-source profilers for the OpenJDK (besides &lt;a href="https://github.com/async-profiler/async-profiler" target="_blank" rel="noopener noreferrer"&gt;async-profiler&lt;/a&gt;
).&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It offers many features (see &lt;a href="https://mostlynerdless.de/profiling-talks/" target="_blank" rel="noopener noreferrer"&gt;Profiling Talks&lt;/a&gt;
) and the ability to observe lots of information by recording over one hundred different events.&lt;/p&gt;
&lt;p&gt;If you want to know more about the existing events, visit my &lt;a href="https://sapmachine.io/jfrevents" target="_blank" rel="noopener noreferrer"&gt;JFR Event Collection&lt;/a&gt;
 website (&lt;a href="https://mostlynerdless.de/blog/2022/12/06/jfr-event-collection/" target="_blank" rel="noopener noreferrer"&gt;related blog post&lt;/a&gt;
):&lt;br&gt;
&lt;a href="https://sapmachine.io/jfrevents" target="_blank" rel="noopener noreferrer"&gt;&lt;img src="https://mostlynerdless.de/wp-content/uploads/2023/11/image.png" alt="" loading="lazy"&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Besides these built-in events, JFR allows you to implement your events to record custom information directly in your profiling file.&lt;/p&gt;</description></item><item><title>Putting JFR into Context</title><link>https://foojayio.github.io/website/today/putting-jfr-into-context/</link><pubDate>Thu, 02 Nov 2023 14:03:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/putting-jfr-into-context/</guid><description>&lt;p&gt;&lt;strong&gt;Have you ever wanted to bring your JFR events into context? Adding information on sessions, user IDs, and more can improve your ability to make sense of all the events in your profile.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Currently, we can only add context by creating custom JFR events, as I presented in my &lt;a href="https://mostlynerdless.de/profiling-talks/" target="_blank" rel="noopener noreferrer"&gt;Profiling Talks&lt;/a&gt;
:&lt;/p&gt;
&lt;figure class="wp-block-embed is-type-video is-provider-vimeo wp-block-embed-vimeo wp-embed-aspect-16-9 wp-has-aspect-ratio"&gt;
 &lt;div class="wp-block-embed__wrapper"&gt;
 &lt;iframe title="Unleash the Power of Open Source Java Profilers - Johannes Bechberger" src="https://player.vimeo.com/video/861946709?dnt=1&amp;amp;app_id=122963" width="500" height="281" frameborder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write"&gt;&lt;/iframe&gt;
 &lt;/div&gt;
 &lt;figcaption class="wp-element-caption"&gt;
 More here: &lt;a target="_blank" href="https://mostlynerdless.de/profiling-talks/"&gt;https://mostlynerdless.de/profiling-talks/&lt;/a&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;We can use these custom events to store away the information and later relate them to all the other events by using the event&amp;rsquo;s time, duration, and thread. This works out-of-the-box but has one major problem: Relating events is quite fuzzy, as time stamps are not as accurate (see JFR Timestamps and System.nanoTime), and we do all of this in post-processing.&lt;/p&gt;</description></item><item><title>Controlling JIT Compiler Overhead to Avoid CPU Autoscaling</title><link>https://foojayio.github.io/website/today/controlling-jit-compiler-overhead-to-avoid-cpu-autoscaling/</link><pubDate>Wed, 01 Nov 2023 07:54:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/controlling-jit-compiler-overhead-to-avoid-cpu-autoscaling/</guid><description>&lt;p&gt;&lt;strong&gt;Today&amp;rsquo;s modern, containerized, elastically scaling Java clusters often rely on CPU utilization as the main trigger for scaling out new instances. Imperfect as this metric may be, it is ubiquitous to scale out new instances based on CPU utilization going over some limit. Often that limit is surprisingly low, somewhere around 40 to 50%.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.azul.com/products/prime/" target="_blank" rel="noopener noreferrer"&gt;Azul Platform Prime&lt;/a&gt;
 replaces OpenJDK&amp;rsquo;s HotSpot C2 compiler with the Falcon JIT compiler. &lt;a href="https://docs.azul.com/prime/Falcon-Compiler" target="_blank" rel="noopener noreferrer"&gt;Falcon&lt;/a&gt;
 generates much faster code than OpenJDK, allowing you to handle more transactions in a container before hitting your CPU utilization limit. And, Prime&amp;rsquo;s smoother and more consistent execution allows you to safely raise your CPU utilization to 60-70%, resulting in massive gains in carrying capacity for each container and lower overall cloud costs to handle your total Java workload.&lt;/p&gt;</description></item><item><title>Resizing images on-the-fly</title><link>https://foojayio.github.io/website/today/resizing-images-on-the-fly/</link><pubDate>Mon, 23 Oct 2023 18:01:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/resizing-images-on-the-fly/</guid><description>&lt;p&gt;As a web architect, one of the many issues is asset management. And the most significant issue in assets is images. A naive approach would be to set an image and let the browser resize the image via CSS:&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="css"&gt;img {
 height: 100%;
 width: 100%;
 object-fit: contain;
}&lt;/pre&gt;
&lt;p&gt;However, it means that you download the original image. It entails two problems: the size of the original image and the suboptimal browser-based resizing.&lt;/p&gt;</description></item><item><title>Changes Included in the Stable release 23.08 of Azul Zulu Prime Builds of OpenJDK</title><link>https://foojayio.github.io/website/today/changes-included-in-the-stable-release-23-08-of-azul-zulu-prime-builds-of-openjdk/</link><pubDate>Wed, 11 Oct 2023 07:03:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/changes-included-in-the-stable-release-23-08-of-azul-zulu-prime-builds-of-openjdk/</guid><description>&lt;p&gt;&lt;em&gt;The latest Long Term Support (LTS) version of OpenJDK was released on September 19, 2023. Below is an overview of all the combined improvements in the latest Azul Prime Builds of OpenJDK, stable release, 23.08.01.0.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.azul.com/products/prime/" target="_blank" rel="noopener noreferrer"&gt;Azul Platform Prime&lt;/a&gt;
 is a modern, TCK-compliant Java platform based on OpenJDK. It provides consistently low response latency of your Java workloads, higher total throughput and carrying capacity, faster warmup, and infrastructure savings, achieved thanks to the &lt;a href="https://www.azul.com/products/components/pgc/" target="_blank" rel="noopener noreferrer"&gt;C4 pauseless garbage collector&lt;/a&gt;
, &lt;a href="https://www.azul.com/products/components/falcon-jit-compiler/" target="_blank" rel="noopener noreferrer"&gt;Falcon JIT compiler&lt;/a&gt;
, and other technologies created by Azul. Prime Builds are available in two versions, either for evaluation or production use:&lt;/p&gt;</description></item><item><title>Web Crawling in Java: Classical Threads and Virtual Threads</title><link>https://foojayio.github.io/website/today/web-crawling-in-java-a-tale-of-classical-threads-and-virtual-threads/</link><pubDate>Fri, 29 Sep 2023 12:23:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/web-crawling-in-java-a-tale-of-classical-threads-and-virtual-threads/</guid><description>&lt;p&gt;I&lt;strong&gt;n today&amp;rsquo;s fast-paced digital world, web crawling is a cornerstone technology behind search engines, data analysis tools, and various other applications.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Java, a language known for its robustness and scalability, offers intriguing ways to implement web crawling.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yet, the thread model you choose can make a world of difference.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This article unfolds a compelling narrative around web crawling in Java, contrasting classical threads with their newer counterpart: virtual threads.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="h2-0-environment-setup"&gt;&lt;strong&gt;Environment Setup&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Before diving into the code and its intricate comparisons, ensure you have JDK 21 installed on your system. If you&amp;rsquo;re using a Unix-based system, SDKMAN! It makes this simple. Just open your terminal and run &lt;code&gt;curl -s &amp;quot;https://get.sdkman.io&amp;quot; | bash&lt;/code&gt; to install SDKMAN!, followed by &lt;code&gt;source &amp;quot;$HOME/.sdkman/bin/sdkman-init.sh&amp;quot;&lt;/code&gt; to initialize it. Finally, install JDK 21 with &lt;code&gt;sdk install java 21.0.0-&amp;lt;vendor&amp;gt;&lt;/code&gt;, replacing &amp;lt;vendor&amp;gt; with your preferred vendor (e.g., zulu, adopt).&lt;/p&gt;</description></item><item><title>C2 Might Be Slowing Down Your Builds</title><link>https://foojayio.github.io/website/today/c2-might-be-slowing-down-your-builds/</link><pubDate>Thu, 28 Sep 2023 09:55:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/c2-might-be-slowing-down-your-builds/</guid><description>&lt;p&gt;&lt;strong&gt;At the JavaForumNord two weeks ago, I had a friendly chat with Karl Heinz Marbaise (Chairman of the Apache Maven Project), where he mentioned that he wanted to start profiling Maven. This sounded interesting, so I started looking into the performance and bottlenecks of Maven. I began by using the Maven build of &lt;a href="https://github.com/apache/maven" target="_blank" rel="noopener noreferrer"&gt;maven&lt;/a&gt;
 itself as a starting point (excluding the tests). The following is my first observation related to Maven builds in CIs.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Memory Management in Java: An Introduction</title><link>https://foojayio.github.io/website/today/java-memory-management/</link><pubDate>Wed, 27 Sep 2023 13:47:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-memory-management/</guid><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;Understanding memory management in Java, and particularly the role of object allocation is essential when optimising system performance.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In Java, memory management is an automatic process that is managed by the Java Virtual Machine (JVM), and one that does not need explicit intervention. Java, being a block-structured language, uses a model where its memory is divided into two main types: stack and heap.&lt;/p&gt;
&lt;p&gt;Local variables and method parameters use memory based on a &amp;lsquo;stack&amp;rsquo;. This area of memory grows and shrinks automatically when a code block or method is entered or exited, respectively. In situations where a request is made to the system for an amount of memory, whose size is only known at runtime, or when creating an object, these requests are usually satisfied by an area of the process&amp;rsquo; memory known as &amp;lsquo;dynamic memory&amp;rsquo; or the &amp;lsquo;heap&amp;rsquo;. Strictly speaking &amp;ndash; there is an occasion when an object that may be destined for the heap is instead written to the stack, however we will leave this discussion for a later document.&lt;/p&gt;</description></item><item><title>Building Real-Time Applications to Process Wikimedia Streams</title><link>https://foojayio.github.io/website/today/building-real-time-applications-to-process-wikimedia-streams-using-kafka-and-hazelcast/</link><pubDate>Fri, 15 Sep 2023 14:33:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-real-time-applications-to-process-wikimedia-streams-using-kafka-and-hazelcast/</guid><description>&lt;p&gt;&lt;strong&gt;In this tutorial, developers, solution architects, and data engineers can learn how to build high-performance, scalable, and fault-tolerant applications that react to real-time data using Kafka and Hazelcast.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We will be using Wikimedia as a real-time data source. Wikimedia provides various streams and APIs (Application Programming Interfaces) to access real-time data about edits and changes made to their projects.&lt;/p&gt;
&lt;p&gt;For example, this source provides a continuous stream of updates on recent changes, such as new edits or additions to Wikipedia articles. Developers and solution architects often use such streams to monitor and analyze the activity on Wikimedia projects in real-time or to build applications that rely on this data, like this tutorial.&lt;/p&gt;</description></item><item><title>Chronicle Services: Building Fast Microservices with Java</title><link>https://foojayio.github.io/website/today/chronicle-services-building-fast-microservices-with-java/</link><pubDate>Wed, 13 Sep 2023 13:47:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/chronicle-services-building-fast-microservices-with-java/</guid><description>&lt;h3 id="h3-0-low-latency"&gt;Low Latency?&lt;/h3&gt;
&lt;p&gt;In computing, latency is defined as the length of time to perform some task. This could be the time it takes to respond to an interrupt from hardware or the time it takes for a message sent by one component to be available to its recipient.&lt;/p&gt;
&lt;p&gt;In many cases, latency is not seen as a primary non-functional concern when designing an application, even when considering performance. Most of the time, after all, computers seem to do their work at speeds that are well beyond human perception, typically using scales of milliseconds, microseconds, or even nanoseconds.&lt;/p&gt;</description></item><item><title>Load testing - shoot your application with Gatling</title><link>https://foojayio.github.io/website/today/load-testing-shoot-your-application-with-gatling/</link><pubDate>Wed, 06 Sep 2023 09:32:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/load-testing-shoot-your-application-with-gatling/</guid><description>&lt;h2 id="_what_is_load_testing"&gt;What is load testing?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Load testing entails testing how our application performs under a significant load so we can be certain it behaves as expected when there&amp;rsquo;s an influx of users.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Or at least so we know what it can cope it, and at what point we might potentially need to take action.&lt;/p&gt;
&lt;p&gt;After all, it might not (only) be the code that&amp;rsquo;s the issue.&lt;/p&gt;
&lt;p&gt;This is a process that requires quite a bit of cooperation between testers, developers, and those using it to properly determine the scenarios, and a smooth &amp;amp; swift feedback loop is important to make sure our solutions work properly. And it will likely be some of the most expensive tests given both the people involved and the need for a testing environment that&amp;rsquo;s representative of the production configuration.&lt;/p&gt;</description></item><item><title>Azul Enhances ReadyNow to Solve Java’s Warmup &amp; Cloud Costs</title><link>https://foojayio.github.io/website/today/azul-enhances-readynow-to-solve-javas-warmup-problem-simplify-operations-and-optimize-cloud-costs/</link><pubDate>Wed, 30 Aug 2023 21:30:14 +0000</pubDate><guid>https://foojayio.github.io/website/today/azul-enhances-readynow-to-solve-javas-warmup-problem-simplify-operations-and-optimize-cloud-costs/</guid><description>&lt;ul&gt;
&lt;li&gt;Azul Platform Prime&amp;rsquo;s ReadyNow technology continuously learns from application usage across fleets of Java Virtual Machines (JVMs) and automatically selects the best warmup optimization patterns.&lt;/li&gt;
&lt;li&gt;ReadyNow Orchestrator delivers the highest possible optimized code speed at warmup while making deployment easier for containerized Java workloads and CI/CD pipelines, and requires no changes to Java applications.&lt;/li&gt;
&lt;li&gt;The combination of ReadyNow and ReadyNow Orchestrator allow Azul Platform Prime customers to optimize cloud costs by improving utilization levels, reducing compute instances needed while maintaining throughput and response SLAs, and more efficiently leverage cloud elasticity.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;SUNNYVALE, Calif. &amp;mdash; August 30, 2023 &amp;mdash;&lt;/strong&gt; &lt;a href="https://www.azul.com/" target="_blank" rel="noopener noreferrer"&gt;Azul&lt;/a&gt;
, the only company 100% focused on Java, today announced ReadyNow Orchestrator(RNO), a new feature of Azul Platform Prime powered by ReadyNow technology that slashes warmup time for Java applications, enabling significant improvements to operational efficiencies and optimization of cloud costs. Available now, ReadyNow Orchestrator requires no changes to Java applications and is included at no additional charge for Azul Platform Prime customers.&lt;/p&gt;</description></item><item><title>Thread-Safe Counter in Java: A Comprehensive Guide</title><link>https://foojayio.github.io/website/today/thread-safe-counter-in-java-a-comprehensive-guide/</link><pubDate>Thu, 17 Aug 2023 06:59:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/thread-safe-counter-in-java-a-comprehensive-guide/</guid><description>&lt;p&gt;&lt;strong&gt;In this tutorial, we will explore the concept of thread safety in Java, specifically focusing on a simple counter.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We will start by understanding why a basic counter is not safe for multiple threads; then, we will progressively enhance its thread safety using different techniques such as synchronization, locks, Unsafe, VarHandle, and finally, AtomicInteger.&lt;/p&gt;
&lt;p&gt;We will be referencing the code from this &lt;a href="https://github.com/rokon12/counter" target="_blank" rel="noopener noreferrer"&gt;repository&lt;/a&gt;
 throughout the tutorial.&lt;/p&gt;
&lt;p&gt;Before we dive into the different implementations, let&amp;rsquo;s define a Counter interface that all our counter classes will implement.&lt;/p&gt;</description></item><item><title>AsyncGetCallTrace Reworked: Frame by Frame Iterative Touch!</title><link>https://foojayio.github.io/website/today/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/</link><pubDate>Thu, 10 Aug 2023 09:43:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/</guid><description>&lt;p&gt;&lt;strong&gt;AsyncGetCallTrace is an API to obtain the top &lt;code&gt;n&lt;/code&gt; Java frames of a thread asynchronously in a signal handler.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This API is widely used but has its problems, see JEP 435 &lt;a href="https://foojayio.github.io/website/today/author/johannes-bechberger/"&gt;and my various articles on Foojay.io&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;My original approach with my JEP proposal was to build a replacement of the API, which could be used as a drop-in for AsyncGetCallTrace. Still a single method that populates a preallocated frame list:&lt;br&gt;
&lt;img src="https://mostlynerdless.de/wp-content/uploads/2023/08/asgct_asgst-2000x1125.png" alt="" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>Book Review: "OpenJDK Migration for Dummies"</title><link>https://foojayio.github.io/website/today/book-review-openjdk-migration-for-dummies/</link><pubDate>Fri, 04 Aug 2023 09:02:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/book-review-openjdk-migration-for-dummies/</guid><description>&lt;p&gt;&lt;strong&gt;The subject of Java licensing and OpenJDK migration is complex and vital to many software engineers.&lt;/strong&gt; &lt;strong&gt;I am no different. It&amp;rsquo;s a topic often shrouded in legal jargon and technicalities, making it difficult to approach.&lt;/strong&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&amp;ldquo;OpenJDK Migration for Dummies&amp;rdquo; by&lt;a href="https://www.linkedin.com/in/siritter/" target="_blank" rel="noopener noreferrer"&gt;Simon Ritter&lt;/a&gt;
 offers a fresh perspective, breaking down these challenges into digestible segments. (&lt;a href="https://www.azul.com/openjdk-migration-for-dummies/" target="_blank" rel="noopener noreferrer"&gt;Get it for free here.&lt;/a&gt;
)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.azul.com/openjdk-migration-for-dummies/" target="_blank" rel="noopener noreferrer"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;[&lt;/p&gt;
&lt;img decoding="async" class="alignright wp-image-101738" src="dummies-373x510.png" alt="" width="270" height="369"&gt;
&lt;p&gt;](&lt;a href="https://www.azul.com/openjdk-migration-for-dummies/" target="_blank" rel="noopener noreferrer"&gt;https://www.azul.com/openjdk-migration-for-dummies/&lt;/a&gt;
)&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;The book directly speaks to my core expertise in Java, providing clarity and guidance.&lt;/p&gt;</description></item><item><title>The IKEA Effect</title><link>https://foojayio.github.io/website/today/the-ikea-effect/</link><pubDate>Wed, 26 Jul 2023 13:00:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-ikea-effect/</guid><description>&lt;p&gt;&lt;strong&gt;The &lt;a href="https://theconversation.com/the-ikea-effect-how-we-value-the-fruits-of-our-labour-over-instant-gratification-113647" title="IKEA effect" target="_blank" rel="noopener noreferrer"&gt;IKEA effect&lt;/a&gt;
 is a fascinating phenomenon whereby consumers place a (sometimes disproportionately) higher value on things that they have either made themselves, or to which they&amp;rsquo;ve contributed towards making.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This can have a significant influence on perceived value &amp;ndash; to the extent that people might value imperfect things they&amp;rsquo;ve helped create, more than they would value the equivalent, perfect, but ready-made, product. Those who have pained memories of tussling with Allan keys and occasionally incomprehensible schematics for self-assembly furniture will no doubt have raised eyebrows. Of course, the effect only applies to items that are successfully assembled, of course. If people fail to build an item using the instructions provided, or it takes too long or is too difficult, due either to the complexity of the instructions or the inexperience of the user, then they do not ascribe the same value to the item.&lt;/p&gt;</description></item><item><title>Real-time Stream Processing with Hazelcast and Redpanda</title><link>https://foojayio.github.io/website/today/when-speed-matters-real-time-stream-processing-with-hazelcast-and-redpanda/</link><pubDate>Tue, 25 Jul 2023 09:33:27 +0000</pubDate><guid>https://foojayio.github.io/website/today/when-speed-matters-real-time-stream-processing-with-hazelcast-and-redpanda/</guid><description>&lt;p&gt;In this tutorial, we explore the powerful combination of Hazelcast and Redpanda to build high-performance, scalable, and fault-tolerant applications that react to real-time data.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://redpanda.com/" target="_blank" rel="noopener noreferrer"&gt;Redpanda&lt;/a&gt;
 is a streaming data platform designed to handle high-throughput, real-time data streams. Compatible with Kafka APIs, Redpanda provides a highly performant and scalable alternative to Apache Kafka. Redpanda&amp;rsquo;s unique architecture enables it to handle millions of messages per second while ensuring low latency, fault tolerance, and seamless scalability.&lt;/p&gt;</description></item><item><title>How we developed the Eclipse OpenJ9 CRIU Support for fast Java start-up</title><link>https://foojayio.github.io/website/today/how-we-developed-the-eclipse-openj9-criu-support-for-fast-java-startup/</link><pubDate>Wed, 19 Jul 2023 15:33:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-we-developed-the-eclipse-openj9-criu-support-for-fast-java-startup/</guid><description>&lt;p&gt;&lt;strong&gt;Checkpointing and restoring the JVM makes applications run faster because all the startup work is done before deployment. This means that in serverless cloud applications, the end-user of the application perceives no delay when the application starts. You can try it out now with your own apps on Open Liberty with Eclipse OpenJ9. But if you want to know more, here&amp;rsquo;s how we tackled the technical challenges of developing the Eclipse OpenJ9 CRIU Support.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>A Dissection of Java JDBC to PostgreSQL, Part 2: Batching</title><link>https://foojayio.github.io/website/today/a-dissection-of-java-jdbc-to-postgresql-connections-part-2-batching/</link><pubDate>Tue, 04 Jul 2023 13:56:41 +0000</pubDate><guid>https://foojayio.github.io/website/today/a-dissection-of-java-jdbc-to-postgresql-connections-part-2-batching/</guid><description>&lt;p&gt;This is the second part of a series where I look into how Java JDBC connections to PostgreSQL are working, to understand how to optimally implement them.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve landed on this article, it might be a good idea to read &lt;a href="https://foojayio.github.io/website/today/a-dissection-of-java-jdbc-to-postgresql-connections/" title="my first article"&gt;my first article&lt;/a&gt;
 as well, which gives an introduction and shares how JDBC communicates with &lt;a href="https://www.yugabyte.com/postgresql/" title="PostgreSQL" target="_blank" rel="noopener noreferrer"&gt;PostgreSQL&lt;/a&gt;
 using simple and extended protocols.&lt;/p&gt;
&lt;p&gt;This new article specifically explores batching. Batching for PostgreSQL JDBC is a property of the extended protocol. It uniquely allows you to send multiple statements in a single request.&lt;/p&gt;</description></item><item><title>The Curious Case of Different Runtimes</title><link>https://foojayio.github.io/website/today/the-curious-case-of-different-runtimes-with-different-training-data-jit/</link><pubDate>Fri, 30 Jun 2023 08:12:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-curious-case-of-different-runtimes-with-different-training-data-jit/</guid><description>&lt;p&gt;&lt;strong&gt;While running some final tests, we noticed extremely erratic runtime behavior. It was hard to reproduce but very annoying because it means that the application runtime goes up from 5 to almost 14 min. This article tries to show how we diagnosed it and condensed it down to a few test cases. These might hopefully help us to provide some answers. Maybe, but only maybe, we discovered a defect or at least strange edge-case in the JVM.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Optimise CPU Performance Through Isolation and System Tuning</title><link>https://foojayio.github.io/website/today/how-to-optimise-cpu-performance-through-isolation-and-system-tuning/</link><pubDate>Thu, 29 Jun 2023 06:36:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-optimise-cpu-performance-through-isolation-and-system-tuning/</guid><description>&lt;h4 id="what-are-the-challenges-of-tuning-your-cpu-and-system-for-optimal-performance-with-linux-and-how-does-chronicle-tune-address-them"&gt;What are the challenges of tuning your CPU and system for optimal performance with Linux, and how does Chronicle Tune address them?&lt;/h4&gt;
&lt;p&gt;CPU isolation and efficient system management are critical for any application which requires low-latency and high-performance computing. These measures are especially important for high-frequency trading systems, where split-second decisions on buying and selling stocks must be made.&lt;/p&gt;
&lt;p&gt;To achieve this level of performance, such systems require dedicated CPU cores that are free from interruptions by other processes, together with wider system tuning.&lt;/p&gt;</description></item><item><title>The Anatomy of a JVM</title><link>https://foojayio.github.io/website/today/the-anatomy-of-a-jvm/</link><pubDate>Fri, 16 Jun 2023 07:57:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-anatomy-of-a-jvm/</guid><description>&lt;p&gt;Java is not only a programming language.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s an &amp;ldquo;umbrella&amp;rdquo; that covers tools, runtimes, and even a whole community.&lt;/p&gt;
&lt;p&gt;In this article, we want to look at one part under the umbrella: the &lt;strong&gt;Java Virtual Machine&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;What is it exactly, and how does it work?&lt;/p&gt;
&lt;br /&gt;
&lt;hr&gt;
&lt;h3 id="h3-0-java-is-consistently-in-the-top-of-most-popular-languages-the-real-reason-for-this-is-not-the-language-itself-but-the-jvm-and-the-power-that-it-gives-to-the-developer"&gt;&lt;em&gt;Java is consistently in the top of most popular languages. The real reason for this is not the language itself but the JVM. And the power that it gives to the developer.&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;Simon Ritter, Deputy CTO, Azul&lt;/p&gt;</description></item><item><title>Unique Identifiers Based on Timestamps in Distributed Applications</title><link>https://foojayio.github.io/website/today/unique-identifiers-based-on-timestamps-in-distributed-applications/</link><pubDate>Wed, 14 Jun 2023 11:22:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/unique-identifiers-based-on-timestamps-in-distributed-applications/</guid><description>&lt;p&gt;At &lt;a href="https://chronicle.software/?utm_source=website&amp;amp;amp;utm_medium=foojay&amp;amp;amp;utm_campaign=unique-identifiers" title="Chronicle" target="_blank" rel="noopener noreferrer"&gt;Chronicle&lt;/a&gt;
 we build applications that must process very high numbers of events with minimum latency. Generating unique IDs for these events using the traditional method of UUIDs introduces an unacceptable time overhead into our applications, so an alternative approach is needed.&lt;/p&gt;
&lt;p&gt;I recently wrote &lt;a href="http://blog.vanillajava.blog/2021/12/system-wide-unique-nanosecond-timestamps.html" title="an article" target="_blank" rel="noopener noreferrer"&gt;an article&lt;/a&gt;
 on how timestamps can be used as unique identifiers, as they are much cheaper to generate than other methods of generating unique identifiers, taking a fraction of a microsecond.&lt;/p&gt;</description></item><item><title>Breaking the Code: How Chris Newland is Changing the Game in JVM Performance!</title><link>https://foojayio.github.io/website/today/breaking-the-code-how-chris-newland-is-changing-the-game-in-jvm-performance/</link><pubDate>Mon, 12 Jun 2023 08:44:27 +0000</pubDate><guid>https://foojayio.github.io/website/today/breaking-the-code-how-chris-newland-is-changing-the-game-in-jvm-performance/</guid><description>&lt;figure class="alignright size-full is-resized"&gt;
 &lt;img fetchpriority="high" decoding="async" src="chris.png" alt="" class="wp-image-98734" width="384" height="384"&gt;
&lt;/figure&gt;
&lt;p&gt;We&amp;rsquo;re excited to introduce you to Chris Newland, an industry veteran and dedicated JVM performance specialist.&lt;/p&gt;
&lt;p&gt;Chris has a long-standing history of contributing to the Java community with open-source tools aimed at enhancing Java and JVM understanding.&lt;/p&gt;
&lt;p&gt;Among his well-known tools is JITWatch, which has gained significant recognition and use in the JVM community.&lt;/p&gt;
&lt;p&gt;In this conversation, we delve into Chris&amp;rsquo;s journey, his motivations, and his thoughts on JVM performance, Java ecosystem changes, and the role of AI in software development.&lt;/p&gt;</description></item><item><title>State of Java Survey</title><link>https://foojayio.github.io/website/today/state-of-java-survey/</link><pubDate>Tue, 23 May 2023 05:47:41 +0000</pubDate><guid>https://foojayio.github.io/website/today/state-of-java-survey/</guid><description>&lt;p&gt;Do you ever wonder what OpenJDK distributions and what Java versions your peers are using? Java-based infrastructures and languages? How many are running Java applications in public clouds?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;THE SURVEY DESCRIBED BELOW IS NOW COMPLETE, NO MORE RESPONSES CAN BE ACCEPTED.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Azul has been gathering all that data from a survey of Java users, running until 6:30pm CT on June 15, 2023. If you want to participate, the survey takes about 10 minutes, and we&amp;rsquo;ll hook you up with the report after the survey is complete. Plus you&amp;rsquo;ll be helping to add to our collective knowledge. Plus you&amp;rsquo;ll be entered into a drawing to win prizes like an Apple MacBook Pro laptop or a set of AirPods.
&lt;img src="https://foojayio.github.io/website/today/state-of-java-survey/image-6-1024x272.png" alt="" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>Foojay Podcast #23: Java Profiling and Performance</title><link>https://foojayio.github.io/website/today/foojay-podcast-23/</link><pubDate>Mon, 22 May 2023 10:23:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-23/</guid><description>&lt;p&gt;How do you get the maximum performance out of your Java application?&lt;/p&gt;
&lt;p&gt;And how to use profiling to find the bottlenecks?&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s learn all about it in this podcast, with Heinz Kabutz, Marcus Lagergren, Chris Newland, and Frank Delporte!&lt;/p&gt;
&lt;p&gt;Java profiling is a crucial technique for measuring and improving the performance of applications.&lt;/p&gt;
&lt;p&gt;It helps identify bottlenecks, memory leaks, and other application performance issues.&lt;/p&gt;
&lt;p&gt;There are various challenges with using Java profiling, and the need for profiling depends on the complexity of the application and the performance requirements.&lt;/p&gt;</description></item><item><title>Unlocking Reproducible Profiler Tests</title><link>https://foojayio.github.io/website/today/mastering-the-art-of-controlling-the-jit-unlocking-reproducible-profiler-tests/</link><pubDate>Fri, 19 May 2023 09:02:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/mastering-the-art-of-controlling-the-jit-unlocking-reproducible-profiler-tests/</guid><description>&lt;p&gt;In my last article, &lt;a href="https://foojayio.github.io/website/today/using-async-profiler-and-jattach-programmatically-with-ap-loader/"&gt;Using Async-Profiler and Jattach Programmatically with AP-Loader&lt;/a&gt;
, I hinted that I&amp;rsquo;m currently working on a test library for writing better profiling API tests.&lt;/p&gt;
&lt;p&gt;The library is still work-in-progress, but it already allows you to write profiling API tests in plain Java:&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;private int innerASGCT2() {
 new Tracer().runASGCT().assertTrue(
 Frame.hasMethod(0, "innerASGCT2", "()I"), 
 Frame.hasMethod(1, "testRunASGCT2"));
 return 0;
}

@Test
public void testRunASGCT2() {
 innerASGCT2();
}&lt;/pre&gt;
&lt;p&gt;This test case checks that calling AsyncGetCallTrace gives the correct result in this specific example. The test library allows you to write tests comparing the returns of multiple GetStackTrace, AsyncGetCallTrace, and AsyncGetStackTrace invocations in different modes and settings. The library can be found as trace-tester on GitHub; I aim to bring it into the OpenJDK later with my JEP.&lt;/p&gt;</description></item><item><title>Enriching Kafka Applications with Contextual Data</title><link>https://foojayio.github.io/website/today/enriching-kafka-applications-with-contextual-data/</link><pubDate>Thu, 18 May 2023 15:11:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/enriching-kafka-applications-with-contextual-data/</guid><description>&lt;p&gt;Developing high-performance large-stream processing applications is a challenging task.&lt;/p&gt;
&lt;p&gt;Choosing the right tool(s) is crucial to get the job done; as developers, we tend to focus on performance, simplicity, and cost.&lt;/p&gt;
&lt;p&gt;However, the cost becomes relatively high if we end up with two or more tools to do the same task.&lt;/p&gt;
&lt;p&gt;Simply put, you need to multiply development time, deployment time, and maintenance costs by the number of tools.&lt;/p&gt;
&lt;h2 id="h2-0-kafka"&gt;Kafka&lt;/h2&gt;
&lt;p&gt;Kafka is great for event streaming architectures, continuous data integration (ETL), and messaging systems of record (database).&lt;/p&gt;</description></item><item><title>Using Pausers in Event Loops</title><link>https://foojayio.github.io/website/today/using-pausers-in-event-loops/</link><pubDate>Wed, 17 May 2023 09:25:23 +0000</pubDate><guid>https://foojayio.github.io/website/today/using-pausers-in-event-loops/</guid><description>&lt;p&gt;Typically in low-latency development, a trade-off must be made between minimising latency and avoiding excessive CPU utilisation.&lt;/p&gt;
&lt;p&gt;This article explores how Chronicle&amp;rsquo;s Pausers can be used to automatically apply a back-off strategy when there is no data to be processed, providing an excellent balance between resource usage and responsive, low-latency, low-jitter applications.&lt;/p&gt;
&lt;h3 id="h3-0-description-of-the-problem"&gt;Description of the Problem&lt;/h3&gt;
&lt;p&gt;In a typical application stack multiple threads are used for servicing events, processing data, pipelining etc.&lt;/p&gt;</description></item><item><title>Reduce Java Application Startup and Warmup Times with CRaC</title><link>https://foojayio.github.io/website/today/reduce-java-application-startup-and-warmup-times-with-crac/</link><pubDate>Tue, 16 May 2023 11:21:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/reduce-java-application-startup-and-warmup-times-with-crac/</guid><description>&lt;p&gt;When a Java application runs, the JVM goes through the process of loading, initializing, and optimizing the code used by the application, including libraries, frameworks, and other components to reach the optimal performance level.&lt;/p&gt;
&lt;p&gt;Each time the application restarts, it has no record or memory of previous times it has run and the work it performed.&lt;/p&gt;
&lt;p&gt;As a result, it has to restart, extending valuable startup and warmup times and using precious resources.&lt;/p&gt;</description></item><item><title>TornadoVM: Code Interoperability Mode</title><link>https://foojayio.github.io/website/today/code-interoperability-mode-for-opencl-portability-across-various-programming-languages-with-tornadovm/</link><pubDate>Thu, 11 May 2023 07:54:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/code-interoperability-mode-for-opencl-portability-across-various-programming-languages-with-tornadovm/</guid><description>&lt;p&gt;&lt;a href="https://www.tornadovm.org/" target="_blank" rel="noopener noreferrer"&gt;TornadoVM&lt;/a&gt;
 is a programming framework for accelerating Java applications on heterogeneous devices, like multi-core CPUs, GPUs and FPGAs.&lt;/p&gt;
&lt;p&gt;Java developers can use the TornadoVM API to prototype Java methods within their code bases for hardware acceleration.&lt;/p&gt;
&lt;p&gt;TornadoVM is hardware-agnostic, but the generated code (i.e., kernels) for acceleration can be executed only through the TornadoVM runtime.&lt;/p&gt;
&lt;p&gt;This blog outlines the key changes in TornadoVM to &lt;strong&gt;enable code interoperability of kernels with other programming languages beyond Java&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Tuning Java Applications for Low Latency on Linux</title><link>https://foojayio.github.io/website/today/tuning-java-applications-for-low-latency-on-linux/</link><pubDate>Wed, 10 May 2023 13:34:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/tuning-java-applications-for-low-latency-on-linux/</guid><description>&lt;h3 id="h3-0-introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;I have lost count of the number of times I have been told that Java is not a suitable language in which to develop applications where performance is a major consideration. My first response is usually to ask for clarification on what is actually meant by &amp;ldquo;performance&amp;rdquo; as two of the most common measures &amp;ndash; throughput and latency, sometimes conflict with each other, and approaches to optimise for one may have a detrimental effect on the other.&lt;/p&gt;</description></item><item><title>A Comprehensive Guide to Java Virtual Threads (Part 1)</title><link>https://foojayio.github.io/website/today/unleashing-the-power-of-lightweight-concurrency-a-comprehensive-guide-to-java-virtual-threads-part-1/</link><pubDate>Tue, 09 May 2023 08:33:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/unleashing-the-power-of-lightweight-concurrency-a-comprehensive-guide-to-java-virtual-threads-part-1/</guid><description>&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Java Virtual Threads, also known as lightweight threads, is an exciting new feature introduced in Project Loom.&lt;/p&gt;
&lt;p&gt;Virtual threads aim to simplify concurrent programming in Java by providing an efficient and easy-to-use concurrency model.&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll cover the basics of Java Virtual Threads, how they work, why they are beneficial for developers, and how they overcome the limitations of traditional Java threads.&lt;/p&gt;
&lt;h2 id="h2-1-what-are-virtual-threads"&gt;What are Virtual Threads?&lt;/h2&gt;
&lt;p&gt;Java is made of threads. When we run a Java program, its main method is invoked as the first call frame of the main thread created by the Java launcher. It gives us many things: sequential control flow, local variables, exception handling, single-step debugging, and profiling.&lt;/p&gt;</description></item><item><title>Using Async-Profiler and Jattach Programmatically with AP-Loader</title><link>https://foojayio.github.io/website/today/using-async-profiler-and-jattach-programmatically-with-ap-loader/</link><pubDate>Thu, 04 May 2023 11:45:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/using-async-profiler-and-jattach-programmatically-with-ap-loader/</guid><description>&lt;p&gt;Using &lt;a href="https://github.com/jvm-profiling-tools/async-profilerhttps://github.com/jvm-profiling-tools/async-profiler" target="_blank" rel="noopener noreferrer"&gt;async-profiler&lt;/a&gt;
 and jattach can be quite a hassle. First, you have to download the proper archive from GitHub for your OS and architecture; then, you have to unpack it and place it somewhere.&lt;/p&gt;
&lt;p&gt;It gets worse if you want to embed it into your library, agent, or application. Library developers cannot just use maven dependency but have to create wrapper code and build scripts that deal with packaging the binaries themselves, or worse, they depend on a preinstalled version which they do not control.&lt;/p&gt;</description></item><item><title>The Unix Philosophy for Low Latency</title><link>https://foojayio.github.io/website/today/the-unix-philosophy-for-low-latency/</link><pubDate>Thu, 04 May 2023 08:03:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-unix-philosophy-for-low-latency/</guid><description>&lt;p&gt;Unix has been around for more than 50 years, and the original design principles must be good enough for it (and its derivative, Linux) to be the most widely used Operating System on the planet &amp;ndash; &lt;a href="https://en.wikipedia.org/wiki/Usage_share_of_operating_systems" target="_blank" rel="noopener noreferrer"&gt;80% of servers&lt;/a&gt;
, &lt;a href="https://en.wikipedia.org/wiki/Usage_share_of_operating_systems#Supercomputers" target="_blank" rel="noopener noreferrer"&gt;most supercomputers&lt;/a&gt;
, and the most &lt;a href="https://en.wikipedia.org/wiki/Usage_share_of_operating_systems" target="_blank" rel="noopener noreferrer"&gt;deployed OS (Android&lt;/a&gt;
). It is also the most popular OS on Mars!&lt;/p&gt;
&lt;p&gt;Much of Unix&amp;rsquo;s success can be attributed to the &amp;ldquo;&lt;a href="https://en.wikipedia.org/wiki/Unix_philosophy" target="_blank" rel="noopener noreferrer"&gt;Unix Philosophy&lt;/a&gt;
&amp;rdquo; which can be very briefly summarised as:&lt;/p&gt;</description></item><item><title>The Basis of Virtual Threads: Continuations</title><link>https://foojayio.github.io/website/today/the-basis-of-virtual-threads-continuations/</link><pubDate>Fri, 28 Apr 2023 13:38:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-basis-of-virtual-threads-continuations/</guid><description>&lt;p&gt;&lt;strong&gt;Virtual threads are lightweight implementations of java.lang.Thread and they promise to write highly scalable concurrent applications. This article turns the spotlight on the Continuations that are the basis of Virtual threads.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://openjdk.org/projects/loom/" target="_blank" rel="noopener noreferrer"&gt;Project Loom&lt;/a&gt;
 has been the focus of attention in the Java community since the day it was announced. Java developers were excited by Loom&amp;rsquo;s promise that, with virtual threads, they could write highly scalable applications that may utilize the hardware optimally, without changing their habits.&lt;/p&gt;</description></item><item><title>Couldn’t we just Use AsyncGetCallTrace in a Separate Thread?</title><link>https://foojayio.github.io/website/today/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/</link><pubDate>Tue, 25 Apr 2023 05:31:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/couldnt-we-just-use-asyncgetcalltrace-in-a-separate-thread/</guid><description>&lt;p&gt;I&amp;rsquo;m keenly interested in everything related to profiling on the JVM, especially if it is related to AsyncGetCallTrace, this tiny unofficial API that powers most profilers out there, heck, I&amp;rsquo;m even in the process of adding an &lt;a href="https://mostlynerdless.de/blog/2023/01/19/asyncgetstacktrace-a-better-stack-trace-api-for-the-jvm/" target="_blank" rel="noopener noreferrer"&gt;improved version to the OpenJDK&lt;/a&gt;
, AsyncGetStackTrace.&lt;/p&gt;
&lt;p&gt;During the discussions on the related JDK enhancement proposal and PRs fixing AsyncGetCallTrace bugs, one thing often arises: Why is AsyncGetCallTrace always called in the signal handler on top of the stack that we want to walk (like in my &lt;a href="https://mostlynerdless.de/blog/tag/writing-a-profiler-from-scratch/" target="_blank" rel="noopener noreferrer"&gt;Writing a Profiler from Scratch&lt;/a&gt;
 series)?&lt;br&gt;
&lt;img src="https://mostlynerdless.de/wp-content/uploads/2023/04/wall-clock-sampling-sequence.drawio-1.svg" alt="" loading="lazy"&gt;
 Interaction between the wall-clock sampler thread and the different signal handlers, as currently implemented in async-profiler.&lt;/p&gt;</description></item><item><title>Chronicle FIX: Much More Than a Quick Fix</title><link>https://foojayio.github.io/website/today/chronicle-fix-much-more-than-a-quick-fix/</link><pubDate>Wed, 12 Apr 2023 13:55:24 +0000</pubDate><guid>https://foojayio.github.io/website/today/chronicle-fix-much-more-than-a-quick-fix/</guid><description>&lt;p&gt;Many of our customers have upgraded from QuickFIX/J to &lt;a href="https://chronicle.software/fix-engine/" target="_blank" rel="noopener noreferrer"&gt;Chronicle FIX&lt;/a&gt;
 and this article provides some background as to why.&lt;/p&gt;
&lt;h3 id="h3-0-introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.quickfixj.org/" target="_blank" rel="noopener noreferrer"&gt;QuickFIX/J&lt;/a&gt;
 is free, accessible, supports the FIX standard and is therefore often chosen by the IT team for a first FIX engine.&lt;/p&gt;
&lt;p&gt;However, when the business grows, its limitations become clear. The reasons most commonly given to us are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Throughput and latency&lt;/li&gt;
&lt;li&gt;HA/DR functionality&lt;/li&gt;
&lt;li&gt;Advanced features e.g. routing and message translation&lt;/li&gt;
&lt;li&gt;Global commercial support&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also, some customers engage with us because they already use our open source products e.g. Chronicle Queue, or our enterprise products e.g., Chronicle Queue Enterprise replication, or Chronicle Services EDA/Microservices accelerator.&lt;/p&gt;</description></item><item><title>Analyzing &amp; Tuning Warm-up: Azul Zulu Prime Builds of OpenJDK</title><link>https://foojayio.github.io/website/today/analyzing-and-tuning-warm-up-of-the-jvm-with-azul-zulu-prime-builds-of-openjdk/</link><pubDate>Sat, 01 Apr 2023 16:35:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/analyzing-and-tuning-warm-up-of-the-jvm-with-azul-zulu-prime-builds-of-openjdk/</guid><description>&lt;p&gt;&lt;strong&gt;Warm-up is the time taken for the Java application to reach the optimum compiled code performance&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It is the task of the Just-in-Time (JIT) compiler to deliver optimal performance by producing optimized compiled code from application bytecode. This article will give you a basic understanding of how JIT compilation works and how to optimize warm-up using Azul Zulu Prime Builds of OpenJDK (Azul Zulu Prime JDK).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This post has been reviewed and extended on July 20th of 2023 thanks to the contributions of Matt Van Order.&lt;/p&gt;</description></item><item><title>Writing a Profiler in 240 Lines of Pure Java</title><link>https://foojayio.github.io/website/today/writing-a-profiler-in-240-lines-of-pure-java/</link><pubDate>Thu, 30 Mar 2023 07:14:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/writing-a-profiler-in-240-lines-of-pure-java/</guid><description>&lt;p&gt;A few months back, I started writing a profiler from scratch, and the code since became the base of my profiler validation tools.&lt;/p&gt;
&lt;p&gt;The only problem with this project: I wanted to write a proper non-safepoint-biased profiler from scratch.&lt;/p&gt;
&lt;p&gt;This is a noble effort, but it requires lots C/C++/Unix programming which is finicky, and not everyone can read C/C++ code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;For people unfamiliar with safepoint bias: A safepoint is a point in time where the JVM has a known defined state, and all threads have stopped. The JVM itself needs safepoints to do major garbage collections, Class definitions, method deoptimizations, and more. Threads are regularly checking whether they should get into a safepoint, for example, at method entry, exit, or loop backjumps. A profiler that only profiles at a safepoint have an inherent bias because it only includes frames from the locations inside methods where Threads check for a safepoint. The only advantage is that the stack-walking at safepoints is slightly less error-prone, as there are fewer mutations of heap and stack.&lt;/em&gt; &lt;em&gt;For more information, consider reading the excellent article &lt;a href="https://seethawenner.medium.com/java-safepoint-and-async-profiling-cdce0818cd29" target="_blank" rel="noopener noreferrer"&gt;Java Safepoint and Async Profiling&lt;/a&gt;
 by Seetha Wenner, the &lt;a href="http://Why%20JVM%20modern%20profilers%20are%20still%20safepoint%20biased?" target="_blank" rel="noopener noreferrer"&gt;more technical one by JP Bempel&lt;/a&gt;
, or the classic article &lt;a href="http://psy-lob-saw.blogspot.com/2015/12/safepoints.html" target="_blank" rel="noopener noreferrer"&gt;Safepoints: Meaning, Side Effects and Overheads&lt;/a&gt;
 by Nitsan Wakart. To conclude: Safepoint-biased profilers don&amp;rsquo;t give you a holistic view of your application, but can still be helpful to analyze major performance issues where you look at the bigger picture.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Chronicle Wire: Object Marshalling</title><link>https://foojayio.github.io/website/today/chronicle-wire-object-marshalling/</link><pubDate>Wed, 29 Mar 2023 13:35:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/chronicle-wire-object-marshalling/</guid><description>&lt;p&gt;At &lt;a href="https://chronicle.software/?utm_source=foojay&amp;amp;amp;utm_medium=article&amp;amp;amp;utm_campaign=jasmine-article" title="Chronicle" target="_blank" rel="noopener noreferrer"&gt;Chronicle&lt;/a&gt;
, we know that efficient code doesn&amp;rsquo;t just run faster; if it&amp;rsquo;s using less compute-resource, it may also be cheaper to run.&lt;/p&gt;
&lt;p&gt;In particular, distributed cloud applications can benefit from fast, lightweight serialisation.&lt;/p&gt;
&lt;p&gt;In this article, we will demonstrate the efficiencies of using Chronicle Wire to encode small Strings into long primitives, with a few step-by-step examples of object marshalling, and show how this can improve the performance of your application&amp;rsquo;s serialisation.&lt;/p&gt;</description></item><item><title>Foojay Podcast #17: Execute Java Code with TornadoVM</title><link>https://foojayio.github.io/website/today/foojay-podcast-17/</link><pubDate>Mon, 27 Mar 2023 08:45:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-17/</guid><description>&lt;p&gt;TornadoVM is a programming and execution framework for offloading and running JVM applications on multi-core CPUs, GPUs, and FPGAs.&lt;/p&gt;
&lt;p&gt;With the same code, some of your existing program code can be executed hundreds of times faster!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/4Y-3qZNSkfM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;h2 id="h2-1--odcast-pps"&gt;Podcast Apps&lt;/h2&gt;
&lt;p&gt;You can listen and subscribe to the Foojay Podcast on:&lt;/p&gt;</description></item><item><title>Failover Client with the Hazelcast Viridian Serverless</title><link>https://foojayio.github.io/website/today/how-to-create-a-failover-client-using-the-hazelcast-viridian-serverless/</link><pubDate>Fri, 24 Mar 2023 14:55:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-create-a-failover-client-using-the-hazelcast-viridian-serverless/</guid><description>&lt;p&gt;Failover is an important feature of systems that rely on near-constant availability.&lt;/p&gt;
&lt;p&gt;In Hazelcast, a failover client automatically redirects its traffic to a secondary cluster when the client cannot connect to the primary cluster.&lt;/p&gt;
&lt;p&gt;Consider using a failover client with WAN replication as part of your disaster recovery strategy.&lt;/p&gt;
&lt;p&gt;In this tutorial, you&amp;rsquo;ll update the code in a Java client to automatically connect to a secondary, failover cluster if it cannot connect to its original, primary cluster.&lt;/p&gt;</description></item><item><title>Validating Java Profiling APIs</title><link>https://foojayio.github.io/website/today/validating-java-profiling-apis/</link><pubDate>Thu, 16 Mar 2023 14:43:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/validating-java-profiling-apis/</guid><description>&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/do-you-trust-profilers-i-once-did-too/"&gt;my last article&lt;/a&gt;
, I covered a correctness bug in the fundamental Java profiling API AsyncGetCallTrace that I found just by chance.&lt;/p&gt;
&lt;p&gt;Now the question is: could we find such bugs automatically?&lt;/p&gt;
&lt;p&gt;Potentially uncovering more bugs or being more confident in the absence of errors.&lt;/p&gt;
&lt;p&gt;I already wrote code to test the stability of the profiling APIs, testing for the lack of fatal errors, in my &lt;a href="https://github.com/parttimenerd/jdk-profiling-tester" target="_blank" rel="noopener noreferrer"&gt;jdk-profiling-tester&lt;/a&gt;
 project.&lt;/p&gt;
&lt;p&gt;Such tools are invaluable when modifying the API implementation or adding a new API.&lt;/p&gt;</description></item><item><title>Comparing Map.of() and new HashMap() in Java</title><link>https://foojayio.github.io/website/today/speed-test-comparing-map-of-new-hashmap/</link><pubDate>Thu, 16 Mar 2023 08:16:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/speed-test-comparing-map-of-new-hashmap/</guid><description>&lt;p&gt;Java is a popular programming language used for developing a wide range of applications, including web, mobile, and desktop applications.&lt;/p&gt;
&lt;p&gt;It provides many useful data structures for developers to use in their programs, one of which is the &lt;code&gt;Map&lt;/code&gt; interface.&lt;/p&gt;
&lt;p&gt;The Map interface is used to store data in key-value pairs, making it an essential data structure for many applications.&lt;/p&gt;
&lt;p&gt;In this article, we will discuss the use of &lt;code&gt;Map.of()&lt;/code&gt; and new &lt;code&gt;HashMap&amp;lt;&amp;gt;()&lt;/code&gt; in Java, the difference between them, and the benefits of using Map.of().&lt;/p&gt;</description></item><item><title>Efficient Memory Mapping for Terabyte Sparse Files in Java</title><link>https://foojayio.github.io/website/today/efficient-memory-mapping-for-terabyte-sparse-files-in-java/</link><pubDate>Wed, 15 Mar 2023 11:50:41 +0000</pubDate><guid>https://foojayio.github.io/website/today/efficient-memory-mapping-for-terabyte-sparse-files-in-java/</guid><description>&lt;p&gt;On Linux, you can create &lt;a href="https://en.wikipedia.org/wiki/Sparse_file" title="sparse files" target="_blank" rel="noopener noreferrer"&gt;sparse files&lt;/a&gt;
, where only the pages (of 4 KiB) that are touched utilise either memory or disk space.&lt;/p&gt;
&lt;p&gt;This allows you to memory map large virtual regions without worrying about wasted memory or disk&lt;/p&gt;
&lt;p&gt;In this program, you can see it reserves 8 TiB (8,192 GiB)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/efficient-memory-mapping-for-terabyte-sparse-files-in-java/Screen-Shot-2023-03-06-at-11.11.24-AM-1024x480.png" alt="" loading="lazy"&gt;
&lt;br&gt;
&lt;em&gt;Figure 1. Test 1: Sparse file&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Tip: x &amp;lt;&amp;lt; y means x × 2y therefore:&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="generic"&gt;1L &amp;lt;&amp;lt; 10 = 1 KiB (1024 bytes),
1L &amp;lt;&amp;lt; 20 = 1 MiB (10242 bytes),
1L &amp;lt;&amp;lt; 30 = 1 GiB (10243 bytes),
1L &amp;lt;&amp;lt; 40 = 1 TiB etc&lt;/pre&gt;
&lt;p&gt;Using multiples of 10 for the shift makes them easier to read.&lt;/p&gt;</description></item><item><title>Java Performance: Ahead-Of-Time versus Just-In-Time</title><link>https://foojayio.github.io/website/today/java-performance-ahead-of-time-versus-just-in-time/</link><pubDate>Thu, 09 Mar 2023 08:00:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-performance-ahead-of-time-versus-just-in-time/</guid><description>&lt;p&gt;Recently the &lt;a href="https://www.azul.com/" target="_blank" rel="noopener noreferrer"&gt;Azul&lt;/a&gt;
 team attended Devoxx Belgium, one of the biggest Java conferences with over 3,200 visitors.&lt;/p&gt;
&lt;p&gt;We talked with many developers and DevOps engineers, and one of the recurring questions was about the difference between Just-In-Time (JIT) and Ahead-Of-Time (AOT) execution of applications.&lt;/p&gt;
&lt;p&gt;More specifically, about better JIT performance compared to a native compiled AOT application.&lt;/p&gt;
&lt;p&gt;In this post, I give a quick update on both strategies to clarify why you will get different performance results.&lt;/p&gt;</description></item><item><title>Migrating Applications to TornadoVM v0.15 (Part 2)</title><link>https://foojayio.github.io/website/today/migrating-applications-to-tornadovm-v0-15-part-2/</link><pubDate>Sat, 04 Mar 2023 18:38:41 +0000</pubDate><guid>https://foojayio.github.io/website/today/migrating-applications-to-tornadovm-v0-15-part-2/</guid><description>&lt;p&gt;In the &lt;a href="https://foojayio.github.io/website/today/migrating-applications-to-tornadovm-v0-15-part-1/"&gt;previous blog&lt;/a&gt;
, we discussed the TornadoVM programming model and showed how programmers can define the parts of their Java applications to be offloaded for hardware acceleration via the TornadoVM API (v0.15).&lt;/p&gt;
&lt;p&gt;In this article, we will spotlight all the TornadoVM configurations/operations that regard the execution on the hardware device.&lt;/p&gt;
&lt;p&gt;In particular, this blog has the following objectives:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Provide guidelines regarding how programmers can trigger TornadoVM-specific configurations that regard the execution on hardware accelerators.&lt;/li&gt;
&lt;li&gt;Provide examples on how to exploit the new operations that are exposed by the new TornadoVM API.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Prerequisites {#h2-0-1-prerequisites}&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;This blog begins with a prerequisite that a snapshot of a user-defined TaskGraph is captured to an immutable state. This was the final point of the &lt;a href="https://foojayio.github.io/website/today/migrating-applications-to-tornadovm-v0-15-part-1/"&gt;previous blog&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Do you trust profilers? I once did too!</title><link>https://foojayio.github.io/website/today/do-you-trust-profilers-i-once-did-too/</link><pubDate>Wed, 01 Mar 2023 13:14:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/do-you-trust-profilers-i-once-did-too/</guid><description>&lt;p&gt;Profilers are great tools in your toolbox, like debuggers, when solving problems with your Java application (I&amp;rsquo;ve been &lt;a href="https://foojayio.github.io/website/today/foojay-podcast-14/"&gt;on a podcast on this topic&lt;/a&gt;
 recently).&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll tell you some of their problems and a technique to cope with them in this article.&lt;/p&gt;
&lt;p&gt;There are many open-source profilers, most notably JFR/JMC, and async-profiler, that help you to find and fix performance problems.&lt;/p&gt;
&lt;p&gt;But they are just software themselves, interwoven with a reasonably large project, the OpenJDK (or OpenJ9, for that matter), and thus suffer from the same problems as the typical problems of the applications they are used to profile:&lt;/p&gt;</description></item><item><title>Web App Startup in 3ms with RIFE2 and GraalVM</title><link>https://foojayio.github.io/website/today/web-app-startup-in-3ms-with-rife2-and-graalvm/</link><pubDate>Tue, 21 Feb 2023 09:12:55 +0000</pubDate><guid>https://foojayio.github.io/website/today/web-app-startup-in-3ms-with-rife2-and-graalvm/</guid><description>&lt;p&gt;&lt;a href="https://rife2.com" target="_blank" rel="noopener noreferrer"&gt;RIFE2&lt;/a&gt;
 applications already launch quickly with a regular JVM thanks merely calling Java methods, lambdas and doing object instantiations at startup. There are no annotations to scan for, nor any declarations or config files to parse and resolve.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/gbevin/rife2/releases/tag/1.3.0" target="_blank" rel="noopener noreferrer"&gt;RIFE2 v1.3.0 release&lt;/a&gt;
 introduced experimental support for GraalVM Ahead-Of-Time compilation with native-image, reducing the startup time of the bootstrap project from 177ms to an incredible 3ms.&lt;/p&gt;
&lt;h2 id="h2-0-try-it-out-yourself"&gt;Try it out yourself&lt;/h2&gt;
&lt;p&gt;In order to try this out, you can download the latest &lt;a href="https://www.graalvm.org/downloads/" target="_blank" rel="noopener noreferrer"&gt;GraalVM&lt;/a&gt;
 JDK 19 distribution, and follow the steps to install &lt;a href="https://www.graalvm.org/dev/reference-manual/native-image/" target="_blank" rel="noopener noreferrer"&gt;native-image&lt;/a&gt;
 on your machine.&lt;/p&gt;</description></item><item><title>JFR Timestamps and System.nanoTime Foojay.io</title><link>https://foojayio.github.io/website/today/jfr-timestamps-and-system-nanotime/</link><pubDate>Wed, 08 Feb 2023 15:33:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/jfr-timestamps-and-system-nanotime/</guid><description>&lt;p&gt;Did you ever wonder whether JFR timestamps use the same time source as &lt;code&gt;System.nanoTime&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;This is important when you have miscellaneous logging besides JFR events; otherwise, you would not be able to match JFR events and your logging properly.&lt;/p&gt;
&lt;p&gt;We assume here that you use &lt;code&gt;System.nanoTime&lt;/code&gt; and not less-suited timing information from &lt;code&gt;System.currentTimeMillis&lt;/code&gt;&lt;strong&gt;()&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The journey into this started with a question on the JDK Mission Control slack channel, which led me into a rabbit hole:&lt;/p&gt;</description></item><item><title>Which is the Fastest JVM: OpenJDK or GraalVM?</title><link>https://foojayio.github.io/website/today/which-is-the-fastest-jvm-openjdk-or-graalvm/</link><pubDate>Wed, 08 Feb 2023 10:51:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/which-is-the-fastest-jvm-openjdk-or-graalvm/</guid><description>&lt;p&gt;How is a high-performance, low-latency Java application affected by the JVM version used?&lt;/p&gt;
&lt;p&gt;Every nanosecond counts for trading and other applications where messages between two different threads are exchanged in about 250ns!&lt;/p&gt;
&lt;p&gt;Read this article and find out which JDK variant comes out at the top!&lt;/p&gt;
&lt;h3 id="h3-0-benchmarks"&gt;Benchmarks&lt;/h3&gt;
&lt;p&gt;This article will use open-source &lt;a href="https://bit.ly/3wWnXy8" target="_blank" rel="noopener noreferrer"&gt;Chronicle Queue&lt;/a&gt;
 to exchange 256-byte messages between two threads whereby all messages are also stored in shared memory (/dev/shm is used to minimise the impact of the disk subsystem).&lt;/p&gt;</description></item><item><title>Using Firefox Profiler beyond the web</title><link>https://foojayio.github.io/website/today/using-firefox-profiler-beyond-the-web/</link><pubDate>Fri, 03 Feb 2023 15:28:55 +0000</pubDate><guid>https://foojayio.github.io/website/today/using-firefox-profiler-beyond-the-web/</guid><description>&lt;p&gt;&lt;em&gt;This blog post is the base for the second half of my upcoming talk at FOSDEM 2023 on the topic &amp;ldquo;&lt;a href="http://%22https://fosdem.org/2023/schedule/event/mozilla_firefox_profiler_beyond_the_web/" target="_blank" rel="noopener noreferrer"&gt;Firefox Profiler beyond the web: Using Firefox Profiler to view Java profiling data&lt;/a&gt;
.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I detailed in &lt;a href="https://mostlynerdless.de/?p=628" target="_blank" rel="noopener noreferrer"&gt;my last blog post&lt;/a&gt;
 how the Firefox Profiler can be used to view Java profiling data:
&lt;img src="https://mostlynerdless.de/wp-content/uploads/2023/01/Screenshot-2023-01-27-at-12.34.45-1-2000x1201.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;But I&amp;rsquo;m of course not the only one who uses Firefox Profiler beyond the web because using it has many advantages: You&amp;rsquo;re essentially getting a prototypical visualization for your data in an afternoon.&lt;/p&gt;</description></item><item><title>Memory Allocation Pacing in Azul Zulu Prime builds of OpenJDK</title><link>https://foojayio.github.io/website/today/explained-memory-allocation-pacing-in-azul-zulu-prime-builds-of-openjdk/</link><pubDate>Fri, 03 Feb 2023 13:29:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/explained-memory-allocation-pacing-in-azul-zulu-prime-builds-of-openjdk/</guid><description>&lt;p&gt;The Java Virtual Machine (JVM) that runs your Java applications has a Garbage Collector (GC) responsible for recycling memory objects that are no longer needed.&lt;/p&gt;
&lt;p&gt;The GC operates by cycles, and running a cycle takes some time.&lt;/p&gt;
&lt;p&gt;Azul Zulu Prime uses the &lt;a href="https://www.azul.com/products/components/pgc/" target="_blank" rel="noopener noreferrer"&gt;C4 Garbage Collector&lt;/a&gt;
, which runs concurrently with your Java application.&lt;/p&gt;
&lt;p&gt;During the GC cycle, the application may outrun the GC and exhaust the memory before the GC completes.&lt;/p&gt;</description></item><item><title>What to Know About Garbage Collection as a Java Developer!</title><link>https://foojayio.github.io/website/today/what-should-i-know-about-garbage-collection-as-a-java-developer/</link><pubDate>Fri, 03 Feb 2023 13:20:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/what-should-i-know-about-garbage-collection-as-a-java-developer/</guid><description>&lt;p&gt;The Garbage Collector is a crucial part of the Java Virtual Machine (JVM) that has an impact on the performance and reliability of your application.&lt;/p&gt;
&lt;p&gt;But what is it exactly, and why is it important to understand how it works? If you&amp;rsquo;re a Java developer, you might ask, &amp;ldquo;What should I know about Garbage Collection?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Since I joined Azul as technical writer, it was a real discovery to talk to the engineers who develop such GCs and help companies get the most out of their Java systems.&lt;/p&gt;</description></item><item><title>Firefox Profiler Beyond the Web: IntelliJ plugin for JFR</title><link>https://foojayio.github.io/website/today/firefox-profiler-beyond-the-web/</link><pubDate>Thu, 02 Feb 2023 13:13:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/firefox-profiler-beyond-the-web/</guid><description>&lt;p&gt;&lt;em&gt;This blog post is the base of the first half of my upcoming talk at FOSDEM 2023 on the topic &amp;ldquo;&lt;a href="https://fosdem.org/2023/schedule/event/mozilla_firefox_profiler_beyond_the_web/" target="_blank" rel="noopener noreferrer"&gt;Firefox Profiler beyond the web: Using Firefox Profiler to view Java profiling data&lt;/a&gt;
.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;For the impatient:&lt;/strong&gt; Take a look at my &lt;a href="https://plugins.jetbrains.com/plugin/20937-java-jfr-profiler" target="_blank" rel="noopener noreferrer"&gt;Java JFR Profiler&lt;/a&gt;
 IntelliJ plugin to easily profile your application and view JFR files directly in your IDE.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I got involved in the &lt;a href="https://profiler.firefox.com/" target="_blank" rel="noopener noreferrer"&gt;Firefox Profiler&lt;/a&gt;
 development, spending significant portions of my time at SAP in the last half year on it. It has been an exciting ride. I learned a lot and contributed a few features. So I was essentially developing React code when I wasn&amp;rsquo;t working on ASGST or other OpenJDK-related tools.&lt;/p&gt;</description></item><item><title>Why Core-to-Core Latency Matters</title><link>https://foojayio.github.io/website/today/why-core-to-core-latency-matters/</link><pubDate>Thu, 02 Feb 2023 11:16:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-core-to-core-latency-matters/</guid><description>&lt;p&gt;A few years ago we had a global shortage of microchips; now, I feel there is a worldwide shortage of software developers.&lt;/p&gt;
&lt;p&gt;Like many other software companies, &lt;a href="https://bit.ly/3JE97nx" title="Chronicle Software" target="_blank" rel="noopener noreferrer"&gt;Chronicle Software&lt;/a&gt;
 is rapidly expanding and interviewing candidates. We usually ask candidates to demonstrate &lt;em&gt;a good knowledge of core Java&lt;/em&gt;, then we cover slightly more advanced concepts, such as the use of volatile memory, memory barriers and fences.&lt;/p&gt;
&lt;p&gt;While it is important to have a high-level understanding of these concepts when writing concurrent code, it&amp;rsquo;s surprising how few Java developers with 10+ years of experience have a deep knowledge of the underlying hardware. An initial goal of Java was to &amp;ldquo;write once, run anywhere&amp;rdquo;, but does that mean we should not be sympathetic to the hardware?&lt;/p&gt;</description></item><item><title>How to Run a Java Application with CRaC in a Docker Container</title><link>https://foojayio.github.io/website/today/how-to-run-a-java-application-with-crac-in-a-docker-container/</link><pubDate>Wed, 01 Feb 2023 09:41:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-run-a-java-application-with-crac-in-a-docker-container/</guid><description>&lt;p&gt;CRaC (Coordinated Restore at Checkpoint) is &lt;a href="https://openjdk.org/projects/crac/" target="_blank" rel="noopener noreferrer"&gt;an OpenJDK project&lt;/a&gt;
 that was &lt;a href="https://www.azul.com/blog/aws-snapstart-builds-momentum-for-the-crac-api/" target="_blank" rel="noopener noreferrer"&gt;developed by Azul&lt;/a&gt;
 to solve the problem of &amp;ldquo;slow&amp;rdquo; startup times of the Java Virtual Machine in a microservice environment.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The most up-to-date guidelines can be found on &amp;ldquo;&lt;a href="https://docs.azul.com/core/crac/crac-guidelines.html#running-crac-in-a-virtualized-environment-docker" target="_blank" rel="noopener noreferrer"&gt;Coordinated Restore at Checkpoint Usage Guidelines&lt;/a&gt;
&amp;rdquo; in the Azul Docs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When the JVM runs your application code, it does things like interpreting, compiling and optimizing code to make your application run as fast as possible under the given workload. This is great but can take some time and especially when you run short lived microservices you don&amp;rsquo;t want to wait until the JVM has produced the most optimized code.&lt;/p&gt;</description></item><item><title>AsyncGetStackTrace: A better Stack Trace API for the JVM</title><link>https://foojayio.github.io/website/today/asyncgetstacktrace-a-better-stack-trace-api-for-the-jvm/</link><pubDate>Thu, 26 Jan 2023 09:16:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/asyncgetstacktrace-a-better-stack-trace-api-for-the-jvm/</guid><description>&lt;p&gt;&lt;em&gt;This article is the basis for my upcoming talk at&lt;/em&gt; &lt;a href="https://fosdem.org/2023/schedule/event/asyncgetstacktrace_the_improved_version_of_asyncgetcalltrace_jep_435/" target="_blank" rel="noopener noreferrer"&gt;&lt;em&gt;FOSDEM 2023,&lt;/em&gt;&lt;/a&gt;
&lt;em&gt;&amp;ldquo;AsyncGetStackTrace: The Improved Version Of AsyncGetCallTrace (JEP 435),&lt;a href="https://fosdem.org/2023/schedule/event/asyncgetstacktrace_the_improved_version_of_asyncgetcalltrace_jep_435/" target="_blank" rel="noopener noreferrer"&gt;&amp;rdquo;&lt;/a&gt;
 and is based on JEP Candidate 435.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Consider you want to write a profiler to profile Java applications. Why? Because you think that the existing ones &lt;a href="http://psy-lob-saw.blogspot.com/2016/02/why-most-sampling-java-profilers-are.html" target="_blank" rel="noopener noreferrer"&gt;&amp;quot;[&amp;hellip;] Are Fucking Terrible&amp;quot;&lt;/a&gt;
 or &lt;a href="https://youtu.be/7IkHIqPeFjY?list=PLLLT4NxU7U1QYiqanOw48h0VUjlUvqCCv&amp;amp;t=919" target="_blank" rel="noopener noreferrer"&gt;&amp;quot;[&amp;hellip;] Broken&amp;quot;&lt;/a&gt;
. &lt;em&gt;Or you want to start a &lt;a href="https://mostlynerdless.de/blog/tag/writing-a-profiler-from-scratch/" target="_blank" rel="noopener noreferrer"&gt;blog series&lt;/a&gt;
&lt;/em&gt; on writing a profiler from scratch to learn their inner workings (hi there,**regular readers)&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>How Does Kafka Perform When You Need Low Latency?</title><link>https://foojayio.github.io/website/today/how-does-kafka-perform-when-you-need-low-latency/</link><pubDate>Wed, 18 Jan 2023 10:12:24 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-does-kafka-perform-when-you-need-low-latency/</guid><description>&lt;p&gt;Most Apache Kafka benchmarks appear to test high throughput but not low latency.&lt;/p&gt;
&lt;p&gt;Kafka was traditionally used for high throughput rather than latency-sensitive messaging, but it does have a low-latency configuration. (Mostly setting linger.ms=0 and reducing buffer sizes).&lt;/p&gt;
&lt;p&gt;In this configuration, you can get below 1-millisecond latency a good percentage of the time for modest throughputs.&lt;/p&gt;
&lt;p&gt;Benchmarks tend to focus on clustering Kafka, in a high-throughput configuration.&lt;/p&gt;
&lt;p&gt;While this is perhaps the most common use case, how does it perform if you need lower latencies?&lt;/p&gt;</description></item><item><title>Writing a Profiler from Scratch: The Profiling Loop</title><link>https://foojayio.github.io/website/today/writing-a-profiler-from-scratch-the-profiling-loop/</link><pubDate>Thu, 12 Jan 2023 15:26:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/writing-a-profiler-from-scratch-the-profiling-loop/</guid><description>&lt;br /&gt;
&lt;blockquote&gt;
&lt;p&gt;This is the second post in the series, building a profiler from scratch using AsyncGetCallTrace. Today, we&amp;rsquo;re covering wall-clock profiling and how to collect the obtain stack traces. If you&amp;rsquo;re unfamiliar with AsyncGetCallTrace, please check out my previous article in the series &lt;a href="https://foojayio.github.io/website/today/writing-a-profiler-from-scratch-introduction/"&gt;here&lt;/a&gt;
.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Our goal today is to essentially write the primary loop of a profiler and do the following every n milliseconds (where n is our chosen profiling interval):
&lt;img src="https://foojayio.github.io/website/today/writing-a-profiler-from-scratch-the-profiling-loop/diagrams3-2048x1029-1-1024x515.png" alt="" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>Why Your Choice of JVM Matters More Than Ever</title><link>https://foojayio.github.io/website/today/why-your-choice-of-java-virtual-machine-jvm-matters-more-than-ever/</link><pubDate>Wed, 11 Jan 2023 17:36:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-your-choice-of-java-virtual-machine-jvm-matters-more-than-ever/</guid><description>&lt;p&gt;In &lt;a href="https://softwareengineeringdaily.com/2022/10/14/azul-with-john-ceccarelli/" target="_blank" rel="noopener noreferrer"&gt;my recent interview with Software Daily&lt;/a&gt;
, I discussed that there are many companies looking for better customer experience, faster execution, and lower infrastructure costs&amp;hellip; and that they have discovered a better use of Java to help them with just that.&lt;/p&gt;
&lt;p&gt;The interview describes that &lt;strong&gt;when you use hyper-optimized Java runtimes instead of vanilla OpenJDK&lt;/strong&gt; &amp;ndash; you do less tuning and debugging. This means you can build applications, data architectures or anything that needs better performance using an optimized JVM &amp;ndash; with little or no code changes.&lt;/p&gt;</description></item><item><title>How to Reduce Cloud Cost by 99% for EDA Kafka Applications</title><link>https://foojayio.github.io/website/today/how-to-reduce-cloud-cost-by-99-for-eda-kafka-applications/</link><pubDate>Wed, 11 Jan 2023 13:35:41 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-reduce-cloud-cost-by-99-for-eda-kafka-applications/</guid><description>&lt;p&gt;While the Cloud offers great convenience and flexibility, the operational cost for applications deployed in it can sometimes be significant.&lt;/p&gt;
&lt;p&gt;In this article, we show a way to substantially reduce operating costs in latency-sensitive Event-Driven Architecture (EDA) Java applications by migrating from Kafka to Chronicle Queue open-source, which is a more resource-efficient and&lt;a href="https://dzone.com/articles/kafka-vs-chronicle-for-microservices" title=" lower-latency" target="_blank" rel="noopener noreferrer"&gt;lower-latency&lt;/a&gt;
 queue implementation.&lt;/p&gt;
&lt;h3 id="h3-0-what-is-eda"&gt;What is EDA?&lt;/h3&gt;
&lt;p&gt;An EDA (Event-Driven Architecture) application is a distributed application where events (in the form of messages or DTOs) are produced, detected, consumed, and reacted to.&lt;/p&gt;</description></item><item><title>How to Leverage Method Chaining to Add Smart Message Routing</title><link>https://foojayio.github.io/website/today/how-to-leverage-method-chaining-to-add-smart-message-routing/</link><pubDate>Wed, 04 Jan 2023 08:33:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-leverage-method-chaining-to-add-smart-message-routing/</guid><description>&lt;p&gt;This article explores how to use method chaining to add routing information to serialised data structures in a lightweight fashion, where the routing information can be read separately by an intelligent message router.&lt;/p&gt;
&lt;p&gt;We are going to use the open-source serialisation library &lt;a href="https://chronicle.software/wire/" title="Chronicle Wire" target="_blank" rel="noopener noreferrer"&gt;Chronicle Wire&lt;/a&gt;
. Let&amp;rsquo;s assume we have some data that we want to send to a particular destination; we don&amp;rsquo;t want to pollute our business data structures with the routing information. In the future, the routing information could be removed or changed based on external factors such as system failover or horizontal scaling.&lt;/p&gt;</description></item><item><title>Writing a Profiler from Scratch: Introduction</title><link>https://foojayio.github.io/website/today/writing-a-profiler-from-scratch-introduction/</link><pubDate>Wed, 21 Dec 2022 15:26:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/writing-a-profiler-from-scratch-introduction/</guid><description>&lt;p&gt;&lt;a href="https://github.com/jvm-profiling-tools/async-profiler" target="_blank" rel="noopener noreferrer"&gt;Async-profiler&lt;/a&gt;
 is undoubtedly one of the most used open-source Java profilers out there.&lt;/p&gt;
&lt;p&gt;Its most commonly used feature is sampling a given Java program&amp;rsquo;s stack traces and visualizing them as a flame graph. I would recommend reading the excellent &lt;a href="https://krzysztofslusarski.github.io/2022/12/12/async-manual.html" target="_blank" rel="noopener noreferrer"&gt;async-profiler manual&lt;/a&gt;
 by Krzysztof Ślusarski or taking a look at my profiling playlist on YouTube if you&amp;rsquo;re new to this tool.&lt;/p&gt;
&lt;p&gt;After using the async-profiler for a while, you might wonder: How does this tool work? And, of course, if you&amp;rsquo;re someone like me: Could I write a stripped-down versionto learn how it really works?&lt;/p&gt;</description></item><item><title>Azul Provides the CRaC in AWS SnapStart Builds</title><link>https://foojayio.github.io/website/today/azul-provides-the-crac-in-aws-snapstart-builds/</link><pubDate>Tue, 20 Dec 2022 07:45:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/azul-provides-the-crac-in-aws-snapstart-builds/</guid><description>&lt;p&gt;At Azul, we are very excited about the Amazon Web Services launch of &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/snapstart-runtime-hooks.html" target="_blank" rel="noopener noreferrer"&gt;SnapStart for Lambdas&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;SnapStart is based on the CRaC (Coordinated Restore at Checkpoint) API developed in OpenJDK, which was originated and led by Azul.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is the CRaC API?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://openjdk.org/projects/crac/" target="_blank" rel="noopener noreferrer"&gt;CRaC API&lt;/a&gt;
 provides a common way for Java applications to coordinate with underlying checkpoint/restore mechanisms, allowing Java code to work seamlessly and portably across various checkpoint/restore mechanisms as they become available.&lt;/p&gt;</description></item><item><title>Web resource caching: Server-side</title><link>https://foojayio.github.io/website/today/web-caching-server/</link><pubDate>Fri, 09 Dec 2022 15:32:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/web-caching-server/</guid><description>&lt;p&gt;The subject of Web resource caching is as old as the World Wide Web itself.&lt;/p&gt;
&lt;p&gt;However, I&amp;rsquo;d like to offer an as-exhaustive-as-possible catalog of how one can improve performance by caching.&lt;/p&gt;
&lt;p&gt;Web resource caching can happen in two different places: client-side - on the browser and server side.&lt;/p&gt;
&lt;p&gt;In the &lt;a href="https://foojayio.github.io/website/today/web-caching-client/"&gt;previous post&lt;/a&gt;
, I explained the former; this post focuses on the latter.&lt;/p&gt;
&lt;p&gt;While client-side caching works well, it has one central issue: to serve the resource locally, it must first have it in the cache. Thus, each client needs its cached resource. If the requested resource is intensive to compute, it doesn&amp;rsquo;t scale.&lt;/p&gt;</description></item><item><title>Web resource caching: Client-side</title><link>https://foojayio.github.io/website/today/web-caching-client/</link><pubDate>Fri, 09 Dec 2022 15:27:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/web-caching-client/</guid><description>&lt;p&gt;The subject of Web resource caching is as old as the World Wide Web itself.&lt;/p&gt;
&lt;p&gt;However, I&amp;rsquo;d like to offer an as-exhaustive-as-possible catalog of how one can improve performance by caching.&lt;/p&gt;
&lt;p&gt;Web resource caching can happen in two different places: client-side - on the browser and server-side.&lt;/p&gt;
&lt;p&gt;This article is dedicated to the former; the next article will focus on the latter.&lt;/p&gt;
&lt;h2 id="h2-0-caching-101"&gt;Caching 101&lt;/h2&gt;
&lt;p&gt;The idea behind caching is simple: if a resource is a time- or resource-consuming to compute, do it once and store the result.&lt;/p&gt;</description></item><item><title>JFR Event Collection</title><link>https://foojayio.github.io/website/today/jfr-event-collection/</link><pubDate>Thu, 08 Dec 2022 10:08:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/jfr-event-collection/</guid><description>&lt;p&gt;Ever wondered what all the JDK Flight Recorder events are, in which JDK versions they are supported, and what examples of an event looks like?&lt;/p&gt;
&lt;p&gt;Wonder no more, I created the &lt;a href="https://sapmachine.io/jfrevents" target="_blank" rel="noopener noreferrer"&gt;JFR Event Collection&lt;/a&gt;
 website which contains all this and more.
&lt;a href="https://sapmachine.io/jfrevents" target="_blank" rel="noopener noreferrer"&gt;&lt;img src="https://foojayio.github.io/website/today/jfr-event-collection/Screenshot-2022-12-05-at-18.01.21-1024x574.png" alt="Screenshot of https://sapmachine.io/jfrevents" loading="lazy"&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;This site gives you an up-to-date collection of all OpenJDK JFR events for every JDK since 11, giving you the following additional information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;configuration properties&lt;/li&gt;
&lt;li&gt;fields with their types and description&lt;/li&gt;
&lt;li&gt;examples from a renaissance benchmark run&lt;/li&gt;
&lt;li&gt;with which GC this event appears&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/parttimenerd/jfreventcollector/blob/main/additional.xml" target="_blank" rel="noopener noreferrer"&gt;additional descriptions&lt;/a&gt;
 collected by JFR users&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The idea for this website came during the development of my prototypical JFR UI:
&lt;img src="https://foojayio.github.io/website/today/jfr-event-collection/Screenshot-of-JFR-events-viewer-1024x447.png" alt="Screenshot of JFR events viewer" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>Learn How to Develop Event-Driven Architectures</title><link>https://foojayio.github.io/website/today/learn-how-to-develop-event-driven-architectures/</link><pubDate>Wed, 07 Dec 2022 15:25:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/learn-how-to-develop-event-driven-architectures/</guid><description>&lt;p&gt;Previously, I wrote &lt;a href="https://foojayio.github.io/website/today/high-performance-java-serialisation/" title="an article on Open source Chronicle Wire"&gt;an article on Open source Chronicle Wire&lt;/a&gt;
, that discusses how we could serialise an application&amp;rsquo;s state into different message formats.&lt;/p&gt;
&lt;p&gt;Now in this article, I&amp;rsquo;m going to look at how we can use Open source &lt;a href="https://chronicle.software/queue/" title="Chronicle Queue " target="_blank" rel="noopener noreferrer"&gt;Chronicle Queue&lt;/a&gt;
and &lt;a href="https://chronicle.software/wire/" title="Chronicle Wire" target="_blank" rel="noopener noreferrer"&gt;Chronicle Wire&lt;/a&gt;
 to structure applications to use Event-Driven Architecture (EDA).&lt;/p&gt;
&lt;p&gt;EDA is a design pattern in which decoupled components (often microservices) can asynchronously publish and subscribe to events.&lt;/p&gt;</description></item><item><title>Kafka vs. Chronicle for Microservices: Which is 750 Times Faster?</title><link>https://foojayio.github.io/website/today/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/</link><pubDate>Wed, 30 Nov 2022 08:15:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/kafka-vs-chronicle-for-microservices-which-is-750-times-faster/</guid><description>&lt;p&gt;Apache Kafka is a common choice for inter-service communication.&lt;/p&gt;
&lt;p&gt;Kafka facilitates the parallel processing of messages and is a good choice for log aggregation. Kafka &lt;a href="https://www.confluent.io/blog/kafka-fastest-messaging-system/" title="claims to be low latency, high throughput" target="_blank" rel="noopener noreferrer"&gt;claims to be low latency, high throughput&lt;/a&gt;
. However, is Kafka fast enough for many microservices applications in the cloud?&lt;/p&gt;
&lt;p&gt;When I wrote &lt;a href="https://chronicle.software/queue/" title="Open Source Chronicle Queue" target="_blank" rel="noopener noreferrer"&gt;Open Source Chronicle Queue&lt;/a&gt;
, my aim was to develop a messaging framework with microsecond latencies, and banks around the world have adopted it for use in their latency-sensitive trading systems and real-time streaming applications.&lt;/p&gt;</description></item><item><title>AP-Loader: A New Way to Use and Embed async-profiler</title><link>https://foojayio.github.io/website/today/ap-loader-a-new-way-to-use-and-embed-async-profiler/</link><pubDate>Tue, 22 Nov 2022 14:54:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/ap-loader-a-new-way-to-use-and-embed-async-profiler/</guid><description>&lt;p&gt;Using &lt;a href="https://github.com/jvm-profiling-tools/async-profiler" target="_blank" rel="noopener noreferrer"&gt;async-profiler&lt;/a&gt;
 can be quite a hassle.&lt;/p&gt;
&lt;p&gt;First, you have to download the right archive from &lt;a href="https://github.com/jvm-profiling-tools/async-profiler/releases/tag/v2.8.3" title="GitHub" target="_blank" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
 for your OS and architecture, then you have to unpack it and place it somewhere.&lt;/p&gt;
&lt;p&gt;Or you get it from your OS distribution, hoping that it is the current version.&lt;/p&gt;
&lt;p&gt;It gets worse if you want to embed it into your library, agent, or application. Library developers cannot just use a Maven dependency but have to create wrapper code and build scripts that deal with packaging the binaries themselves. Or, worse, they depend on a preinstalled version which they do not control.&lt;/p&gt;</description></item><item><title>How Object Reuse Can Reduce Latency and Improve Performance</title><link>https://foojayio.github.io/website/today/how-object-reuse-can-reduce-latency-and-improve-performance/</link><pubDate>Wed, 16 Nov 2022 15:33:41 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-object-reuse-can-reduce-latency-and-improve-performance/</guid><description>&lt;p&gt;&lt;strong&gt;Become familiar with the art of object reuse by reading this article and learn the pros and cons of different reuse strategies in a multi-threaded Java application. This allows you to write more performant code with less latency.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;While the use of objects in object-oriented languages such as Java provides an excellent way of abstracting away complexity, frequent object creation can come with downsides in terms of increased memory pressure and garbage collection which will have an adverse effect on applications&amp;rsquo; latency and performance.&lt;/p&gt;</description></item><item><title>Java Profiling Overview</title><link>https://foojayio.github.io/website/today/java-profiling-overview/</link><pubDate>Mon, 14 Nov 2022 09:14:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-profiling-overview/</guid><description>&lt;p&gt;When I ask Java developers whether they do profile, the answer is usually &amp;ldquo;no&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;The few that profiled before usually used VisualVM as a student and maybe JProfiler or YourKit years ago at work.&lt;/p&gt;
&lt;p&gt;One of the reasons for this is a lack of available information and thus knowledge for everyday Java developers.&lt;/p&gt;
&lt;p&gt;This is a pity as profiling should be a part of the tool belt for every experienced developer (not just for Java). The problem is that most of the open-source profilers are targeted to the OpenJDK developers (or their colleagues), even if they won&amp;rsquo;t admit it. This can be seen in the lack of entry-level material on this topic and even the little that is out there is distributed across multiple conference websites, blogs, YouTube channels, and Twitter accounts.&lt;/p&gt;</description></item><item><title>Creating Terabyte Sized Queues with Low-Latency</title><link>https://foojayio.github.io/website/today/creating-terabyte-sized-queues-with-low-latency/</link><pubDate>Wed, 02 Nov 2022 10:45:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/creating-terabyte-sized-queues-with-low-latency/</guid><description>&lt;p&gt;Queues are often fundamental components in software design patterns.&lt;/p&gt;
&lt;p&gt;But, what if there are millions of messages received every second and multi-process consumers need to be able to read the complete ledger of all messages?&lt;/p&gt;
&lt;p&gt;Java can only hold so much information before the heap becomes a limiting factor with high-impacting garbage collections as a result, potentially preventing us from fulfilling targeted SLAs or even halting the JVM for seconds or even minutes.&lt;/p&gt;</description></item><item><title>Why the Fastest Way of Serializing a Java Field is not Serializing it at All</title><link>https://foojayio.github.io/website/today/why-the-fastest-way-of-serializing-a-java-field-is-not-serializing-it-at-all/</link><pubDate>Tue, 25 Oct 2022 12:54:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-the-fastest-way-of-serializing-a-java-field-is-not-serializing-it-at-all/</guid><description>&lt;p&gt;This article elaborates on different ways of serializing Java objects and benchmarks performance for the variants. Read this article and become aware of different ways to improve Java serialization performance.&lt;/p&gt;
&lt;p&gt;In a previous article about &lt;a href="https://chronicle.software/queue/" title="open-source Chronicle Queue" target="_blank" rel="noopener noreferrer"&gt;open-source Chronicle Queue&lt;/a&gt;
, there was some benchmarking and method profiling indicating that the speed of serialization had a significant impact on execution performance. After all, this is only to be expected as Chronicle Queue (and other persisted queue libraries) must convert Java objects located on the heap to binary data, which is subsequently stored in files. Even for the most internally efficient libraries, this inevitable serialization procedure will largely dictate performance.&lt;/p&gt;</description></item><item><title>High-Performance Java Serialisation to Different Formats</title><link>https://foojayio.github.io/website/today/high-performance-java-serialisation/</link><pubDate>Wed, 12 Oct 2022 14:15:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/high-performance-java-serialisation/</guid><description>&lt;p&gt;Java serialisation is a popular mechanism where you are able to serialise and deserialise complex object graphs; for example where object A can contain a reference to object B, which in turn has a reference back to object A.&lt;/p&gt;
&lt;p&gt;The problem is that this rich functionality comes at a performance cost.&lt;/p&gt;
&lt;p&gt;However, if you do not need to serialise these types of recursive graphs, you can instead use an open source solution called Chronicle Wire.&lt;/p&gt;</description></item><item><title>Comparative Evaluation Azul Zulu Prime vs. OpenJDK</title><link>https://foojayio.github.io/website/today/best-practice-comparative-evaluation-of-jdk-setups-azul-zulu-prime-vs-openjdk/</link><pubDate>Fri, 07 Oct 2022 08:51:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/best-practice-comparative-evaluation-of-jdk-setups-azul-zulu-prime-vs-openjdk/</guid><description>&lt;p&gt;In today&amp;rsquo;s Java ecosystem, you have a wide range of possible runtimes. Choosing between them can have a huge impact on the capabilities or performance of your environments and applications.&lt;/p&gt;
&lt;p&gt;In this article, you will learn about best practices for &lt;strong&gt;comparative evaluations between JDK setups&lt;/strong&gt; , whether they be different configurations in a single JDK or comparing &lt;a href="https://www.azul.com/products/prime/" target="_blank" rel="noopener noreferrer"&gt;Azul Zulu Prime Builds of OpenJDK (Azul Zulu Prime)&lt;/a&gt;
 to OpenJDK itself.&lt;/p&gt;
&lt;p&gt;By following this guide, you will be able to establish credible evidence that Azul Zulu Prime improves aspects of application behavior to a degree that justifies using it within your organization.&lt;/p&gt;</description></item><item><title>Let's Create Mappers Without Creating Underlying Objects in Java</title><link>https://foojayio.github.io/website/today/did-you-know-you-can-create-mappers-without-creating-underlying-objects-in-java/</link><pubDate>Tue, 20 Sep 2022 09:16:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/did-you-know-you-can-create-mappers-without-creating-underlying-objects-in-java/</guid><description>&lt;p&gt;As most Java developers know, putting values in a Java Map (like a HashMap) involves creating a large number of auxiliary objects under the covers.&lt;/p&gt;
&lt;p&gt;For example, a HashMap with int keys and long values might, for each entry, create a wrapped Integer, a wrapped Long object and a Node that holds the former values together with a hash value and a link to other potential Node objects sharing the same hash bucket.&lt;/p&gt;</description></item><item><title>The Story of a Java 17 Native Memory Leak</title><link>https://foojayio.github.io/website/today/the-story-of-a-java-17-native-memory-leak/</link><pubDate>Tue, 13 Sep 2022 08:15:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-story-of-a-java-17-native-memory-leak/</guid><description>&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;When Java 17 was released, we (the platform team at &lt;a href="https://careers.autotrader.co.uk/" target="_blank" rel="noopener noreferrer"&gt;Auto Trader&lt;/a&gt;
 where I was working at the time) were fairly quick to provide a new Docker base image to allow our developers to gain the benefits of the new goodness in the JDK available since Java 11, the previous LTS version.&lt;/p&gt;
&lt;p&gt;Over the course of a few years, we&amp;rsquo;ve standardised the way the JVM is configured out of the box for any new applications that make use of the base image. In general, this provides product teams with a good default starting point from which to get up &amp;amp; running quickly with any new service they plan to deploy.&lt;/p&gt;</description></item><item><title>What the Heck Is Project Loom for Java?</title><link>https://foojayio.github.io/website/today/what-the-heck-is-project-loom-for-java/</link><pubDate>Tue, 30 Aug 2022 15:13:55 +0000</pubDate><guid>https://foojayio.github.io/website/today/what-the-heck-is-project-loom-for-java/</guid><description>&lt;p&gt;Java has had good multi-threading and concurrency capabilities from early on in its evolution and can effectively utilize multi-threaded and multi-core CPUs.&lt;/p&gt;
&lt;p&gt;Java Development Kit (JDK) 1.1 had basic support for platform threads (or Operating System (OS) threads), and JDK 1.5 had more utilities and updates to improve concurrency and multi-threading.&lt;/p&gt;
&lt;p&gt;JDK 8 brought asynchronous programming support and more concurrency improvements.&lt;/p&gt;
&lt;p&gt;While things have continued to improve over multiple versions, there has been nothing groundbreaking in Java for the last three decades, apart from support for concurrency and multi-threading using OS threads.&lt;/p&gt;</description></item><item><title>Cassandra: Throughput, Responsiveness, Capacity and Cost</title><link>https://foojayio.github.io/website/today/cassandra-performance-throughput-responsiveness-capacity-and-cost/</link><pubDate>Wed, 24 Aug 2022 10:43:51 +0000</pubDate><guid>https://foojayio.github.io/website/today/cassandra-performance-throughput-responsiveness-capacity-and-cost/</guid><description>&lt;p&gt;&lt;strong&gt;For scalable data workloads like Apache Cassandra, performance and capacity are simply a matter of cost. JVM choice and configuration can dramatically impact that cost. The Azul Platform Prime JVM significantly improves Cassandra performance and reduces the cost of Cassandra clusters.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="h2-0-background"&gt;Background&lt;/h2&gt;
&lt;p&gt;We set off to characterize the impact of JVM choice and configuration on Cassandra load carrying capacity: the capacity of a Cassandra cluster of a certain size to handle traffic while meeting specified service levels.&lt;/p&gt;</description></item><item><title>Faster Integration Tests with Reusable Testcontainers</title><link>https://foojayio.github.io/website/today/faster-integration-tests-with-reusable-testcontainers/</link><pubDate>Wed, 17 Aug 2022 11:05:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/faster-integration-tests-with-reusable-testcontainers/</guid><description>&lt;p&gt;In my job, I often need integration tests against a &lt;a href="https://neo4j.com" target="_blank" rel="noopener noreferrer"&gt;Neo4j&lt;/a&gt;
 database. My software is written in Java, and so is Neo4j. Neo4j is embeddable, too. So, in theory, I could just depend on the embedded version, open a connection, test my stuff and call it a day. It would not be a different engine, it would be - at least from a query-engine and planer perspective - the same thing, in contrast to using an embedded SQL database as a drop-in for PostgresQL for example.&lt;/p&gt;</description></item><item><title>A Flavour of TornadoVM on Apple M1 Pro</title><link>https://foojayio.github.io/website/today/a-flavour-of-tornadovm-on-apple-m1-pro/</link><pubDate>Tue, 02 Aug 2022 08:21:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/a-flavour-of-tornadovm-on-apple-m1-pro/</guid><description>&lt;p&gt;This article aims to describe the main steps required to install and run &lt;a href="https://foojayio.github.io/website/today/hardware-acceleration-for-java-tornadovm-can-do-it/"&gt;TornadoVM&lt;/a&gt;
 on Apple M1 Pro.&lt;/p&gt;
&lt;h4 id="steps"&gt;Steps&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Install Prerequisites&lt;/li&gt;
&lt;li&gt;Run TornadoVM Installer&lt;/li&gt;
&lt;li&gt;Execute Unit Tests&lt;/li&gt;
&lt;li&gt;Performance Evaluation: Running Matrix-Multiplication on Apple M1 GPU&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="h3-0-1-install-prerequisites"&gt;1. Install Prerequisites&lt;/h3&gt;
&lt;p&gt;To install TornadoVM, it is necessary to have some packages installed. For instance, you will have to install &lt;a href="https://maven.apache.org/" target="_blank" rel="noopener noreferrer"&gt;Maven&lt;/a&gt;
 and &lt;a href="https://mac.install.guide/homebrew/index.html" target="_blank" rel="noopener noreferrer"&gt;wget&lt;/a&gt;
 in order to enable the TornadoVM installer to be functional.&lt;/p&gt;
&lt;p&gt;Assuming that Homebrew is installed in your system, you can open a terminal and execute the following commands:&lt;/p&gt;</description></item><item><title>The Cost of Production Blindness</title><link>https://foojayio.github.io/website/today/the-cost-of-production-blindness/</link><pubDate>Fri, 22 Jul 2022 08:11:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-cost-of-production-blindness/</guid><description>&lt;p&gt;When I speak at conferences, I often fall back to the fact that just a couple of decades ago we&amp;rsquo;d observe production by kicking the server.&lt;/p&gt;
&lt;p&gt;This is obviously no longer practical. We can&amp;rsquo;t see our production. It&amp;rsquo;s an amorphous Cloud that we can&amp;rsquo;t touch or feel. A power that we read about but don&amp;rsquo;t fully grasp.&lt;/p&gt;
&lt;p&gt;In this case, we have physical evidence that the Cloud is there.&lt;/p&gt;
&lt;p&gt;A part of this major shift in our industry is a change to our fundamental roles as engineers. DevOps and SRE are roles that didn&amp;rsquo;t exist back then. Yet today, they&amp;rsquo;re often essential for major businesses. They brought with them tremendous advancements to the reliability of production, but they also brought with them a cost: distance.&lt;/p&gt;</description></item><item><title>General Build Distribution: A Game-Changer or a Gimmick?</title><link>https://foojayio.github.io/website/today/general-build-distribution-a-game-changer-or-a-gimmick/</link><pubDate>Wed, 20 Jul 2022 21:09:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/general-build-distribution-a-game-changer-or-a-gimmick/</guid><description>&lt;p&gt;&lt;strong&gt;Understand the performance potential of remote and distributed builds and explore how to improve build feedback times.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://foojayio.github.io/website/today/remote-and-distributed-build-patterns/"&gt;Remote and Distributed Build Patterns&lt;/a&gt;
 article explains the differences between remote and distributed builds and variations on each. Specifically, we distinguished between &amp;ldquo;test distribution&amp;rdquo; and &amp;ldquo;general build distribution&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;This article discusses distributed builds in a broader perspective of improving build feedback times. We&amp;rsquo;ll start by explaining the types of changes engineers tend to make, identify the typical bottlenecks and share how these relate to distributed builds. We will also study the performance potential of general build distribution. Finally, we will explore a holistic approach to improving build feedback times.&lt;/p&gt;</description></item><item><title>Released: OpenJDK 18.0.2, 17.0.4, 15.0.8, 13.0.12, 11.0.16, 8u342</title><link>https://foojayio.github.io/website/today/openjdk-release-july2022/</link><pubDate>Wed, 20 Jul 2022 12:32:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/openjdk-release-july2022/</guid><description>&lt;p&gt;&lt;strong&gt;Java has regular patch and security updates that are co-ordinated across the community, they happen once per quarter. When these updates happen, there are fixes that include security issues, all of which are displayed on Foojay.io.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The next quarterly release of the OpenJDK has been made available, as scheduled, for July 2022, impacting a number of OpenJDK releases.&lt;/p&gt;
&lt;p&gt;All the fixes provided for each updated OpenJDK release are found here:&lt;/p&gt;</description></item><item><title>Remote and Distributed Build Patterns</title><link>https://foojayio.github.io/website/today/remote-and-distributed-build-patterns/</link><pubDate>Tue, 19 Jul 2022 10:48:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/remote-and-distributed-build-patterns/</guid><description>&lt;p&gt;&lt;strong&gt;Remote and distributed builds are terms frequently used, misused and abused. Here we share insight for what these terms mean and how they affect your build feedback times.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A frequently-requested feature for the &lt;a href="https://gradle.org/" target="_blank" rel="noopener noreferrer"&gt;Gradle Build Tool&lt;/a&gt;
 is the ability to perform remote or distributed builds.&lt;/p&gt;
&lt;p&gt;But what exactly does this mean? And what are the motivations behind the requests?&lt;/p&gt;
&lt;p&gt;This article will explore the difference between remote vs. distributed builds and their variations. As there is no industry-wide agreement on consistent terminology for these concepts, the goal of this article is to give an overview of these patterns and how they relate to each other.&lt;/p&gt;</description></item><item><title>Spring Boot Performance Workshop with Vlad Mihalcea</title><link>https://foojayio.github.io/website/today/spring-boot-performance-workshop-with-vlad-mihalcea/</link><pubDate>Fri, 24 Jun 2022 07:43:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-performance-workshop-with-vlad-mihalcea/</guid><description>&lt;p&gt;A couple of weeks ago, we had a great time hosting the workshop you can see below with Vlad Mihalcea. It was loads of fun and we hope to do this again soon!&lt;/p&gt;
&lt;p&gt;In this workshop, we focused on Spring Boot performance but most importantly on Hibernate performance, which is a common issue in production environments.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s especially hard to track since issues related to data are often hard to perceive when debugging locally. When we have &amp;ldquo;real world&amp;rdquo; data at scale, they suddenly balloon and become major issues.&lt;/p&gt;</description></item><item><title>Building Project Panama's jextract tool by yourself</title><link>https://foojayio.github.io/website/today/building-project-panamas-jextract-tool-by-yourself/</link><pubDate>Thu, 09 Jun 2022 14:22:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-project-panamas-jextract-tool-by-yourself/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Absorb what is useful, discard what is useless and add what is specifically your own. &amp;ndash; Bruce Lee&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Do you want to build Project Panama&amp;rsquo;s &lt;a href="https://github.com/openjdk/jextract" target="_blank" rel="noopener noreferrer"&gt;Jextract&lt;/a&gt;
 tool by yourself? I can show you how!&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve seen any of my past &lt;a href="https://foojayio.github.io/website/today/project-panama-for-newbies-part-3/"&gt;articles&lt;/a&gt;
 on Project Panama I&amp;rsquo;ve mentioned a really convenient tool called &lt;code&gt;jextract&lt;/code&gt; that can generate Java binding code that represents native functions or variables (symbols) from C libraries.&lt;/p&gt;
&lt;p&gt;This alleviates the developer&amp;rsquo;s need of creating binding code by hand. By passing in a C header file (.h extension) &lt;code&gt;jextract&lt;/code&gt; can generate source code or compiled Java classes.&lt;/p&gt;</description></item><item><title>How DataStax Tracked Down a Linux Kernel Bug with Fallout</title><link>https://foojayio.github.io/website/today/how-datastax-tracked-down-a-linux-kernel-bug-with-fallout/</link><pubDate>Thu, 02 Jun 2022 15:32:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-datastax-tracked-down-a-linux-kernel-bug-with-fallout/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/how-datastax-tracked-down-a-linux-kernel-bug-with-fallout/1_N_gqb3PrkKgMbJHSmYeOaw-1024x750.jpeg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Sometimes as a developer, you run into a bug buried deep within the layers of your software stack. Chasing down the root cause requires not only curiosity, patience, and a healthy dose of tenacity but a willingness to try different tools and approaches. This post describes our challenges and ultimate success in tracking down a Linux kernel bug using Fallout.&lt;/em&gt;{#ee66}&lt;/p&gt;
&lt;p&gt;Bugs come in all shapes and sizes and it&amp;rsquo;s not always clear at the beginning of a debugging session which one you&amp;rsquo;re currently chasing. Some bugs can be fixed up in a matter of minutes while others take weeks to nail down. And the really tricky ones require you to dig through multiple layers of your software stack, stressing the limits of your patience.{#8aae}&lt;/p&gt;</description></item><item><title>Optimizing Distributed Joins: The Case of Google Cloud Spanner and DataStax Astra DB</title><link>https://foojayio.github.io/website/today/optimizing-distributed-joins-the-case-of-google-cloud-spanner-and-datastax-astra-db/</link><pubDate>Tue, 31 May 2022 16:25:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/optimizing-distributed-joins-the-case-of-google-cloud-spanner-and-datastax-astra-db/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/optimizing-distributed-joins-the-case-of-google-cloud-spanner-and-datastax-astra-db/0_6VGah2hwaLIBjW7R-1024x576.jpeg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;In this post, learn how relational and NoSQL databases, Google Cloud Spanner and DataStax Astra DB, optimize distributed joins for real-time applications.&lt;/em&gt;{#c63a}&lt;/p&gt;
&lt;p&gt;Distributed joins are commonly considered to be too expensive to use for real-time transaction processing. That is because, besides joining data, they also frequently require moving or shuffling data between nodes in a cluster, which can significantly affect query response times and database throughput. However, there are certain optimizations that can completely eliminate the need to move data to enable faster joins. In this article, we first review the four types of distributed joins, including shuffle join, broadcast join, co-located join, and pre-computed join. We then demonstrate how leading fully managed Relational and NoSQL databases, namely &lt;a href="https://cloud.google.com/spanner" target="_blank" rel="noopener noreferrer"&gt;Google Cloud Spanner&lt;/a&gt;
 and &lt;a href="https://auth.cloud.datastax.com/auth/realms/CloudUsers/protocol/openid-connect/registrations?client_id=auth-proxy&amp;amp;response_type=code&amp;amp;scope=openid&amp;#43;profile&amp;#43;email&amp;amp;redirect_uri=https://astra.datastax.com/welcome" target="_blank" rel="noopener noreferrer"&gt;DataStax Astra DB&lt;/a&gt;
, support optimized joins that are suitable for real-time applications.{#bea1}&lt;/p&gt;</description></item><item><title>Superfast Application Startup: Java on CRaC</title><link>https://foojayio.github.io/website/today/superfast-application-startup-java-on-crac/</link><pubDate>Mon, 30 May 2022 05:37:24 +0000</pubDate><guid>https://foojayio.github.io/website/today/superfast-application-startup-java-on-crac/</guid><description>&lt;p&gt;It&amp;rsquo;s now twenty-seven years since Java was first released, and it continues to be one of the most popular platforms for applications, especially on servers.&lt;/p&gt;
&lt;p&gt;One of the reasons for this is the &lt;a href="https://en.wikipedia.org/wiki/Java_virtual_machine" target="_blank" rel="noopener noreferrer"&gt;Java Virtual Machine (JVM)&lt;/a&gt;
. This provides a managed runtime environment that removes the need for developers to deal with things like memory management; the garbage collector takes care of this for you. Another significant advantage of the JVM is the use of bytecodes that can be converted to native instructions at runtime using a Just-In-Tim (JIT) compiler.&lt;/p&gt;</description></item><item><title>Let's Compile Java Code in the Cloud!</title><link>https://foojayio.github.io/website/today/lets-compile-java-code-in-the-cloud/</link><pubDate>Wed, 18 May 2022 12:03:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/lets-compile-java-code-in-the-cloud/</guid><description>&lt;p&gt;Across the industry, companies are trying to rein in runaway cloud costs by squeezing more carrying capacity out of the instances they run in the cloud.&lt;/p&gt;
&lt;p&gt;Especially in the Java space, developers are trying to fit workloads into smaller and smaller instances and utilize server resources with maximum efficiency.&lt;/p&gt;
&lt;p&gt;Relying on elastic horizontal scaling to deal with spikes in traffic means that Java workloads must start fast and stay fast.&lt;/p&gt;</description></item><item><title>Diving into JVM Framework Monitoring and Profiling</title><link>https://foojayio.github.io/website/today/diving-into-jvm-framework-monitoring-and-profiling/</link><pubDate>Fri, 13 May 2022 06:36:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/diving-into-jvm-framework-monitoring-and-profiling/</guid><description>&lt;p&gt;Managing available resources on demand in a cloud environment can be a very challenging topic. It is worth the effort, since it may however utilise resources far more efficiently.&lt;/p&gt;
&lt;p&gt;Companies or projects are therefore very keen to migrate to the Cloud providers, such as Azul, AWS, Google Cloud or others. For software engineers one truth still stands, also in the Cloud: It&amp;rsquo;s recommended to understand the behaviour and limitations of our deployed JVM application (or pods, the smallest deployable instance in Kubernetes).&lt;/p&gt;</description></item><item><title>Getting More Mileage Out of Kafka: OpenJDK vs. Azul Prime</title><link>https://foojayio.github.io/website/today/getting-more-mileage-out-of-kafka-openjdk-vs-azul-prime/</link><pubDate>Wed, 11 May 2022 06:47:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/getting-more-mileage-out-of-kafka-openjdk-vs-azul-prime/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/getting-more-mileage-out-of-kafka-openjdk-vs-azul-prime/image-1024x560.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Building real-time data pipelines and streaming applications just got more cost-effective.&lt;/p&gt;
&lt;p&gt;Kafka is great because it&amp;rsquo;s horizontally scalable, fault-tolerant, and runs in production for thousands of companies &amp;ndash; and we figured out how to help you get more mileage out of it.&lt;/p&gt;
&lt;h2 id="h-how-we-did-it"&gt;How We Did It&lt;/h2&gt;
&lt;p&gt;In &lt;a href="https://www.azul.com/blog/kafka-throughput-on-azul-platform-prime-vs-openjdk/" target="_blank" rel="noopener noreferrer"&gt;a recent post&lt;/a&gt;
 we compared Kafka throughput on Azul Platform Prime versus OpenJDK, noting that on our config Azul Platform Prime reaches 45% higher max throughput than OpenJDK.&lt;/p&gt;</description></item><item><title>Thinking About Massive Throughput? Meet Virtual Threads!</title><link>https://foojayio.github.io/website/today/thinking-about-massive-throughput-meet-virtual-threads/</link><pubDate>Thu, 28 Apr 2022 07:41:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/thinking-about-massive-throughput-meet-virtual-threads/</guid><description>&lt;p&gt;The goal of this article is to examine known facts about an upcoming Java threading model extension.&lt;/p&gt;
&lt;p&gt;No, no-worries, the current Java threading model remains but behind the curtains something good is already knocking on the virtual door.&lt;/p&gt;
&lt;p&gt;Yes, we are talking about JEP-425: Virtual Threads.&lt;/p&gt;
&lt;h2 id="h2-0-knocking-on-current-concurrency-limits"&gt;Knocking on current concurrency limits&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s first look at the current Java threading model. It provides an implementation of the Thread class. A Thread can be considered a Java concurrency unit which can execute so-called &lt;em&gt;Runnable&lt;/em&gt; tasks. The instance of a Thread class is also an object but there is a bit more happening behind the scenes.&lt;/p&gt;</description></item><item><title>Java Panama Polyglot (Python/Tensorflow) Part 3</title><link>https://foojayio.github.io/website/today/java-panama-polyglot-part-3/</link><pubDate>Tue, 26 Apr 2022 04:42:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-panama-polyglot-part-3/</guid><description>&lt;p&gt;Hello and welcome back to the &lt;strong&gt;&lt;a href="https://foojayio.github.io/website/today/java-panama-polyglot-part1/"&gt;Java Panama Polyglot&lt;/a&gt;
&lt;/strong&gt; series where we are presenting quick tutorials or recipes on how to access native libraries written in other languages.&lt;/p&gt;
&lt;p&gt;If you are new to Java&amp;rsquo;s Foreign Function Access APIs (&lt;a href="https://jdk.java.net/panama/" target="_blank" rel="noopener noreferrer"&gt;Project&lt;/a&gt;
&lt;a href="https://jdk.java.net/panama/" target="_blank" rel="noopener noreferrer"&gt;Panama&lt;/a&gt;
) check out: &lt;a href="https://foojayio.github.io/website/today/project-panama-for-newbies-part-1/"&gt;Panama4Newbies&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/java-panama-polyglot-swift-part-2/"&gt;Part 2&lt;/a&gt;
 you got a chance to learn about how to use Java Project Panama&amp;rsquo;s (foreign function interface APIs) abilities to access native libraries written in Apple&amp;rsquo;s &lt;a href="https://www.swift.org" target="_blank" rel="noopener noreferrer"&gt;Swift language&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Does Java 18 Finally Have A Better Alternative To JNI?</title><link>https://foojayio.github.io/website/today/does-java-18-finally-have-a-better-alternative-to-jni/</link><pubDate>Tue, 19 Apr 2022 21:01:50 +0000</pubDate><guid>https://foojayio.github.io/website/today/does-java-18-finally-have-a-better-alternative-to-jni/</guid><description>&lt;p&gt;Java 18 was released last month (March 2022), and with it comes the second incubator of the Foreign Function &amp;amp; Memory API, so let us look at the state of Foreign Function Interface (FFI) in Java.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c1kwxzrhvt40nuulijge.png" alt="cover image" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;If you would prefer to follow along by watching a video, here&amp;rsquo;s the recording of my FOSDEM'22 talk on this topic, from the &lt;a href="https://youtu.be/lW69_AtAXzE" target="_blank" rel="noopener noreferrer"&gt;the OktaDev YouTube channel&lt;/a&gt;
.&lt;/p&gt;
&lt;h2 id="h2-0-what-is-a-foreign-function-interface"&gt;What is a Foreign Function Interface?&lt;/h2&gt;
&lt;p&gt;A foreign function interface is the ability to call functions or routines written in one programming language from another programming language.&lt;/p&gt;</description></item><item><title>Introducing the "Coordinated Restore at Checkpoint" Project</title><link>https://foojayio.github.io/website/today/introducing-the-openjdk-coordinated-restore-at-checkpoint-project/</link><pubDate>Mon, 18 Apr 2022 08:13:55 +0000</pubDate><guid>https://foojayio.github.io/website/today/introducing-the-openjdk-coordinated-restore-at-checkpoint-project/</guid><description>&lt;h3 id="h3-0-introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;One of the great things about the Java Virtual Machine (JVM) is the fact that it is able to adapt the performance of a Java application to the way it is used.&lt;/p&gt;
&lt;p&gt;It can figure out what parts of your code are used often and it can then optimize the code by means of its ability to compile code just in time (JIT).&lt;/p&gt;
&lt;p&gt;But that also means that it has to figure out those parts first, before it can compile those parts into faster code.&lt;/p&gt;</description></item><item><title>Java Panama Polyglot (Swift) Part 2</title><link>https://foojayio.github.io/website/today/java-panama-polyglot-swift-part-2/</link><pubDate>Wed, 13 Apr 2022 15:34:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-panama-polyglot-swift-part-2/</guid><description>&lt;p&gt;Hello and welcome back to the &lt;strong&gt;Java Panama Polyglot&lt;/strong&gt; series where we will be presenting quick tutorials or recipes on how to access native libraries written in other languages.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/java-panama-polyglot-part1/"&gt;Part 1&lt;/a&gt;
 you got a chance to learn about how to use Java &lt;a href="https://jdk.java.net/panama/" target="_blank" rel="noopener noreferrer"&gt;Project Panama&lt;/a&gt;
&amp;rsquo;s (foreign function interface) abilities to access native libraries written in C++. Today, we will be looking at Java code being able to talk to Apple&amp;rsquo;s &lt;a href="https://developer.apple.com/swift/" target="_blank" rel="noopener noreferrer"&gt;Swift&lt;/a&gt;
 language.&lt;/p&gt;</description></item><item><title>Java Panama Polyglot (C++) Part 1</title><link>https://foojayio.github.io/website/today/java-panama-polyglot-part1/</link><pubDate>Wed, 06 Apr 2022 15:41:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-panama-polyglot-part1/</guid><description>&lt;figure class="wp-block-image size-full is-resized"&gt;
 &lt;img fetchpriority="high" decoding="async" src="polyglot.png" alt="" class="wp-image-55283" width="469" height="112"&gt;
&lt;/figure&gt;
&lt;p&gt;Hello and welcome to the &lt;strong&gt;Java Panama Polyglot&lt;/strong&gt; series where we will be presenting quick tutorials or recipes on how to access native libraries written in other languages.&lt;/p&gt;
&lt;p&gt;For example, you will learn about Java Project Panama&amp;rsquo;s (foreign function interface) abilities to access native libraries written in C++, Swift, Python, and others.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is Polyglot?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Have you heard of polyglot as it relates to developing &lt;a href="https://en.wikipedia.org/wiki/Solution_stack" target="_blank" rel="noopener noreferrer"&gt;full stack&lt;/a&gt;
 applications? If your answer is &lt;strong&gt;yes&lt;/strong&gt;, then you probably know about the programming languages needed to build an enterprise web application.&lt;/p&gt;</description></item><item><title>Hardware Acceleration For Java? TornadoVM Can Do It!</title><link>https://foojayio.github.io/website/today/hardware-acceleration-for-java-tornadovm-can-do-it/</link><pubDate>Fri, 01 Apr 2022 07:37:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/hardware-acceleration-for-java-tornadovm-can-do-it/</guid><description>&lt;p&gt;Java programs can primarily run on x86 and Arm platforms and recent efforts focus on ports to PowerPC and RISC-V.&lt;/p&gt;
&lt;p&gt;Despite the diverse range of ISAs, contemporary computers are equipped with heterogeneous devices, such as Graphics Processing Units (GPUs), Field Programmable Gate Arrays (FPGAs), and Tensor Processing Units (TPUs), which operate as co-processors that offload data processing from the main processor.&lt;/p&gt;
&lt;p&gt;A question that rises is whether such compute power can be utilized by Java programs. The answer is that several frameworks have been created to address this challenge. For instance, &lt;a href="https://www.ibm.com/docs/en/sdk-java-technology/7?topic=i-j9-virtual-machine-jvm-1" target="_blank" rel="noopener noreferrer"&gt;IBM J9&lt;/a&gt;
, &lt;a href="https://aparapi.github.io/" target="_blank" rel="noopener noreferrer"&gt;Aparapi&lt;/a&gt;
, and &lt;a href="https://www.tornadovm.org/" target="_blank" rel="noopener noreferrer"&gt;TornadoVM&lt;/a&gt;
, are frameworks that aid Java programmers to accelerate their programs on heterogeneous hardware devices.&lt;/p&gt;</description></item><item><title>Increasing Event Streaming with Kafka and Azul</title><link>https://foojayio.github.io/website/today/increasing-event-streaming-with-kafka-and-azul/</link><pubDate>Tue, 29 Mar 2022 13:41:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/increasing-event-streaming-with-kafka-and-azul/</guid><description>&lt;p&gt;Welcome to getting started with &lt;a href="https://www.azul.com/products/prime/" target="_blank" rel="noopener noreferrer"&gt;Azul Platform Prime&lt;/a&gt;
 and &lt;a href="https://www.azul.com/technologies/kafka/" target="_blank" rel="noopener noreferrer"&gt;Apache Kafka&lt;/a&gt;
!&lt;/p&gt;
&lt;p&gt;In this article you will learn how to switch between two different Java runtime environments to run an Apache Kafka instance.&lt;/p&gt;
&lt;p&gt;In later articles, this will allow you to compare runtime performance benchmarks.&lt;/p&gt;
&lt;p&gt;Before we begin, let&amp;rsquo;s supply some context on Azul&amp;rsquo;s Platform offerings and Apache Kafka.&lt;/p&gt;
&lt;h2 id="h-what-is-azul-platform-prime-and-platform-core"&gt;What is Azul Platform Prime and Platform Core?&lt;/h2&gt;
&lt;p&gt;Azul offers two Java runtime environments &lt;a href="https://www.azul.com/products/prime/" target="_blank" rel="noopener noreferrer"&gt;Platform Prime&lt;/a&gt;
 and &lt;a href="https://www.azul.com/products/core/" target="_blank" rel="noopener noreferrer"&gt;Platform Core&lt;/a&gt;
. Platform Prime (formerly known as Zing) is a high-performance implementation of the JVM (Java Virtual Machine) while Platform Core refers to Azul&amp;rsquo;s solution that includes the Zulu build of OpenJDK with dedicated support.&lt;/p&gt;</description></item><item><title>Reaper 3.0 for Apache Cassandra is available</title><link>https://foojayio.github.io/website/today/reaper-3-0-for-apache-cassandra-is-available/</link><pubDate>Fri, 18 Mar 2022 14:55:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/reaper-3-0-for-apache-cassandra-is-available/</guid><description>&lt;p&gt;The &lt;a href="https://k8ssandra.io/" target="_blank" rel="noopener noreferrer"&gt;K8ssandra&lt;/a&gt;
 team is pleased to announce the release of &lt;a href="http://cassandra-reaper.io/" target="_blank" rel="noopener noreferrer"&gt;Reaper 3.1&lt;/a&gt;
. Let&amp;rsquo;s dive into the features and improvements that 3.0 recently introduced (along with some notable removals) and how the newest update to 3.1 builds on that.&lt;/p&gt;
&lt;p&gt;Starting with 3.1.0, Reaper can now compile and run with jdk11. Note that jdk8 is still supported at runtime.&lt;/p&gt;
&lt;p&gt;Over the years, we regularly discussed dropping support for Postgres and H2 with the &lt;a href="https://thelastpickle.com/reaper.html" target="_blank" rel="noopener noreferrer"&gt;The Last Pickle&lt;/a&gt;
 (TLP) team, now part of &lt;a href="https://www.datastax.com/company" target="_blank" rel="noopener noreferrer"&gt;DataStax&lt;/a&gt;
, the organization leading the open-source development of Reaper. Despite our lack of expertise in Postgres, the effort required to maintain support for these storage backends was moderate as long as Reaper&amp;rsquo;s architecture was simple. However, complexity grew with more deployment options, culminating with the addition of the sidecar mode.&lt;/p&gt;</description></item><item><title>Jakarta Concurrency: Present and Future</title><link>https://foojayio.github.io/website/today/jakarta-concurrency-present-and-future/</link><pubDate>Wed, 23 Feb 2022 14:15:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/jakarta-concurrency-present-and-future/</guid><description>&lt;p&gt;&lt;a href="https://jakarta.ee/" target="_blank" rel="noopener noreferrer"&gt;Jakarta EE&lt;/a&gt;
, previously Java EE, is a set of specifications that enables the world wide community of Java developers to work on cloud native Java enterprise applications. It is an open source project maintained by the &lt;a href="https://www.eclipse.org/org/" target="_blank" rel="noopener noreferrer"&gt;Eclipse Foundation.&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Jakarta Concurrency is a small, but fundamental, specification under the Jakarta EE umbrella. As project lead, I provide more information on what it is, its future and how to be involved.&lt;/p&gt;</description></item><item><title>Monitoring Spring Boot Applications (Part 1)</title><link>https://foojayio.github.io/website/today/monitoring-spring-boot-applications-part-1/</link><pubDate>Wed, 12 Jan 2022 16:34:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/monitoring-spring-boot-applications-part-1/</guid><description>&lt;blockquote&gt;
&lt;p&gt;In part 1 of this series, we will learn about JDK Flight Recorder and how we can use it to monitor a Spring Boot application.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="h3-0-introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Application monitoring is one thing that we as developers cannot overlook. It doesn&amp;rsquo;t matter if you run a monolith or microservices application because application monitoring is a must for production workloads to know what&amp;rsquo;s happening with your application. If you are using Spring Boot, there are different ways to monitor an application. The most popular way to monitor a Spring Boot application is to enable the &lt;a href="https://github.com/spring-projects/spring-boot/tree/v2.6.0/spring-boot-project/spring-boot-actuator" target="_blank" rel="noopener noreferrer"&gt;spring-boot-actuator&lt;/a&gt;
 module to achieve the desired result.&lt;/p&gt;</description></item><item><title>Debugging RAM: Java Garbage Collection - Java Heap Deep Dive (Part 1)</title><link>https://foojayio.github.io/website/today/debugging-ram-java-garbage-collection-java-heap-deep-dive-part-1/</link><pubDate>Tue, 11 Jan 2022 15:36:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-ram-java-garbage-collection-java-heap-deep-dive-part-1/</guid><description>&lt;p&gt;There are many excellent articles on Java Garbage Collection, Java Memory usage and generally Java heap. Unfortunately, they are all over the place. They mix architecture, concepts and problem solving as separate pieces. A lot of the material is out of date or doesn&amp;rsquo;t include pragmatic information for solving problems with the garbage collector. E.g. e.g. pause times, heap space usage etc.&lt;/p&gt;
&lt;p&gt;In this post I won&amp;rsquo;t go into memory leaks. They&amp;rsquo;re important but this is a different subject I would like to discuss in a post on its own.&lt;/p&gt;</description></item><item><title>Hashcode and Equals: Debugging and Performance</title><link>https://foojayio.github.io/website/today/hashcode-and-equals-debugging-performance/</link><pubDate>Fri, 07 Jan 2022 13:31:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/hashcode-and-equals-debugging-performance/</guid><description>&lt;p&gt;A few weeks ago I ran into &lt;a href="https://www.reddit.com/r/java/comments/qi8yu8/hint_to_myself_and_other_poor_souls_dont_use/" target="_blank" rel="noopener noreferrer"&gt;this story on reddit&lt;/a&gt;
 that discusses the problem with using the URL class as a key in a Map. This boils down to a remarkably slow implementation of the hashcode() method in java.net.URL which makes this class unusable in such situations.&lt;/p&gt;
&lt;p&gt;Unfortunately, this is a part of the Java API specification and is no longer fixable without breaking backwards compatibility.&lt;/p&gt;
&lt;p&gt;What we can do is understand the problem with equals and hashcode. How can we avoid such problems in the future?&lt;/p&gt;</description></item><item><title>Fail-Fast Reliable Software Strategy. Debug Failures Effectively</title><link>https://foojayio.github.io/website/today/fail-fast-best-strategy-for-reliable-software/</link><pubDate>Tue, 14 Dec 2021 15:30:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/fail-fast-best-strategy-for-reliable-software/</guid><description>&lt;p&gt;&lt;strong&gt;I love cooking and use my &lt;a href="https://www.thermomix.com/" target="_blank" rel="noopener noreferrer"&gt;Thermomix&lt;/a&gt;
 a lot. If you hadn&amp;rsquo;t heard about that amazing innovation, it&amp;rsquo;s a kitchen robot&amp;hellip; Well, it&amp;rsquo;s a magical super cooking machine. When designing the Thermomix, its designers took the approach of &lt;a href="https://en.wikipedia.org/wiki/Fail-safe" target="_blank" rel="noopener noreferrer"&gt;fail-safe&lt;/a&gt;
 instead of &lt;a href="https://en.wikipedia.org/wiki/Fail-fast" target="_blank" rel="noopener noreferrer"&gt;fail-fast&lt;/a&gt;
. This is a smart choice in this case, but it has its drawbacks.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;E.g., my machine tried to recover from a failure which sent it into an infinite recovery loop. I literally couldn&amp;rsquo;t pull out the food from the lid that was sealed shut. But normally, it&amp;rsquo;s one of the most reliable devices I own.&lt;/p&gt;</description></item><item><title>Native-image with Quarkus</title><link>https://foojayio.github.io/website/today/native-image-quarkus/</link><pubDate>Mon, 13 Dec 2021 17:50:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/native-image-quarkus/</guid><description>&lt;p&gt;So far, we have looked at how well &lt;a href="https://foojayio.github.io/website/today/native-spring-boot/"&gt;Spring Boot&lt;/a&gt;
 and &lt;a href="https://foojayio.github.io/website/today/native-image-micronaut/"&gt;Micronaut&lt;/a&gt;
 integrate GraalVM native image extension. In this post, I&amp;rsquo;ll focus on &lt;a href="https://quarkus.io/" target="_blank" rel="noopener noreferrer"&gt;Quarkus&lt;/a&gt;
:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A Kubernetes Native Java stack tailored for OpenJDK HotSpot and GraalVM, crafted from the best of breed Java libraries and standards.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="h2-0-creating-a-new-project"&gt;Creating a new project&lt;/h2&gt;
&lt;p&gt;Just as Spring Boot and Micronaut, Quarkus provides options to create new projects:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A dedicated &lt;code&gt;quarkus&lt;/code&gt; &lt;a href="https://quarkus.io/guides/cli-tooling" target="_blank" rel="noopener noreferrer"&gt;CLI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://code.quarkus.io/" target="_blank" rel="noopener noreferrer"&gt;Web UI&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;img fetchpriority="high" decoding="async" class="aligncenter size-medium wp-image-50950" src="code-quarkus-700x477.jpg" alt="" width="700" height="477"&gt;
&lt;p&gt;Quarkus offers a definite improvement over its competitors. Every dependency has a detailed contextual menu that allows:&lt;/p&gt;</description></item><item><title>Native-image with Micronaut</title><link>https://foojayio.github.io/website/today/native-image-micronaut/</link><pubDate>Mon, 22 Nov 2021 10:18:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/native-image-micronaut/</guid><description>&lt;p&gt;Last week, I wrote a native web app that queried the Marvel API &lt;a href="https://foojayio.github.io/website/today/native-spring-boot/"&gt;using Spring Boot&lt;/a&gt;
. This week, I want to do the same with the Micronaut framework.&lt;/p&gt;
&lt;h2 id="h2-0-creating-a-new-project"&gt;Creating a new project&lt;/h2&gt;
&lt;p&gt;Micronaut offers two options to create a new project:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A &lt;a href="https://micronaut.io/launch" target="_blank" rel="noopener noreferrer"&gt;web UI&lt;/a&gt;
:&lt;/li&gt;
&lt;/ol&gt;
&lt;img fetchpriority="high" decoding="async" class="aligncenter wp-image-50794 size-medium" src="micronaut-launch-700x330.jpg" alt="Micronaut Launch Web UI" width="700" height="330"&gt;
&lt;p&gt;As for Spring Initializr, it provides several features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Preview the project before you download it&lt;/li&gt;
&lt;li&gt;Share the configuration&lt;/li&gt;
&lt;li&gt;An API&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I do like that you can check the impact that the added features have on the POM.
2. A &lt;a href="https://docs.micronaut.io/1.3.3/guide/index.html#buildCLI" target="_blank" rel="noopener noreferrer"&gt;Command-Line Interface&lt;/a&gt;
:In parallel to the webapp, you can install the on different systems. Then you can use the &lt;code&gt;mn&lt;/code&gt; command to create new projects.&lt;/p&gt;</description></item><item><title>A List of Cache Providers</title><link>https://foojayio.github.io/website/today/a-list-of-cache-providers/</link><pubDate>Thu, 18 Nov 2021 08:01:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/a-list-of-cache-providers/</guid><description>&lt;p&gt;Recently, we described &lt;a href="https://foojayio.github.io/website/today/choosing-a-cache-1/"&gt;several criteria to look at to choose a cache&lt;/a&gt;
. Now it&amp;rsquo;s time to list Java cache providers based on these criteria.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#java-caching-system"&gt;Java Caching System&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#guava"&gt;Guava&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#caffeine"&gt;Caffeine&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#ehcache"&gt;Ehcache&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#infinispan"&gt;Infinispan&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#coherence-community-edition"&gt;Coherence Community Edition&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#ignite"&gt;Ignite&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#geode"&gt;Geode&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#hazelcast"&gt;Hazelcast&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="java-caching-system"&gt;Java Caching System&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;JCS is a distributed caching system written in Java. It is intended to speed up applications by providing a means to manage cached data of various dynamic natures. Like any caching system, JCS is most useful for high read, low put applications. Latency times drop sharply and bottlenecks move away from the database in an effectively cached system.&lt;/p&gt;</description></item><item><title>Kotlin and FaaS: An Impossible Union?</title><link>https://foojayio.github.io/website/today/kotlin-faas-impossible-union/</link><pubDate>Tue, 02 Nov 2021 08:40:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/kotlin-faas-impossible-union/</guid><description>&lt;p&gt;Some time ago, I read a post describing how to run a serverless Kotlin function on &lt;a href="https://www.openfaas.com/" target="_blank" rel="noopener noreferrer"&gt;OpenFaaS&lt;/a&gt;
. While the content is technically correct, I believe the concept itself is very wrong. Such posts can lead people to make ill-advised decisions: &amp;ldquo;because we can&amp;rdquo; is hardly a winning strategy.&lt;/p&gt;
&lt;p&gt;In this article, I&amp;rsquo;d like to first explain why the JVM platform is a bad idea for . Then, I&amp;rsquo;ll proceed to propose alternatives to use Kotlin nonetheless.&lt;/p&gt;</description></item><item><title>How to Choose a Cache: Capabilities</title><link>https://foojayio.github.io/website/today/choosing-a-cache-1/</link><pubDate>Tue, 26 Oct 2021 13:20:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/choosing-a-cache-1/</guid><description>&lt;p&gt;Today, I&amp;rsquo;d like to provide some help on how to choose a cache solution. I will organize it into two parts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In this post, we will list what features a cache must have and which ones it can optionally provide. Most criteria are general and can be used regardless of the tech stack, while a couple is specific to the JVM.&lt;/li&gt;
&lt;li&gt;In the second part, I&amp;rsquo;ll list providers and verify their respective capabilities&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-0-why-cache"&gt;Why cache?&lt;/h2&gt;
&lt;p&gt;First, let&amp;rsquo;s bust a common myth. Using a cache is not the sign of a badly-designed system &lt;em&gt;per se&lt;/em&gt;, though it might be the case. Like in many design decisions, a cache is a trade-off.&lt;/p&gt;</description></item><item><title>Faster Maven Builds (Part 2): Inside Docker</title><link>https://foojayio.github.io/website/today/faster-maven-builds-part-2/</link><pubDate>Thu, 14 Oct 2021 08:33:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/faster-maven-builds-part-2/</guid><description>&lt;p&gt;Following on from &lt;a href="https://foojayio.github.io/website/today/faster-maven-builds-1/"&gt;different techniques&lt;/a&gt;
 to speed up your Maven builds, I&amp;rsquo;d like to widen the scope and do the same for Maven builds &lt;em&gt;inside Docker&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Between each run, we change the source code by adding a single blank line; between each section, we remove all built images, including the intermediate ones that are the results of the multi-stage build. The idea is to avoid reusing a previously built image.&lt;/p&gt;
&lt;h2 id="h2-0-baseline"&gt;Baseline&lt;/h2&gt;
&lt;p&gt;To compute a helpful baseline, we need a sample project. I created &lt;a href="https://github.com/nfrankel/fast-maven-builds" target="_blank" rel="noopener noreferrer"&gt;one&lt;/a&gt;
 just for this purpose: it&amp;rsquo;s a relatively small Kotlin project.&lt;/p&gt;</description></item><item><title>How to Do Faster Maven Builds (Part 1)</title><link>https://foojayio.github.io/website/today/faster-maven-builds-1/</link><pubDate>Thu, 14 Oct 2021 08:27:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/faster-maven-builds-1/</guid><description>&lt;p&gt;Builds require a few properties, chief among them reproducibility. I would consider speed to be low on the order of priorities. However, it&amp;rsquo;s also one of the most limiting factors to your release cycle: if your build takes &lt;em&gt;T&lt;/em&gt; , you cannot release faster than each &lt;em&gt;T&lt;/em&gt;. Hence, you&amp;rsquo;ll probably want to speed up your builds after you&amp;rsquo;ve reached a certain maturity level to enable more frequent releases.&lt;/p&gt;
&lt;p&gt;I want to detail some techniques you can leverage to make your Maven builds faster in this article. The &lt;a href="https://foojayio.github.io/website/today/faster-maven-builds-part-2/"&gt;next article&lt;/a&gt;
 focuses on how to do the same inside of Docker.&lt;/p&gt;</description></item><item><title>On The Costs of Hidden Logging</title><link>https://foojayio.github.io/website/today/the-costs-of-hidden-logging/</link><pubDate>Mon, 11 Oct 2021 08:05:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-costs-of-hidden-logging/</guid><description>&lt;p&gt;A while ago I received a customer escalation ticket regarding performance degradation when using &lt;a href="https://docs.datadoghq.com/tracing/profiler/" target="_blank" rel="noopener noreferrer"&gt;Datadog Continuous Profiler for Java&lt;/a&gt;
. The degradation was observable as an increased CPU usage as well as unexpected latency.&lt;/p&gt;
&lt;h2 id="h2-0-the-beginning-unusual-customer-escalation"&gt;The Beginning: Unusual Customer Escalation&lt;/h2&gt;
&lt;p&gt;To bootstrap the troubleshooting, I usually try to isolate the area which might be causing the regression.&lt;/p&gt;
&lt;p&gt;The profiler is packaged as a Java agent and for ease of use it is bundled together with the Datadog Java tracer agent. The profiler itself uses JDK Flight Recorder (JFR) under the hood.&lt;/p&gt;</description></item><item><title>JDK Mission Control 8.1.0 Released!</title><link>https://foojayio.github.io/website/today/jdk-mission-control-8-1-0-released/</link><pubDate>Mon, 09 Aug 2021 18:02:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/jdk-mission-control-8-1-0-released/</guid><description>&lt;p&gt;Yay, the latest release of JDK Mission Control was just released!&lt;/p&gt;
&lt;p&gt;Since this is the source release, it may still take a bit of time until the downstream vendors release binary builds of JDK Mission Control 8.1.0.&lt;/p&gt;
&lt;p&gt;I will try to remember to &lt;a href="https://twitter.com/hirt" target="_blank" rel="noopener noreferrer"&gt;tweet&lt;/a&gt;
 or say something on the &lt;a href="https://www.facebook.com/javamissionctrl" target="_blank" rel="noopener noreferrer"&gt;JMC Facebook page&lt;/a&gt;
 once the binaries start showing up.&lt;/p&gt;
&lt;h2 id="h2-0-mission-control-8-1-new-and-noteworthy"&gt;Mission Control 8.1 &amp;ndash; New and Noteworthy&lt;/h2&gt;
&lt;hr&gt;
&lt;h3 id="h3-1-general"&gt;General&lt;/h3&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;JMC 8.1 &amp;ndash; New Release!&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Let's Optimize Relational Database Access</title><link>https://foojayio.github.io/website/today/optimizing-relational-database-access/</link><pubDate>Mon, 28 Jun 2021 07:42:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/optimizing-relational-database-access/</guid><description>&lt;p&gt;Database performances have been massively documented in the literature. Every week, a new blog post or article explains why database X is better than database Y. And, no, this post is not about that. This article summarizes the interactions between your database client (sometimes called driver) and the database server. It is essential to understand the principles of these exchanges to comprehend the limitations of the API the driver can expose safely.&lt;/p&gt;</description></item><item><title>BlockHound and Blocking Calls: How It Works</title><link>https://foojayio.github.io/website/today/blockhound-how-it-works/</link><pubDate>Tue, 22 Jun 2021 17:09:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/blockhound-how-it-works/</guid><description>&lt;p&gt;One of the talks in my current portfolio is &lt;a href="https://www.papercall.io/speakers/nicolasfrankel/speaker_talks/194232-migrating-from-imperative-to-reactive" target="_blank" rel="noopener noreferrer"&gt;Migrating from Imperative to Reactive&lt;/a&gt;
. The talk is based on a &lt;a href="https://github.com/hazelcast-demos/imperative-to-reactive/" target="_blank" rel="noopener noreferrer"&gt;demo&lt;/a&gt;
 migrating from Spring WebMVC to Spring WebFlux in a step-by-step approach. One of the steps involves installing &lt;a href="https://github.com/reactor/BlockHound" target="_blank" rel="noopener noreferrer"&gt;BlockHound&lt;/a&gt;
: it allows to check whether a blocking call occurs in a thread it shouldn&amp;rsquo;t happen and throws an exception at runtime when it happens.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve presented this talk several times in the previous week, both in its Java version and its Kotlin one. One such presentation was at &lt;a href="https://www.javaday.istanbul/" target="_blank" rel="noopener noreferrer"&gt;Javaday Istanbul&lt;/a&gt;
. After the talk, one of the questions I received was, &amp;ldquo;How does BlockHound work?&amp;rdquo; I admit that at the time, I couldn&amp;rsquo;t remember. After the surprise had passed, but too late, I remembered it involved a Java agent. But I wanted to go down the rabbit hole.&lt;/p&gt;</description></item><item><title>Apache Cassandra 4.0: Taming Tail Latencies with Java 16 ZGC</title><link>https://foojayio.github.io/website/today/apache-cassandra-4-0-taming-tail-latencies-with-java-16-zgc/</link><pubDate>Tue, 22 Jun 2021 07:45:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/apache-cassandra-4-0-taming-tail-latencies-with-java-16-zgc/</guid><description>&lt;p&gt;With Apache Cassandra 4.0, you not only get the direct improvements to performance added by the Apache Cassandra committers, you also unlock the ability to take advantage of seven years of improvements in the JVM itself. This article focuses on improvements in Java garbage collection that Cassandra 4.0 coupled with Java 16 offers over Cassandra 3.11 on Java 8.&lt;/p&gt;
&lt;p&gt;Like so many others in the Apache Cassandra community, I&amp;rsquo;m extremely excited to see that the 4.0 release is finally here. There are &lt;a href="https://cassandra.apache.org/doc/latest/new/" target="_blank" rel="noopener noreferrer"&gt;many, many improvements to Cassandra 4.0&lt;/a&gt;
. One enhancement that is more important than it might look is the addition of support for Java versions 9 and up. This was not trivial, because Java 9 made changes to some internal APIs that the most performance-oriented Java projects like Cassandra relied on (you can read more about this &lt;a href="https://issues.apache.org/jira/browse/CASSANDRA-9608" target="_blank" rel="noopener noreferrer"&gt;here&lt;/a&gt;
).&lt;/p&gt;</description></item><item><title>Concurrency in Java (Compared with Other Programming Languages)</title><link>https://foojayio.github.io/website/today/concurrency-in-java-and-how-it-compares-with-other-modern-programming-languages/</link><pubDate>Tue, 15 Jun 2021 08:05:50 +0000</pubDate><guid>https://foojayio.github.io/website/today/concurrency-in-java-and-how-it-compares-with-other-modern-programming-languages/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/concurrency-in-java-and-how-it-compares-with-other-modern-programming-languages/evgeniya-litovchenko-3whkjP9a9ZI-unsplash-700x467.jpg" alt="cover image" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;This is a multi-part series where I talk about concurrency in modern programming languages and build and benchmark a concurrent web server, inspired by the example from the &lt;a href="https://doc.rust-lang.org/book/ch20-00-final-project-a-web-server.html" target="_blank" rel="noopener noreferrer"&gt;Rust book&lt;/a&gt;
, in popular languages like Java, Rust, Go, JavaScript (NodeJS), TypeScript (Deno) and Kotlin to compare concurrency and its performance between these languages/platforms.&lt;/p&gt;
&lt;p&gt;The chapters of this series are as below, with part 6 here on Foojay.io, the place for friends of OpenJDK.&lt;/p&gt;</description></item><item><title>Querying Your In-Memory-Data-Grid: Why and How?</title><link>https://foojayio.github.io/website/today/querying-your-in-memory-data-grid-why-and-how/</link><pubDate>Fri, 21 May 2021 07:11:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/querying-your-in-memory-data-grid-why-and-how/</guid><description>&lt;blockquote&gt;
&lt;p&gt;An in-memory data grid (IMDG) is a set of networked/clustered computers that pool together their random access memory (RAM) to let applications share data with other applications running in the cluster. Though IMDGs are sometimes generically described as a distributed in-memory data store, IMDGs offer more than just storage. IMDGs are built for data processing at extremely high speeds. They are designed for building and running large-scale applications that need more RAM than is typically available in a single computer server. This enables the highest application performance by using RAM along with the processing power of multiple computers that run tasks in parallel. IMDGs are especially valuable for applications that do extensive parallel processing on large data sets.&lt;/p&gt;</description></item><item><title>Demystifying Java Virtual Machine Memory Management</title><link>https://foojayio.github.io/website/today/demystifying-jvm-memory-management/</link><pubDate>Thu, 20 May 2021 07:26:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/demystifying-jvm-memory-management/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/Kv9ichJ.gif" alt="cover-image" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://deepu.tech/memory-management-in-programming/" target="_blank" rel="noopener noreferrer"&gt;this multi-part series&lt;/a&gt;
, I aim to demystify the concepts behind memory management and take a deeper look at memory management in some of the modern programming languages, in particular Java, Kotlin, Scala, Groovy, and Clojure.&lt;/p&gt;
&lt;p&gt;I hope the series would give you some insights into what is happening under the hood of these languages in terms of memory management. In this chapter, we will look at the memory management of the &lt;strong&gt;Java Virtual Machine (JVM)&lt;/strong&gt; used by languages like Java, Kotlin, Scala, Clojure, Groovy, and so on.&lt;/p&gt;</description></item><item><title>A (Definitive?) Guide to LazyInitializationException</title><link>https://foojayio.github.io/website/today/guide-lazyinitializationexception/</link><pubDate>Mon, 29 Mar 2021 07:19:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/guide-lazyinitializationexception/</guid><description>&lt;p&gt;Posts that have been written about Hibernate&amp;rsquo;s &lt;code&gt;LazyInitializationException&lt;/code&gt; could probably fill whole books.&lt;/p&gt;
&lt;p&gt;Yet, I believe each of them focuses on a particular aspect of it: some on a specific solution, some on how to solve it with Spring Boot, etc.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d like this post to be the definitive guide on the subject, even though I&amp;rsquo;m pretty sure it won&amp;rsquo;t. At least, I&amp;rsquo;ll be able to point others to it!&lt;/p&gt;</description></item><item><title>Billion Events Per Second, Millisecond Latency: Giga Streaming Analytics</title><link>https://foojayio.github.io/website/today/billion-events-per-second-with-millisecond-latency/</link><pubDate>Thu, 25 Mar 2021 17:04:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/billion-events-per-second-with-millisecond-latency/</guid><description>&lt;p&gt;This post is a part of a series:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/performance-of-modern-java-on-data-heavy-workloads-real-time-streaming/"&gt;Part 1 (Intro and high-throughput streaming benchmark)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/performance-of-modern-java-on-data-heavy-workloads-batch-processing/"&gt;Part 2 (batch workload benchmark)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/performance-of-modern-java-on-data-heavy-workloads-the-low-latency-rematch/"&gt;Part 3 (low-latency benchmark)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/sub-10-ms-latency-in-java-concurrent-gc-with-green-threads/"&gt;Part 4 (concurrent GC with green threads)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Part 5 (you are here)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&amp;rsquo;re preparing a scientific paper on Hazelcast Jet, describing its architecture based on symmetric, data-local, non-blocking distributed event processing. As a part of this effort, we implemented the vendor-neutral &lt;a href="http://datalab.cs.pdx.edu/niagara/NEXMark/" target="_blank" rel="noopener noreferrer"&gt;NEXMark&lt;/a&gt;
 benchmark suite, consisting of 8 streaming queries that aim to capture typical kinds of questions you&amp;rsquo;re likely to ask about your real-time data.&lt;/p&gt;</description></item><item><title>Kicking Spring Native's Tires with GraalVM</title><link>https://foojayio.github.io/website/today/kicking-spring-natives-tires/</link><pubDate>Mon, 22 Mar 2021 17:18:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/kicking-spring-natives-tires/</guid><description>&lt;p&gt;I&amp;rsquo;ve been playing with GraalVM Ahead-Of-Time compilation capability since I became aware of it. As a long-time Spring &lt;em&gt;aficionado&lt;/em&gt; , I carefully monitored the efforts that the engineers at Tanzu have put into making Spring AOT-compatible. Recently, they announced &lt;a href="https://spring.io/blog/2021/03/11/announcing-spring-native-beta" target="_blank" rel="noopener noreferrer"&gt;the beta version&lt;/a&gt;
 of the integration.&lt;/p&gt;
&lt;p&gt;In this post, I want to check how easy it is to produce a (working!) Docker image from an existing Spring Boot application.&lt;/p&gt;
&lt;h3 id="h3-0-introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;GraalVM provides many different features. Among them, the component known as Substrate VM allows to AOT-compile regular bytecode to a native executable. The process &amp;ldquo;walks&amp;rdquo; the application starting from the &lt;code&gt;main&lt;/code&gt; method at build time. Substrate VM leaves out the code that it doesn&amp;rsquo;t follow out from the resulting binary.&lt;/p&gt;</description></item><item><title>Evolution of Java Memory Architecture (Post Java 7.0)</title><link>https://foojayio.github.io/website/today/evolution-of-java-memory-architecture-post-java-7-0/</link><pubDate>Wed, 03 Mar 2021 16:19:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/evolution-of-java-memory-architecture-post-java-7-0/</guid><description>&lt;p&gt;&lt;strong&gt;[About SKP&amp;rsquo;s Core Java/Java EE Roots]&lt;/strong&gt;&lt;br&gt;
Series of Articles on Rooted Concepts in Core Java and J2EE. They Revolve Around Memory Architecture, Connection &amp;amp; Memory Leaks, Core Java Syntax &amp;amp; Semantics, Java Object Layout/Anatomy, Multi-Threading, Asynchronous Task Execution, Design Patterns, Java Agents, Class Loading, API Design, OOPs &amp;amp; SOLID.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="h2-0-java-memory-architecture-pre-java-8-0"&gt;&lt;strong&gt;Java Memory Architecture (Pre Java 8.0)&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Before we get started, you might want to take a look at Part 1. It explains the core concepts of the Java Memory Architecture, the ones that should get you started to understand this evolution better.&lt;/p&gt;</description></item><item><title>Evolution of Java Memory Architecture (Pre Java 8.0)</title><link>https://foojayio.github.io/website/today/java-roots-1-java-memory-architecture/</link><pubDate>Thu, 25 Feb 2021 14:59:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-roots-1-java-memory-architecture/</guid><description>&lt;p&gt;&lt;strong&gt;[About SKP&amp;rsquo;s Core Java/Java EE Roots]&lt;/strong&gt;&lt;br&gt;
Series of Articles on Rooted Concepts in Core Java and J2EE. They Revolve Around Memory Architecture, Connection &amp;amp; Memory Leaks, Core Java Syntax &amp;amp; Semantics, Java Object Layout/Anatomy, Multi-Threading, Asynchronous Task Execution, Design Patterns, Java Agents, Class Loading, API Design, OOPs &amp;amp; SOLID.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="h2-0-java-memory-architecture-java-memory-model"&gt;→ Java Memory Architecture (Java Memory Model)&lt;/h2&gt;
&lt;p&gt;The diagram below is the Java Memory Model for the Heap as well as the PermGen for any Java Application running in the Java Virtual Machine (JVM). The ratios are also provided to get a fair understanding of how the distribution of allowed memory is done across each of the generation types. All of the info is completely applicable up to Java 1.7 (inclusive). This diagram is also known as the &amp;lsquo;Managed Area&amp;rsquo; of the memory model.&lt;/p&gt;</description></item><item><title>Towards Continuous Performance Regression Testing</title><link>https://foojayio.github.io/website/today/towards-continuous-performance-regression-testing/</link><pubDate>Thu, 25 Feb 2021 09:44:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/towards-continuous-performance-regression-testing/</guid><description>&lt;p&gt;Functional unit and integration tests are a standard tool of any software development organization, helping not only to ensure correctness of newly implemented code, but also to identify regressions &amp;mdash; bugs in existing functionality introduced by a code change. The situation looks different though when it comes to regressions related to non-functional requirements, in particular performance-related ones: How to detect increased response times in a web application? How to identify decreased throughput?&lt;/p&gt;</description></item><item><title>Safe Writing to Files in IoT and Industrial Systems</title><link>https://foojayio.github.io/website/today/safe-writing-to-files-in-iot-and-industrial-systems/</link><pubDate>Thu, 11 Feb 2021 09:12:23 +0000</pubDate><guid>https://foojayio.github.io/website/today/safe-writing-to-files-in-iot-and-industrial-systems/</guid><description>&lt;p&gt;Especially on IoT devices, file corruption on shutdown is a common concern. This article discusses how to write to disk safely in Java, combining disk sync, shutdown hooks, and atomic renaming of files.&lt;/p&gt;
&lt;h3 id="h3-0-files-on-disk-can-still-easily-become-corrupted"&gt;Files On Disk Can Still Easily Become Corrupted&lt;/h3&gt;
&lt;p&gt;For performance optimization, file systems write to disks asynchronously resulting in potential corruption when a hard system shutdowns occurs through power off or crashes.&lt;/p&gt;
&lt;p&gt;As this has become a rare experience for desktop and server users, it comes as a surprise to many developers working on IoT devices and industrial computers that hard power cuts are a common operational scenario and storage is far less robust than expected.&lt;/p&gt;</description></item><item><title>A Compendium of 2021 Java &amp; OpenJDK Predictions</title><link>https://foojayio.github.io/website/today/2021-java-jvm-predictions-by-topic/</link><pubDate>Fri, 22 Jan 2021 08:03:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/2021-java-jvm-predictions-by-topic/</guid><description>&lt;p&gt;Now that 2021 is well underway, many prominent Java developers have taken the time to predict what 2021 may bring to the Java universe.&lt;/p&gt;
&lt;p&gt;In December, here on Foojay.io, several articles were published on this theme, such as &lt;a href="https://foojayio.github.io/website/today/java-predictions-for-2021/"&gt;Java Predictions for 2021&lt;/a&gt;
, &lt;a href="https://foojayio.github.io/website/today/java-predictions-for-2021-jakarta-ee/"&gt;Java Predictions for 2021: Jakarta EE&lt;/a&gt;
, and &lt;a href="https://foojayio.github.io/website/today/java-predictions-for-2021-raspberry-pi/"&gt;Java Predictions for 2021: Raspberry Pi&lt;/a&gt;
. In early January, Simon Ritter published &lt;a href="https://www.azul.com/staring-into-my-java-snow-globe-2021/" title="Starting Into My Java Snow Globe 2021" target="_blank" rel="noopener noreferrer"&gt;Staring Into My Java Snow Globe 2021&lt;/a&gt;
. Separately, I conversed with another six developers about their visions for the coming year.&lt;/p&gt;</description></item><item><title>Tips on High Performance Rendering in JavaFX</title><link>https://foojayio.github.io/website/today/high-performance-rendering-in-javafx/</link><pubDate>Mon, 18 Jan 2021 09:07:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/high-performance-rendering-in-javafx/</guid><description>&lt;p&gt;In this article, we comparatively evaluate four different approaches to render particles in JavaFX in terms of runtime performance.&lt;/p&gt;
&lt;p&gt;The approaches are Canvas, PixelBuffer AWT, PixelBuffer CPU and PixelBuffer GPU.&lt;/p&gt;
&lt;p&gt;The evaluation suggests the following order of approaches from fastest to slowest:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;PixelBuffer GPU (fastest).&lt;/li&gt;
&lt;li&gt;PixelBuffer CPU.&lt;/li&gt;
&lt;li&gt;PixelBuffer AWT.&lt;/li&gt;
&lt;li&gt;Canvas (slowest).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;All of the source code developed for this article can be found on &lt;a href="https://github.com/AlmasB/FXGL-FastRender" target="_blank" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
. An example demo with 1 000 000 particles looks like this:&lt;/p&gt;</description></item><item><title>Continuous Production Profiling and Diagnostics</title><link>https://foojayio.github.io/website/today/continuous-production-profiling-and-diagnostics/</link><pubDate>Mon, 09 Nov 2020 15:57:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/continuous-production-profiling-and-diagnostics/</guid><description>&lt;p&gt;I&amp;rsquo;ve gotten a lot of questions about continuous production profiling lately. Why would anyone want to profile in production, or, if production profiling seems reasonable, why the heck leave it on continuously? I thought I&amp;rsquo;d take a few moments and share my take on the problem and the success I&amp;rsquo;ve seen the past years applying continuous production profiling in systems in the real world.&lt;/p&gt;
&lt;p&gt;Trigger warning: this blog will not contain code samples.&lt;/p&gt;</description></item><item><title>Peter Lawrey Talks about Low-Latency, High-Performance Java</title><link>https://foojayio.github.io/website/today/peter-lawrey-latency-performance/</link><pubDate>Thu, 22 Oct 2020 04:28:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/peter-lawrey-latency-performance/</guid><description>&lt;p&gt;About 7 years ago, I attended a session given by Java Champion Peter Lawrey, leader of &lt;a href="https://chronicle.software" title="Chronical Software" target="_blank" rel="noopener noreferrer"&gt;Chronical Software&lt;/a&gt;
, at a JavaOne conference. Since most of my prior development work in the realm of low-latency high-performance was C/C++ software, I was very interested in hearing what Peter might say about how Java addresses this problem.&lt;/p&gt;
&lt;p&gt;I have to admit, being a long-time C/C++ developer, but also with quite a lot of experience with Java, I was a bit skeptical as to how Java might match up to C/C++ in terms of multithread performance.&lt;/p&gt;</description></item><item><title>Timing Compiling .java Code Files and Executing .class Bytecode</title><link>https://foojayio.github.io/website/today/compiling-java-code-executing-bytecode/</link><pubDate>Mon, 28 Sep 2020 04:37:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/compiling-java-code-executing-bytecode/</guid><description>&lt;p&gt;Java developers are familiar with the notion that the foundation of Java is &amp;ldquo;write once, run anywhere.&amp;rdquo; That is, the same Java code will run on all the primary operating systems and hardware platforms. As I noted in my earlier post &lt;a href="https://foojayio.github.io/website/blog/why-java-c-and-python-are-todays-most-utilized-programming-languages/"&gt;Why Java, C, and Python Are Today&amp;rsquo;s Most Utilized Programming Languages&lt;/a&gt;
, Python comes somewhat close to this (though in my experience what works on Linux may not work out-of-the-box on Windows or Mac), and of course C/C++ require immense adaptation of the software in order for it to work on different operating systems and hardware platforms.&lt;/p&gt;</description></item><item><title>Startup Speed of Spring and Quarkus JARs on the Raspberry Pi</title><link>https://foojayio.github.io/website/today/startup-spring-quarkus-raspberry-pi/</link><pubDate>Fri, 18 Sep 2020 09:16:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/startup-spring-quarkus-raspberry-pi/</guid><description>&lt;p&gt;For my book &amp;ldquo;&lt;a href="https://webtechie.be/books/" target="_blank" rel="noopener noreferrer"&gt;Getting Started with Java on Raspberry Pi&lt;/a&gt;
&amp;rdquo;, an example was described to store sensors and measurements in an H2-database through REST APIs with a Spring application on the Raspberry Pi.&lt;/p&gt;
&lt;p&gt;The application takes some time to start on a Raspberry Pi, and &lt;a href="https://twitter.com/AdamBien" target="_blank" rel="noopener noreferrer"&gt;Adam Bien&lt;/a&gt;
 who does the &lt;a href="https://airhacks.fm/#episode_104" target="_blank" rel="noopener noreferrer"&gt;airhacks.fm podcast&lt;/a&gt;
 asked me if I could compare this to a similar Quarkus application, which resulted in some nice results.&lt;/p&gt;</description></item><item><title>What is JVM Bytecode?</title><link>https://foojayio.github.io/website/today/what-is-jvm-bytecode/</link><pubDate>Wed, 16 Sep 2020 03:55:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/what-is-jvm-bytecode/</guid><description>&lt;p&gt;Everyone who programs in Java, or any of the other languages built on top of the Java Virtual Machine (Scala, Closure, Kotlin, Groovy, Nashorn, Jython, JRuby, et al.) is familiar with the term &amp;ldquo;bytecode.&amp;rdquo; But how many of us understand what JDK bytecode actually is?&lt;/p&gt;
&lt;p&gt;I became more curious about this after I wrote my last foojay.io post, &lt;a href="https://foojayio.github.io/website/blog/why-the-jvm-is-a-brilliant-platform-for-new-programming-languages/"&gt;Why the JVM Is a Brilliant Platform for New Programming Languages&lt;/a&gt;
. What exactly &lt;em&gt;is&lt;/em&gt; bytecode?&lt;/p&gt;</description></item><item><title>Useful Hotspot JVM Options for Today: Heap Sizing</title><link>https://foojayio.github.io/website/today/useful-jvm-options-heap-sizing/</link><pubDate>Mon, 14 Sep 2020 16:37:30 +0000</pubDate><guid>https://foojayio.github.io/website/today/useful-jvm-options-heap-sizing/</guid><description>&lt;p&gt;The HotSpot JVM has a lot of options available. Maybe too many. Sometimes we are looking for a specific option or the &amp;ldquo;magic&amp;rdquo; one that can give a serious boost in an application. Unfortunately, I think that magic option may not exist! However, some can help you for optimizing your application or for tuning some of its parts.&lt;/p&gt;
&lt;p&gt;To find the complete list of options you will find in the &lt;a href="https://github.com/openjdk/jdk/blob/master/src/hotspot/share/runtime/globals.hpp" target="_blank" rel="noopener noreferrer"&gt;globals.hpp&lt;/a&gt;
 file from OpenJDK sources. However, the &lt;a href="https://chriswhocodes.com/vm-options-explorer.html" target="_blank" rel="noopener noreferrer"&gt;VM Options Explorer&lt;/a&gt;
, also &lt;a href="https://foojayio.github.io/website/command-line-arguments/openjdk-11/?tab=alloptions"&gt;integrated neatly here into foojay&lt;/a&gt;
, can help you to navigate through the list.&lt;/p&gt;</description></item><item><title>Why the JVM Is a Brilliant Platform for New Programming Languages</title><link>https://foojayio.github.io/website/today/why-the-jvm-is-a-brilliant-platform-for-new-programming-languages/</link><pubDate>Wed, 09 Sep 2020 05:07:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-the-jvm-is-a-brilliant-platform-for-new-programming-languages/</guid><description>&lt;p&gt;In my &lt;a href="https://foojayio.github.io/website/blog/why-java-c-and-python-are-todays-most-utilized-programming-languages/"&gt;previous post&lt;/a&gt;
, I speculated that Java, Python, and C are likely to be the most prominent programming languages going pretty far into the future.&lt;/p&gt;
&lt;p&gt;Another point in my speculation was that utilizing the Java Virtual Machine facilitates the invention of new programming languages created for special purposes that could not be easily created by other means. The JVM takes care of all of the low-level infrastructure problems that are involved in the creation of any software that you&amp;rsquo;d like to be runnable on any device or operating system.&lt;/p&gt;</description></item><item><title>JmFrX: A Bridge From JMX to Java Flight Recorder</title><link>https://foojayio.github.io/website/today/introducing-jmfrx-a-bridge-from-jmx-to-java-flight-recorder/</link><pubDate>Thu, 03 Sep 2020 09:24:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/introducing-jmfrx-a-bridge-from-jmx-to-java-flight-recorder/</guid><description>&lt;p&gt;I&amp;rsquo;m excited to share news about an open-source utility I&amp;rsquo;ve been working on lately: &lt;a href="https://github.com/gunnarmorling/jmfrx" target="_blank" rel="noopener noreferrer"&gt;JmFrX&lt;/a&gt;
, a tool for capturing JMX data with Java Flight Recorder.&lt;/p&gt;
&lt;p&gt;When using JMX (&lt;a href="https://en.wikipedia.org/wiki/Java_Management_Extensions" target="_blank" rel="noopener noreferrer"&gt;Java Management Extensions&lt;/a&gt;
), the Java platform&amp;rsquo;s standard for monitoring and managing applications, JmFrX allows you to periodically record the attributes from any JMX MBean into &lt;a href="https://openjdk.java.net/jeps/328" target="_blank" rel="noopener noreferrer"&gt;Java Flight Recorder&lt;/a&gt;
 (JFR) files, which you then can analyse using &lt;a href="https://openjdk.java.net/projects/jmc/" target="_blank" rel="noopener noreferrer"&gt;JDK Mission Control&lt;/a&gt;
 (JMC).&lt;/p&gt;</description></item><item><title>Stream.concat vs. New ArrayList Performance</title><link>https://foojayio.github.io/website/today/performance-stream-concat-vs-new-arraylist/</link><pubDate>Thu, 27 Aug 2020 05:34:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/performance-stream-concat-vs-new-arraylist/</guid><description>&lt;p&gt;During a code review, I suggested some code improvements related to JDK8+ streams. The original code looked very similar to the following:&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;List&amp;lt;Element&amp;gt; result = content.getFancyStuffs().stream()
 .flatMap(item -&amp;gt; {
 List&amp;lt;Element&amp;gt; objects = new ArrayList&amp;lt;&amp;gt;();
 objects.add(item.getElement());
 objects.addAll(item.getElements());
 return objects.stream();
 })
 .collect(toList());&lt;/pre&gt;
&lt;p&gt;Some more details here &amp;mdash; the &lt;code&gt;getFancyStuffs()&lt;/code&gt; returns a list of &lt;code&gt;FancyStuff&lt;/code&gt; elements. The &lt;code&gt;FancyStuff&lt;/code&gt; class contains two getters where &lt;code&gt;getElement()&lt;/code&gt; returns a single &lt;code&gt;Element&lt;/code&gt; whereas the &lt;code&gt;getElements()&lt;/code&gt; returns (guess what?) a list of &lt;code&gt;Element&lt;/code&gt;s.&lt;/p&gt;</description></item><item><title>Monitoring REST APIs with Custom Java Flight Recorder Events</title><link>https://foojayio.github.io/website/today/monitoring-rest-apis-with-custom-flight-recorder-events/</link><pubDate>Wed, 26 Aug 2020 08:36:57 +0000</pubDate><guid>https://foojayio.github.io/website/today/monitoring-rest-apis-with-custom-flight-recorder-events/</guid><description>&lt;p&gt;The &lt;a href="https://openjdk.java.net/jeps/328" target="_blank" rel="noopener noreferrer"&gt;Java Flight Recorder&lt;/a&gt;
 (JFR) is an invaluable tool for gaining deep insights into the performance characteristics of Java applications. Open-sourced in JDK 11, JFR provides a low-overhead framework for collecting events from Java applications, the JVM and the operating system.&lt;/p&gt;
&lt;p&gt;In this blog post, we&amp;rsquo;re going to explore how custom, application-specific JFR events can be used to monitor a REST API, allowing to track request counts, identify long-running requests and more. We&amp;rsquo;ll also discuss how the JFR &lt;a href="https://openjdk.java.net/jeps/349" target="_blank" rel="noopener noreferrer"&gt;Event Streaming API&lt;/a&gt;
, new in Java 14, can be used to export live events, making them available for monitoring and alerting via tools such as Prometheus and Grafana.&lt;/p&gt;</description></item><item><title>Container Awareness for Java Developers Today</title><link>https://foojayio.github.io/website/today/container-awareness-for-java/</link><pubDate>Mon, 24 Aug 2020 08:55:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/container-awareness-for-java/</guid><description>&lt;p&gt;When you containerize a Java application, make sure you use a base JDK image that is container-aware (CGroup aware) so that the JDK can allocate memory and CPU counts properly.&lt;/p&gt;
&lt;p&gt;Older versions of JDK (prior to 8u192) may not have container awareness (or may have experimental support that requires explict flags to enable). Older versions of JDK may look at the traditional &lt;code&gt;/proc/meminfo&lt;/code&gt; and &lt;code&gt;/proc/cpuinfo&lt;/code&gt;files for available memory and CPUs. The content of these files reflects the amount of resources of the host/node machine that is running the container, but do not reflect the actual limits assigned to the container (which may be much less).&lt;/p&gt;</description></item><item><title>A Closer Look at Java Flight Recorder Streaming</title><link>https://foojayio.github.io/website/today/a-closer-look-at-jfr-streaming/</link><pubDate>Mon, 17 Aug 2020 11:04:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/a-closer-look-at-jfr-streaming/</guid><description>&lt;p&gt;&lt;em&gt;By&lt;/em&gt; &lt;a href="https://twitter.com/hirt" target="_blank" rel="noopener noreferrer"&gt;&lt;em&gt;Marcus Hirt&lt;/em&gt;&lt;/a&gt;
&lt;em&gt;and&lt;/em&gt; &lt;a href="https://twitter.com/jpbempel" target="_blank" rel="noopener noreferrer"&gt;&lt;em&gt;JP Bempel&lt;/em&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Since JDK 14, there is a new Java Flight Recorder (JFR) kid on the block &amp;ndash; JFR streaming. 🙂 This blog post, written together with JP Bempel, will discuss some of the things that you can do with JFR streaming, as well as some of the things you may want to avoid.&lt;/p&gt;
&lt;h2 id="h2-0-an-introduction-to-jfr-streaming"&gt;An Introduction to JFR Streaming&lt;/h2&gt;
&lt;p&gt;In the most recent version of the JDK, a new JFR-related feature was introduced &amp;ndash; JFR streaming. It is a feature allowing a developer to subscribe to select JFR data and to decide what to do with that data in the host process. JFR events can also be consumed from a separate process by pointing to the file repo of a separate JVM process &amp;ndash; the mechanism is the same.&lt;/p&gt;</description></item><item><title>Sub-10 ms Latency in Java: Concurrent GC with Green Threads</title><link>https://foojayio.github.io/website/today/sub-10-ms-latency-in-java-concurrent-gc-with-green-threads/</link><pubDate>Wed, 05 Aug 2020 17:44:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/sub-10-ms-latency-in-java-concurrent-gc-with-green-threads/</guid><description>&lt;p&gt;This post is a part of a series:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/performance-of-modern-java-on-data-heavy-workloads-real-time-streaming/"&gt;Part 1 (Intro and high-throughput streaming benchmark)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/performance-of-modern-java-on-data-heavy-workloads-batch-processing/"&gt;Part 2 (batch workload benchmark)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/performance-of-modern-java-on-data-heavy-workloads-the-low-latency-rematch/"&gt;Part 3 (low-latency benchmark)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Part 4 (you are here)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/billion-events-per-second-with-millisecond-latency/"&gt;Part 5 (billion events per second)&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In Part 3 we showed that a modern JVM running live stream aggregation can achieve a 99.99% latency lower than 10 milliseconds. The focus of that post was comparing the different GC options available for the JVM. In order to maintain a level playing field, we kept to the default settings as much possible.&lt;/p&gt;</description></item><item><title>Performance of Modern Java on Heavy Workloads: Low-Latency Rematch</title><link>https://foojayio.github.io/website/today/performance-of-modern-java-on-data-heavy-workloads-the-low-latency-rematch/</link><pubDate>Tue, 23 Jun 2020 17:48:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/performance-of-modern-java-on-data-heavy-workloads-the-low-latency-rematch/</guid><description>&lt;p&gt;This post is a part of a series:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/performance-of-modern-java-on-data-heavy-workloads-real-time-streaming/"&gt;Part 1 (Intro and high-throughput streaming benchmark)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/performance-of-modern-java-on-data-heavy-workloads-batch-processing/"&gt;Part 2 (batch workload benchmark)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Part 3 (you are here)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/sub-10-ms-latency-in-java-concurrent-gc-with-green-threads/"&gt;Part 4 (concurrent GC with green threads)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/billion-events-per-second-with-millisecond-latency/"&gt;Part 5 (billion events per second)&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is a followup on Part 1 of the blog post series we started earlier this month, analyzing the performance of modern JVMs on workloads that are relevant to the use case of real-time stream processing.&lt;/p&gt;</description></item><item><title>Performance of Modern Java on Data-Heavy Workloads: Batch Processing</title><link>https://foojayio.github.io/website/today/performance-of-modern-java-on-data-heavy-workloads-batch-processing/</link><pubDate>Tue, 09 Jun 2020 14:45:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/performance-of-modern-java-on-data-heavy-workloads-batch-processing/</guid><description>&lt;p&gt;This post is a part of a series:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/performance-of-modern-java-on-data-heavy-workloads-real-time-streaming/"&gt;Part 1 (Intro and high-throughput streaming benchmark)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Part 2 (you are here)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/performance-of-modern-java-on-data-heavy-workloads-the-low-latency-rematch/"&gt;Part 3 (low-latency benchmark)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/sub-10-ms-latency-in-java-concurrent-gc-with-green-threads/"&gt;Part 4 (concurrent GC with green threads)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/billion-events-per-second-with-millisecond-latency/"&gt;Part 5 (billion events per second)&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="h3-0-batch-pipeline-benchmark"&gt;Batch Pipeline Benchmark&lt;/h3&gt;
&lt;p&gt;A batch pipeline processes a finite amount of stored data. There are no running results, we need the output of the aggregate function applied to the entire dataset. This changes our performance requirements: the key factor in streaming, latency, doesn&amp;rsquo;t exist here since we are not processing data in real time. The only metric that matters is the total run time of the pipeline.&lt;/p&gt;</description></item><item><title>Performance of Modern Java on Workloads: Real-Time Streaming</title><link>https://foojayio.github.io/website/today/performance-of-modern-java-on-data-heavy-workloads-real-time-streaming/</link><pubDate>Tue, 09 Jun 2020 01:45:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/performance-of-modern-java-on-data-heavy-workloads-real-time-streaming/</guid><description>&lt;p&gt;This post is a part of a series:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Part 1 (you are here)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/performance-of-modern-java-on-data-heavy-workloads-batch-processing/"&gt;Part 2 (batch workload benchmark)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/performance-of-modern-java-on-data-heavy-workloads-the-low-latency-rematch/"&gt;Part 3 (low-latency benchmark)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/sub-10-ms-latency-in-java-concurrent-gc-with-green-threads/"&gt;Part 4 (concurrent GC with green threads)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/billion-events-per-second-with-millisecond-latency/"&gt;Part 5 (billion events per second)&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Java runtime has been evolving more rapidly in recent years and, after 15 years, we finally got a new default garbage collector: the G1. Two more GCs are on their way to production and are available as experimental features: Oracle&amp;rsquo;s ZGC and OpenJDK&amp;rsquo;s Shenandoah.&lt;/p&gt;</description></item><item><title>Fun with Flags: My Top 10 Resources for JVM Flags</title><link>https://foojayio.github.io/website/today/top-10-fun-with-jvm-flags/</link><pubDate>Mon, 08 Jun 2020 08:21:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/top-10-fun-with-jvm-flags/</guid><description>&lt;p&gt;When I first started programming in Java and configuring my local environment, I came across mentions of JVM flags. I wanted to find out more about what options are available, what they do, and how to make use of them. Delving into the internet to discover what other more seasoned developers had to say on the topic, I was surprised at how hard it was to get definitive answers, and ultimately this research left me with more questions than answers. Since resources on this topic are scattered and hard to find, I put together this consolidated list in the hopes that others don&amp;rsquo;t have to scour the internet as I did to find these useful morsels.&lt;/p&gt;</description></item><item><title>JDK14 - New Features and Enhancements</title><link>https://foojayio.github.io/website/today/jdk14-new-features-and-enhancements/</link><pubDate>Tue, 19 May 2020 23:29:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/jdk14-new-features-and-enhancements/</guid><description>&lt;p&gt;Well, another six months have passed, and we have another release of Java, this one pretty packed with exciting new features. It is, therefore, time for another blog post trying to list everything new in &lt;a href="https://openjdk.java.net/projects/jdk/14/" target="_blank" rel="noopener noreferrer"&gt;JDK 14&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;In total, there are a very impressive 16 JDK Enhancement Proposals (JEPs) and 69 new API elements.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with the more significant items that introduce changes to the Java language syntax.&lt;/p&gt;
&lt;h2 id="h2-0-records"&gt;Records&lt;/h2&gt;
&lt;p&gt;Java is an object-oriented language; you create classes to hold data and use encapsulation to control how that data is accessed and modified. The use of objects makes manipulating complex data types simple and straightforward. It&amp;rsquo;s one of the reasons Java is so popular as a platform.&lt;/p&gt;</description></item></channel></rss>