<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Java Core on foojay.io - Friends of OpenJDK</title><link>https://foojayio.github.io/website/today/category/java-core/</link><description>Recent content in Java Core on foojay.io - Friends of OpenJDK</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 28 Jul 2026 13:24:18 +0000</lastBuildDate><atom:link href="https://foojayio.github.io/website/today/category/java-core/index.xml" rel="self" type="application/rss+xml"/><item><title>New Between-Quarters Security Updates for Java: What CSPUs Mean for Your Release Pipeline</title><link>https://foojayio.github.io/website/today/new-between-quarters-security-updates-for-java-what-cspus-mean-for-your-release-pipeline/</link><pubDate>Mon, 27 Jul 2026 07:31:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/new-between-quarters-security-updates-for-java-what-cspus-mean-for-your-release-pipeline/</guid><description>&lt;p&gt;In an announcement on the &lt;a href="https://mail.openjdk.org/archives/list/jdk-updates-dev@openjdk.org/thread/SVHDNJDY62MX6YBEA4FSMW4U72H77F6S/" target="_blank" rel="noopener noreferrer"&gt;OpenJDK Updates Mailinglist&lt;/a&gt;
 on July 20, 2026, Rob McKenna explained a change in the Oracle security release cycle for JDK builds. They plan to deliver security updates for the Oracle JDK as part of &lt;strong&gt;(some) monthly Critical Security Patch Updates (CSPUs)&lt;/strong&gt; .&lt;/p&gt;
&lt;p&gt;This brings more exact info, after an earlier message on April 26, 2026, in which &lt;a href="https://blogs.oracle.com/security/accelerating-vulnerability-detection-and-response-at-oracle" target="_blank" rel="noopener noreferrer"&gt;Oracle announced the acceleration of Vulnerability Detection and Response&lt;/a&gt;
. In that article they introduced the idea of monthly Critical Security Patch Updates (CSPU) across all their products. At that moment, it was not clear if this also applied to the Java releases, and how this would impact the normal quarterly cycle of Critical Patch Updates (CPUs).&lt;/p&gt;</description></item><item><title>Azul Zulu July 2026 Quarterly Update Released</title><link>https://foojayio.github.io/website/today/azul-zulu-july-2026-quarterly-update-released/</link><pubDate>Thu, 23 Jul 2026 12:35:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/azul-zulu-july-2026-quarterly-update-released/</guid><description>&lt;p&gt;Every three months your production JDKs fall further behind on security patches. Azul closes that gap today with the July 2026 quarterly update for Azul Zulu Builds of OpenJDK, covering Java 26, 25, 21, 17, 11, 8, 7, and 6.&lt;/p&gt;
&lt;h2 id="h2-0-the-quarterly-update-cycle"&gt;The Quarterly Update Cycle&lt;/h2&gt;
&lt;p&gt;Every three months, in January, April, July, and October, the OpenJDK project ships security patches, bug fixes, and improvements for all supported Java versions. This predictable schedule lets teams plan Java updates and keep production environments secure.&lt;/p&gt;</description></item><item><title>Your Loom App Quietly Became a Thread Pool Again: A Field Guide to Virtual Thread Pinning</title><link>https://foojayio.github.io/website/today/virtual-thread-pinning-field-guide/</link><pubDate>Thu, 16 Jul 2026 07:43:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/virtual-thread-pinning-field-guide/</guid><description>&lt;p&gt;The incident that taught me to respect pinning looked like nothing. A service freshly migrated to virtual threads, a load test that plateaued at about 420 requests per second no matter how much traffic we threw at it, CPU sitting at 9%, zero errors, zero warnings, nothing in the logs. The machine had 8 cores, and the one downstream HTTP call in the hot path took about 19 ms. Do the arithmetic: 8 × (1000 / 19) ≈ 421.&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>Endive 1.0 Is Here: Wasm on the JVM Ships Under the Bytecode Alliance</title><link>https://foojayio.github.io/website/today/endive-1-0-wasm/</link><pubDate>Mon, 29 Jun 2026 00:11:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/endive-1-0-wasm/</guid><description>&lt;p&gt;A few weeks ago, we wrote about &lt;a href="https://foojayio.github.io/website/today/a-new-generation-of-java-libraries-is-born-wasm-becomes-the-implementation-detail/"&gt;a new generation of Java libraries&lt;/a&gt;
 powered by WebAssembly. SQLite, QuickJS, Protocol Buffers, the Ruby Prism parser, all compiled to Wasm and shipped as regular JARs. No JNI, no platform-specific binaries. Wasm as an implementation detail.&lt;/p&gt;
&lt;p&gt;Today, the runtime that makes it all work has its first official release under the &lt;a href="https://bytecodealliance.org/" target="_blank" rel="noopener noreferrer"&gt;Bytecode Alliance&lt;/a&gt;
. &lt;strong&gt;&lt;a href="https://endive.run/blog/endive-1.0" target="_blank" rel="noopener noreferrer"&gt;Endive 1.0&lt;/a&gt;
&lt;/strong&gt; is available on Maven Central.&lt;/p&gt;
&lt;h2 id="h2-0-what-shipped"&gt;What Shipped&lt;/h2&gt;
&lt;p&gt;Endive continues the work started as &lt;a href="https://github.com/dylibso/chicory" target="_blank" rel="noopener noreferrer"&gt;Chicory&lt;/a&gt;
, the pure-Java WebAssembly runtime that has been powering this ecosystem since 2023. Same API, same community, same codebase. The move to the Bytecode Alliance is organizational, not technical. For details on the fork and governance, see the &lt;a href="https://bytecodealliance.org/articles/endive-and-the-next-chapter-of-webassembly-on-the-jvm" target="_blank" rel="noopener noreferrer"&gt;announcement article&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>BoxLang 1.14.0 : BoxSet is Here, BoxLang's New First-Class Set Type</title><link>https://foojayio.github.io/website/today/boxlang-1-14-0-boxset-is-here-boxlangs-new-first-class-set-type/</link><pubDate>Wed, 17 Jun 2026 10:36:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-1-14-0-boxset-is-here-boxlangs-new-first-class-set-type/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-1-14-0-boxset-is-here-boxlangs-new-first-class-set-type/BoxLang-release-1.14.0-1-700x394.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;BoxLang 1.14.0 ships with a new &lt;strong&gt;dynamic first-class Set type&lt;/strong&gt; baked directly into the language. Not a wrapper you reach for manually, not a &lt;code&gt;createObject( &amp;quot;java&amp;quot;, &amp;quot;java.util.HashSet&amp;quot; )&lt;/code&gt; incantation you paste from a Stack Overflow answer years ago. A real &lt;code&gt;BoxSet&lt;/code&gt; with literal syntax, operator overloads, a full functional pipeline, change listeners, JSON serialization, and deep Java interop.&lt;/p&gt;
&lt;p&gt;If you have ever deduplicated an array with a loop, compared two collections element by element, or modeled a permission system on top of a struct &amp;ndash; Sets are the tool you were missing. Let&amp;rsquo;s dig in.&lt;/p&gt;</description></item><item><title>BoxLang 1.14.0 : Introducing Inner Classes</title><link>https://foojayio.github.io/website/today/boxlang-1-14-0-introducing-inner-classes/</link><pubDate>Thu, 11 Jun 2026 10:29:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-1-14-0-introducing-inner-classes/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-1-14-0-introducing-inner-classes/BoxLang-release-1.14.0-700x394.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;BoxLang has always embraced a simple truth: the way you organize code shapes the way you think about problems. For a long time, if you needed a helper class, you needed a file. One class, one &lt;code&gt;.bx&lt;/code&gt; file, no exceptions. This also stemmed from the CFML days. That&amp;rsquo;s clean and predictable, but it creates real friction when a class is tightly coupled to exactly one caller and has no business existing anywhere else.&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>Foojay Podcast #95: Is Your Java App Actually Secure, Or Does It Just Look That Way?</title><link>https://foojayio.github.io/website/today/foojay-podcast-95/</link><pubDate>Mon, 11 May 2026 09:57:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-95/</guid><description>&lt;p&gt;Is your Java application actually secure, or does it just look that way? In this episode of the Foojay Podcast, Frank is joined by Steve Poole and David Welch, both from &lt;a href="https://www.herodevs.com/" target="_blank" rel="noopener noreferrer"&gt;HeroDevs&lt;/a&gt;
, to dig deep into the state of Java security in 2025 and beyond.&lt;/p&gt;
&lt;p&gt;Steve introduces the concept of zombie dependencies: end-of-life libraries that appear safely dormant but are quietly accumulating vulnerabilities waiting to bite you. David, a co-chair of the CVE Automation Working Group, explains what a CVE actually is, how the identification and disclosure process works in practice, and why AI tools like Mythos are dramatically accelerating the pace at which new vulnerabilities are found &amp;mdash; on both sides of the wall.&lt;/p&gt;</description></item><item><title>Using the Azul Zulu Docker Official Images: From Simple Pull to Lean Container</title><link>https://foojayio.github.io/website/today/using-the-azul-zulu-docker-official-images-from-simple-pull-to-lean-container/</link><pubDate>Fri, 08 May 2026 09:05:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/using-the-azul-zulu-docker-official-images-from-simple-pull-to-lean-container/</guid><description>&lt;p&gt;&lt;em&gt;Previously in this series:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://www.azul.com/blog/trusted-java-containers-azul-zulu-openjdk-joins-dockers-official-images/" target="_blank" rel="noopener noreferrer"&gt;Trusted Java Containers: Azul Zulu OpenJDK Joins Docker&amp;rsquo;s Official Images&lt;/a&gt;
&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://www.azul.com/blog/the-road-to-docker-official-images-for-java-the-azul-zulu-story/" target="_blank" rel="noopener noreferrer"&gt;The Road to Docker Official Images for Java: The Azul Zulu Story&lt;/a&gt;
&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://hub.docker.com/_/azul-zulu" target="_blank" rel="noopener noreferrer"&gt;Azul Zulu is now a Docker Official Image&lt;/a&gt;
, so getting a trusted, secure Java base image is now just a &lt;code&gt;FROM azul-zulu&lt;/code&gt; line in your Dockerfile. But pulling the right image is just the beginning. This post shows you how to use these images in practice, and how a few extra steps can seriously cut the size of what you ship.
&lt;img src="https://foojayio.github.io/website/today/using-the-azul-zulu-docker-official-images-from-simple-pull-to-lean-container/azul-docker-official-1024x576.avif" alt="" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>UCanAccess: The Modern Pure-Java Bridge to Microsoft Access</title><link>https://foojayio.github.io/website/today/ucanaccess-java-ms-access-jdbc-guide/</link><pubDate>Wed, 06 May 2026 08:44:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/ucanaccess-java-ms-access-jdbc-guide/</guid><description>&lt;p&gt;Microsoft Access databases are everywhere. Decades of &lt;code&gt;.mdb&lt;/code&gt; and &lt;code&gt;.accdb&lt;/code&gt; files silently power spreadsheets, small business applications, and legacy data stores across organizations of all sizes. Yet for Java developers, connecting to these files has historically meant wrestling with native Windows libraries, ODBC bridges, and platform-specific hacks.&lt;/p&gt;
&lt;figure class="aligncenter size-full is-resized"&gt;
 &lt;img decoding="async" src="ucanaccess-logo.svg" alt="UCanAccess Logo" class="wp-image-123938" style="width:320px"&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;UCanAccess&lt;/strong&gt; puts an end to that. It is an open-source, pure-Java JDBC driver that lets you read and write Microsoft Access databases (&lt;code&gt;.mdb&lt;/code&gt; and &lt;code&gt;.accdb&lt;/code&gt;) just like any other SQL database &amp;mdash; no native drivers, no Windows dependency, no friction.&lt;/p&gt;</description></item><item><title>Foojay Podcast #94: More Than a Blog: How Foojay Connects, Sustains, and Evolves the Java Community</title><link>https://foojayio.github.io/website/today/foojay-podcast-94/</link><pubDate>Mon, 04 May 2026 06:26:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-94/</guid><description>&lt;p&gt;Foojay.io, the website for the Friends of OpenJDK, is turning six years old. To celebrate, Frank Delporte headed to JCON in Cologne, Germany, and sat down with twelve members of the Java community to talk about what Foojay means to them, what they learn from each other, and how the community is evolving.&lt;/p&gt;
&lt;p&gt;This episode covers a lot of ground. Sharat Chandar reflects on 25 years in the Java community and why the people are what keep the language alive. Markus Westergren and Iryna Dohndorf both focus on a theme that comes up again and again: developer sustainability. Not just green software, but how you stay healthy, grounded, and relevant when AI is changing everything around you. Markus and his wife researched how developers are reacting to AI, from ignoring it completely to transforming everything they do. Iryna talks about building resilience and robustness as skills, not afterthoughts.&lt;/p&gt;</description></item><item><title>The Road to Docker Official Images for Java: The Azul Zulu Story</title><link>https://foojayio.github.io/website/today/the-road-to-docker-official-images-for-java-the-azul-zulu-story/</link><pubDate>Fri, 24 Apr 2026 08:57:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-road-to-docker-official-images-for-java-the-azul-zulu-story/</guid><description>&lt;p&gt;&lt;em&gt;Previously in this series:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://www.azul.com/blog/trusted-java-containers-azul-zulu-openjdk-joins-dockers-official-images/" target="_blank" rel="noopener noreferrer"&gt;Trusted Java Containers: Azul Zulu OpenJDK Joins Docker&amp;rsquo;s Official Images&lt;/a&gt;
&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After more than two years of collaboration, reviews, and back-and-forth with the Docker team, Azul Zulu Builds of OpenJDK have officially joined &lt;a href="https://hub.docker.com/_/azul-zulu" target="_blank" rel="noopener noreferrer"&gt;Docker&amp;rsquo;s Official Images&lt;/a&gt;
 program. This is not just a badge of honor. It changes how Java developers can pull and trust their container base images.&lt;/p&gt;
&lt;p&gt;The formal announcement is on the &lt;a href="https://www.azul.com/blog/trusted-java-containers-azul-zulu-openjdk-joins-dockers-official-images/" target="_blank" rel="noopener noreferrer"&gt;Azul blog&lt;/a&gt;
. In this post, I&amp;rsquo;ll walk you through what happened, why it matters, and how to start using these images today.&lt;/p&gt;</description></item><item><title>How to Use Java as a Scripting Language</title><link>https://foojayio.github.io/website/today/java-for-scripting/</link><pubDate>Mon, 23 Mar 2026 10:00:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-for-scripting/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/java-for-scripting/java-script-cover-700x467.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;h2 id="h2-0-the-scripting-dilemma"&gt;The Scripting Dilemma&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re like me, as a Java developer, you struggle to remember bash or python syntax for quick scripts.&lt;/p&gt;
&lt;p&gt;You end up &amp;ldquo;vibe coding&amp;rdquo; it, then struggle again when you need to adapt it. If only you could write it in Java!&lt;/p&gt;
&lt;p&gt;You might say &amp;ldquo;Java is not for scripting&amp;rdquo; and &amp;ldquo;I don&amp;rsquo;t want maven or Gradle&amp;rdquo;.Modern Java has quietly eliminated the traditional barriers that made it unsuitable for scripting.With instant execution, shebang support, and zero-setup automation, Java has evolved into a lean scripting language. Write precise, maintainable code without the &amp;ldquo;vibe coding&amp;rdquo; that comes with unfamiliar languages.&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>Foojay Podcast #92: Java 26 Is Here: What's New, What's Gone, and Why It Matters in 2026</title><link>https://foojayio.github.io/website/today/foojay-podcast-92/</link><pubDate>Mon, 16 Mar 2026 06:58:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-92/</guid><description>&lt;p&gt;Welcome to another episode of the Foojay Podcast! In this episode, we&amp;rsquo;re talking about Java 26, released on March 17 in the year 26. Again, right on schedule with Java&amp;rsquo;s six-month release cadence.&lt;/p&gt;
&lt;p&gt;Now, Java 26 is not a Long Term Support (LTS) release; that was Java 25. But don&amp;rsquo;t let that fool you into thinking there&amp;rsquo;s nothing interesting here. This release brings ten JDK Enhancement Proposals (JEPs). They cover everything from performance improvements to long-overdue cleanups. Of those ten JEPS, five are new features, and we also get five preview/incubator features.&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>Gotta Code 'Em All: How Java Evolved Beyond Verbosity – Celebrating 30 Years of Pokémon</title><link>https://foojayio.github.io/website/today/gotta-code-em-all-how-java-evolved-beyond-verbosity-celebrating-30-years-of-pokemon/</link><pubDate>Fri, 27 Feb 2026 09:57:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/gotta-code-em-all-how-java-evolved-beyond-verbosity-celebrating-30-years-of-pokemon/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/gotta-code-em-all-how-java-evolved-beyond-verbosity-celebrating-30-years-of-pokemon/pokemon01-1024x640.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Happy 30th Anniversary to &lt;strong&gt;Pokémon&lt;/strong&gt;! 🎉&lt;/p&gt;
&lt;p&gt;February 27, 2026 marks exactly 30 years since the original Pokémon Red and Green launched in Japan on February 27, 1996. From catching your first Pokémon in Pallet Town to becoming Champion in the Indigo League, the franchise has spent three decades teaching millions of players about strategy, friendship, exploration, and constant improvement, evolving creatures, teams, and even entire generations of games.&lt;/p&gt;
&lt;p&gt;Pokémon is literally all about evolution and that same spirit of evolution perfectly matches what&amp;rsquo;s happening in Java right now.&lt;/p&gt;</description></item><item><title>A Visual Diff of Java’s Evolution: Inside java.evolved</title><link>https://foojayio.github.io/website/today/a-visual-diff-of-javas-evolution-inside-java-evolved/</link><pubDate>Fri, 20 Feb 2026 17:48:21 +0000</pubDate><guid>https://foojayio.github.io/website/today/a-visual-diff-of-javas-evolution-inside-java-evolved/</guid><description>&lt;p&gt;A community project called &lt;a href="https://javaevolved.github.io/" target="_blank" rel="noopener noreferrer"&gt;&lt;strong&gt;java.evolved&lt;/strong&gt;&lt;/a&gt;
 was recently launched to document how common Java coding patterns have changed across releases. Instead of explaining features in isolation, the site presents &amp;ldquo;before and after&amp;rdquo; examples: traditional idioms next to modern alternatives.&lt;/p&gt;
&lt;p&gt;The approach targets a practical problem. Most developers work in mixed-era codebases where Java 6, 8, and 17 styles coexist. Rather than memorizing new language features, the site shows what existing code would look like if written today.
&lt;img src="https://foojayio.github.io/website/today/a-visual-diff-of-javas-evolution-inside-java-evolved/Screenshot-2026-02-20-at-6.28.07-AM-700x446.png" alt="" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>What 2,000+ Professionals Told Us About the State of Java, AI, Cloud Costs, and the Future of the Java Ecosystem</title><link>https://foojayio.github.io/website/today/what-2000-professionals-told-us-about-the-state-of-java-ai-cloud-costs-and-the-future-of-the-java-ecosystem/</link><pubDate>Tue, 17 Feb 2026 08:58:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/what-2000-professionals-told-us-about-the-state-of-java-ai-cloud-costs-and-the-future-of-the-java-ecosystem/</guid><description>&lt;p&gt;Every year, I look forward to our &lt;a href="https://www.azul.com/state-of-java-2026?utm_medium=blog&amp;amp;utm_campaign=State-of-Java-2026&amp;amp;utm_source=web&amp;amp;utm_content=&amp;amp;utm_term=" target="_blank" rel="noopener noreferrer"&gt;State of Java Survey &amp;amp; Report&lt;/a&gt;
 because it gives us a view into how organizations are using Java today and where they&amp;rsquo;re heading next. This year, more than 2,000 Java professionals from around the world weighed in, and their message is clear:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Java is evolving faster than ever. AI is accelerating that shift. And the pressure to optimize cloud spending and avoid unpredictable Java licensing costs is now shaping strategic decisions across the enterprise.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Foojay Podcast #90: Highlights of the Java Features Between LTS 21 and 25</title><link>https://foojayio.github.io/website/today/foojay-podcast-90/</link><pubDate>Mon, 16 Feb 2026 07:32:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-90/</guid><description>&lt;p&gt;Every six months, we get a new version of Java. Java 26 is just around the corner and will be released soon. But most companies stick to LTS (Long-Term Support) versions, which are maintained and receive security updates for many more years. Versions 8, 11, 17, 21, and 25 are such LTS versions. Hopefully, most of your systems are already on the latest versions and you are not stuck on 8 or earlier. As a reminder, 8 was released in 2014, so much has changed since then.&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>Bringing Java Closer to Education: A Community-Driven Initiative</title><link>https://foojayio.github.io/website/today/bringing-java-closer-to-education-a-community-driven-initiative/</link><pubDate>Mon, 02 Feb 2026 18:02:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/bringing-java-closer-to-education-a-community-driven-initiative/</guid><description>&lt;p&gt;Over the past decades, Java has proven itself to be one of the most reliable, versatile, and widely used programming languages in the world. From enterprise systems to mobile applications and embedded devices, Java continues to evolve and adapt. Yet, one important area still holds enormous untapped potential: education.&lt;/p&gt;
&lt;p&gt;This initiative was born from a simple but powerful idea: to aggregate Java-related educational content in a way that helps newcomers get started, supports educators, and encourages new Java initiatives focused on learning. By making Java more accessible and visible in educational environments, we strengthen not only the language itself, but the entire ecosystem around it.&lt;/p&gt;</description></item><item><title>OpenJDK January 2026 Critical Patch Update and Patch Set Update Released</title><link>https://foojayio.github.io/website/today/openjdk-january-2026-critical-patch-update-and-patch-set-update-released/</link><pubDate>Wed, 21 Jan 2026 08:32:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/openjdk-january-2026-critical-patch-update-and-patch-set-update-released/</guid><description>&lt;p&gt;The January 2026 OpenJDK quarterly updates are now (or will soon be) available from various OpenJDK distributors. This quarterly release brings important security fixes and updates to all currently supported Java versions.&lt;/p&gt;
&lt;h2 id="h2-0-the-quarterly-update-cycle"&gt;The Quarterly Update Cycle&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Every three months&lt;/strong&gt; (in January, April, July, and October), the OpenJDK project releases &lt;strong&gt;security updates, bug fixes, and improvements&lt;/strong&gt; for &lt;strong&gt;all supported Java versions&lt;/strong&gt;. This predictable schedule helps organizations plan their Java updates and maintain secure, stable production environments.&lt;/p&gt;</description></item><item><title>The FFM API: How OpenJDK Changed the Game for Native Interactions (And Made Pi4J Better!)</title><link>https://foojayio.github.io/website/today/the-ffm-api-how-openjdk-changed-the-game-for-native-interactions-and-made-pi4j-better/</link><pubDate>Fri, 16 Jan 2026 08:18:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-ffm-api-how-openjdk-changed-the-game-for-native-interactions-and-made-pi4j-better/</guid><description>&lt;p&gt;The &lt;a href="https://www.pi4j.com/" target="_blank" rel="noopener noreferrer"&gt;Pi4J project&lt;/a&gt;
 is a Java library that allows you to control the GPIO pins and electronic components connected to a Raspberry Pi with pure Java code. It removes the complexity of using native libraries and the &lt;a href="https://www.baeldung.com/jni" target="_blank" rel="noopener noreferrer"&gt;Java Native Interface (JNI)&lt;/a&gt;
, allowing you to focus on your application logic.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;This is a crosspost from the article I contributed to &lt;a href="https://www.javaadvent.com/2025/12/ffm-api-for-java-on-raspberry-pi.html" target="_blank" rel="noopener noreferrer"&gt;this year&amp;rsquo;s JVM Advent&lt;/a&gt;
.&lt;/strong&gt;&lt;/em&gt;
&lt;img src="https://foojayio.github.io/website/today/the-ffm-api-how-openjdk-changed-the-game-for-native-interactions-and-made-pi4j-better/pi4j-overview-1024x427.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;In the Java Advent of 2020, I published &amp;ldquo;&lt;a href="https://www.javaadvent.com/2020/12/light-up-your-christmas-lights-with-java-and-raspberry-pi.html" target="_blank" rel="noopener noreferrer"&gt;Light up your Christmas lights with Java and Raspberry Pi&lt;/a&gt;
&amp;rdquo;, using Java 11 and Pi4J V1.2. Wow, things have changed a lot: this article uses Java 25 and a snapshot of the soon-to-be-released Pi4J V4!&lt;/p&gt;</description></item><item><title>The Ultimate 10 Years Java Garbage Collection Guide (2016–2026) - Choosing the Right GC for Every Workload</title><link>https://foojayio.github.io/website/today/the-ultimate-10-years-java-garbage-collection-guide-2016-2026-choosing-the-right-gc-for-every-workload/</link><pubDate>Thu, 15 Jan 2026 10:00:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-ultimate-10-years-java-garbage-collection-guide-2016-2026-choosing-the-right-gc-for-every-workload/</guid><description>&lt;p&gt;Memory management remains the primary factor for application performance in enterprise Java environments. Between 2017 and 2025, the ecosystem shifted from manual tuning to architectural selection. Industry data suggests that 60 percent of Java performance issues and 45 percent of production incidents in distributed systems stem from suboptimal Garbage Collection (GC) behavior. This guide provides a strategic framework for selecting collectors based on workload characteristics. It covers the transition from legacy collectors to Generational ZGC, analyzing trade-offs regarding throughput, latency, and hardware constraints with mathematical precision.&lt;/p&gt;</description></item><item><title>First Experiments with Java on the LattePanda IOTA: An Alternative to Raspberry Pi?</title><link>https://foojayio.github.io/website/today/first-experiments-with-java-on-the-lattepanda-iota/</link><pubDate>Thu, 11 Dec 2025 09:13:14 +0000</pubDate><guid>https://foojayio.github.io/website/today/first-experiments-with-java-on-the-lattepanda-iota/</guid><description>&lt;p&gt;After years of experimenting with Raspberry Pi boards, Java, JavaFX, and &lt;a href="https://www.pi4j.com/" target="_blank" rel="noopener noreferrer"&gt;Pi4J&lt;/a&gt;
 to control electronics, I wanted to explore whether my knowledge and experience could be applied to similar boards from other providers. There are many alternatives available these days, based on ARM, Intel processors, and RISC-V architectures.&lt;/p&gt;
&lt;p&gt;I reached out to several suppliers to see if I could get evaluation copies, and I&amp;rsquo;m happy to share that I received my first box from DFRobot containing the &lt;a href="https://www.dfrobot.com/product-2989.html" target="_blank" rel="noopener noreferrer"&gt;&lt;strong&gt;LattePanda IOTA&lt;/strong&gt;&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Java, What's Old? Part III - I/O</title><link>https://foojayio.github.io/website/today/java-whats-old-part-iii-i-o/</link><pubDate>Tue, 09 Dec 2025 08:23:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-whats-old-part-iii-i-o/</guid><description>&lt;p&gt;After Java, &lt;a href="https://foojayio.github.io/website/today/java-whats-old-part-i-collections/"&gt;What&amp;rsquo;s Old? Part I: Collections&lt;/a&gt;
 and &lt;a href="https://foojayio.github.io/website/today/java-whats-old-part-ii-utils/"&gt;Java, What&amp;rsquo;s Old? Part II: Utils&lt;/a&gt;
, let&amp;rsquo;s now have a look at less-known old input/output classes of the JDK that can still be useful.&lt;/p&gt;
&lt;p&gt;Everything in this series will be in Java 8 and later, so after reading this article, you will be able to use it in your projects.&lt;/p&gt;
&lt;h2 id="h2-0-scanner"&gt;Scanner&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html" target="_blank" rel="noopener noreferrer"&gt;Scanner&lt;/a&gt;
 is a class in &lt;code&gt;java.util&lt;/code&gt; package that helps you parse files and input stream.&lt;/p&gt;</description></item><item><title>foojay – a place for friends of OpenJDKJava 21+ on Raspberry Pi Zero 2 is Back In Business</title><link>https://foojayio.github.io/website/today/java-21-on-raspberry-pi-zero-2-is-back-in-business/</link><pubDate>Thu, 04 Dec 2025 08:46:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-21-on-raspberry-pi-zero-2-is-back-in-business/</guid><description>&lt;p&gt;As described before on &lt;a href="https://webtechie.be/post/2025-06-25-java-21-not-working-on-zero-2/" target="_blank" rel="noopener noreferrer"&gt;Java 21+ Not Working on Raspberry Pi Zero 2&lt;/a&gt;
, a problem appeared to execute Java code on the Raspberry Pi Zero 2 with OpenJDK 21 or higher. Reason: in OpenJDK 21 the Just-In-Time (JIT) compiler has been improved, but this change doesn&amp;rsquo;t work correctly on the ARM Cortex-A53 processor as used in the Zero 2. It&amp;rsquo;s another type of processor compared to, for instance, the Raspberry Pi 4 (Cortex-A72) and 5 (Cortex-A76).&lt;/p&gt;</description></item><item><title>Foojay Podcast 83: OpenJDK Evolutions plus Tips and Tricks</title><link>https://foojayio.github.io/website/today/foojay-podcast-83/</link><pubDate>Mon, 24 Nov 2025 06:07:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-83/</guid><description>&lt;p&gt;Welcome to another episode of the Foojay Podcast! Just like in the previous episode, I bring you conversations from two of Europe&amp;rsquo;s premier Java conferences - Devoxx in Belgium and JFall in the Netherlands.&lt;/p&gt;
&lt;p&gt;At these conferences, I had the opportunity to speak with members of the Java community about topics ranging from the evolution of Java itself to mobile development, performance optimization, and even automotive security.&lt;/p&gt;
&lt;p&gt;My first guest is Johan Vos, a Java Champion who takes us on a journey through Java&amp;rsquo;s history - from porting Java to Linux in 1995 to his current work on bringing Java and JavaFX to mobile and embedded devices through the Java On Mobile project.&lt;/p&gt;</description></item><item><title>Foojay Podcast #82: OpenJDK Projects (Leyden, Babylon, Panama) and TornadoVM</title><link>https://foojayio.github.io/website/today/foojay-podcast-82/</link><pubDate>Mon, 17 Nov 2025 07:35:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-82/</guid><description>&lt;p&gt;In this Foojay Podcast, we&amp;rsquo;re diving deep into some of the most exciting developments happening within the OpenJDK and TornadoVM projects.&lt;/p&gt;
&lt;p&gt;At the Devoxx and JFall conferences, we spoke with several speakers and visitors about some of the major themes shaping the future of Java development. The first guest is Moritz Halbritter from the Spring Engineering team. He provides us with more insights into Project Leyden and how it&amp;rsquo;s improving Java startup times through ahead-of-time compilation and profiling. We&amp;rsquo;ll learn how Spring Boot developers can already take advantage of these improvements today.&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 #7</title><link>https://foojayio.github.io/website/today/jc-ai-newsletter-7/</link><pubDate>Tue, 14 Oct 2025 05:35:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/jc-ai-newsletter-7/</guid><description>&lt;p&gt;&lt;strong&gt;Fourteen days have passed, and it is time to present a fresh collection of readings that could influence developments in the field of artificial intelligence.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Beyond focused tutorials that can enhance your understanding of AI applications, this newsletter concentrates on Hallucination, Java Code Generation, Testing, Agentic System Architecture and LLM benchmarking methodologies designed to ensure models accuracy and competency in handling complex contextual information.&lt;/p&gt;
&lt;p&gt;The world influenced by LLM is changing very quickly, let&amp;rsquo;s start&amp;hellip;&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>Design Patterns Update to JDK25</title><link>https://foojayio.github.io/website/today/design-patterns-update-to-jdk25/</link><pubDate>Wed, 24 Sep 2025 11:29:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/design-patterns-update-to-jdk25/</guid><description>&lt;p&gt;&lt;strong&gt;T&lt;/strong&gt; he information technology landscape is changing rapidly. This is not only due to the utilization of AI and &lt;a href="https://foojayio.github.io/website/today/stochastic-ai-agility-breaking-cycles-of-debt/" title="new methodologies"&gt;new methodologies [8]&lt;/a&gt;
, or business requirements trying to keep up, but also because of the incremental complexity of expected solutions.&lt;/p&gt;
&lt;p&gt;Statistics and probability are slowly beginning to play a very important role in this evolution. The Java ecosystem has proven its maturity many times by delivering essential features that businesses require, although many may argue that these have been inspired by other existing solutions.&lt;/p&gt;</description></item><item><title>Here's Java 25, Ready to Perform to the Limit</title><link>https://foojayio.github.io/website/today/heres-java-25-ready-to-perform-to-the-limit/</link><pubDate>Tue, 16 Sep 2025 06:05:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/heres-java-25-ready-to-perform-to-the-limit/</guid><description>&lt;p&gt;It&amp;rsquo;s been six months since Java 24 was released, so it&amp;rsquo;s time for a fresh set of new Java features.&lt;/p&gt;
&lt;p&gt;And the feature that immediately grabs the attention this time is &lt;em&gt;stable values&lt;/em&gt;, taking Java&amp;rsquo;s support of immutability to the next level. Also, Java&amp;rsquo;s focus on improving performance intensifies, as more JEPs emerge from Project Leyden. On top of that, the Java Flight Recorder is now more equipped than ever to tackle performance issues!&lt;/p&gt;</description></item><item><title>Research: Measuring Energy Consumption in Programming Languages for AI Applications</title><link>https://foojayio.github.io/website/today/research-measuring-energy-consumption-in-programming-languages-for-ai-applications/</link><pubDate>Mon, 15 Sep 2025 07:03:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/research-measuring-energy-consumption-in-programming-languages-for-ai-applications/</guid><description>&lt;p&gt;&lt;strong&gt;Decades ago, I contributed to a very interesting project called &lt;a href="https://sunspotdev.org/#" title="SunSPOT " target="_blank" rel="noopener noreferrer"&gt;SunSPOT&lt;/a&gt;
at SUN Microsystems. It was a small device with wireless connectivity, built-in sensors, running on Java (compatible with runtime 1.6), and powered by battery. It enabled the design of small applications and the connection of additional hardware, or simply the utilization of available sensors. Later, together with Markus Hirt, we created the &lt;a href="https://github.com/Robo4J/robo4j" title="Robo4j framework" target="_blank" rel="noopener noreferrer"&gt;Robo4j framework&lt;/a&gt;
. A small and lightweight Java framework that enables rapid assembly of robots or other IoT systems (JDK 21+). In Robo4j, we primarily used the&lt;a href="https://www.pi4j.com/blog/" title=" Pi4j project" target="_blank" rel="noopener noreferrer"&gt;Pi4j project&lt;/a&gt;
 for handling I/O operations on the Raspberry Pi platform with drivers created for specific hardware.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Taking Java Arrays to Another Dimension</title><link>https://foojayio.github.io/website/today/taking-java-arrays-to-another-dimension/</link><pubDate>Fri, 29 Aug 2025 12:53:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/taking-java-arrays-to-another-dimension/</guid><description>&lt;p&gt;&lt;em&gt;Explore the intricacies of Java&amp;rsquo;s multidimensional arrays with this in-depth guide. Learn how to declare, initialize, and utilize arrays of Java arrays to manage complex data structures effectively. In this blog post, Azul Deputy CTO Simon Ritter explains how to leverage multidimensional arrays as a tool to do even more.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Java, along with many other programming languages, includes the concept of arrays. An array is an object that contains a number of variables. Since an array is itself an object, the variables in an array can also be arrays, which leads us to the idea of multidimensional arrays.&lt;/p&gt;</description></item><item><title>Why Java is Still Worth Learning in 2025: A Developer's 25-Year Journey</title><link>https://foojayio.github.io/website/today/why-java-is-still-worth-learning-in-2025-a-developers-25-year-journey/</link><pubDate>Mon, 04 Aug 2025 06:32:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-java-is-still-worth-learning-in-2025-a-developers-25-year-journey/</guid><description>&lt;h3 id="h3-0-i-ll-be-honest-my-first-encounter-with-java-in-1999-wasn-t-love-at-first-sight-it-was-during-a-university-distributed-systems-course-and-coming-from-a-background-in-assembler-and-c-java-felt-bloated-slow-and-frankly-untrustworthy-that-automatic-memory-handling-seemed-like-dangerous-magic-i-couldn-t-control-after-years-of-meticulously-tracking-every-allocated-memory-block-the-idea-that-the-runtime-would-handle-memory-management-felt-like-giving-up-control-to-forces-i-didn-t-understand"&gt;I&amp;rsquo;ll be honest - my first encounter with Java in 1999 wasn&amp;rsquo;t love at first sight. It was during a university distributed systems course, and coming from a background in assembler and C, Java felt bloated, slow, and frankly untrustworthy. That &amp;ldquo;automatic memory handling&amp;rdquo; seemed like dangerous magic I couldn&amp;rsquo;t control. After years of meticulously tracking every allocated memory block, the idea that the runtime would handle memory management felt like giving up control to forces I didn&amp;rsquo;t understand.&lt;/h3&gt;
&lt;p&gt;For the first eight years of my career, I stubbornly stuck with C, convinced that Java was just a passing trend for developers who couldn&amp;rsquo;t handle &amp;ldquo;real&amp;rdquo; programming.&lt;/p&gt;</description></item><item><title>Java, What's Old? Part II: Utils</title><link>https://foojayio.github.io/website/today/java-whats-old-part-ii-utils/</link><pubDate>Wed, 30 Jul 2025 08:48:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-whats-old-part-ii-utils/</guid><description>&lt;p&gt;After &lt;a href="https://foojayio.github.io/website/today/java-whats-old-part-i-collections/"&gt;Java, What&amp;rsquo;s Old? Part I - Collections&lt;/a&gt;
, let&amp;rsquo;s now have a look at less known old utility classes that can still be useful.&lt;/p&gt;
&lt;p&gt;Everything in this series will be in Java 8 and later, so after reading this article, you will be able to use it in your projects.&lt;/p&gt;
&lt;h2 id="h2-0-objects"&gt;Objects&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://docs.oracle.com/javase/8/docs/api/java/util/Objects.html" target="_blank" rel="noopener noreferrer"&gt;Objects&lt;/a&gt;
 (with a s) is a utility class from the &lt;code&gt;java.util&lt;/code&gt; package that contains static methods to make your code more readable. Do not confuse it with the &lt;code&gt;Object&lt;/code&gt; (without s) class of the &lt;code&gt;java.lang&lt;/code&gt; package.&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>Foojay Podcast #75: JCON Report, Part 4 - Tips and Tricks for Java Devs</title><link>https://foojayio.github.io/website/today/foojay-podcast-75/</link><pubDate>Mon, 14 Jul 2025 06:47:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-75/</guid><description>&lt;p&gt;&lt;strong&gt;This is the final part of the JCON 2025 interviews with a lot of tips and tricks!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the three previous podcasts, we featured interviews from the JCON conference on &amp;ldquo;&lt;a href="https://foojayio.github.io/website/today/foojay-podcast-72/"&gt;Being a better Java developer&lt;/a&gt;
,&amp;rdquo; &amp;ldquo;&lt;a href="https://foojayio.github.io/website/today/foojay-podcast-72/"&gt;Evolutions in Java&lt;/a&gt;
,&amp;rdquo; and &amp;ldquo;&lt;a href="https://foojayio.github.io/website/today/foojay-podcast-73/"&gt;How to use AI with Java&lt;/a&gt;
.&amp;rdquo; However, we talked to many more people during the conference, so this podcast focuses on tips and tricks. Let&amp;rsquo;s learn from the many other experienced visitors of JCON.&lt;/p&gt;</description></item><item><title>Clean and Modular Java: A Hexagonal Architecture Approach</title><link>https://foojayio.github.io/website/today/clean-and-modular-java-a-hexagonal-architecture-approach/</link><pubDate>Tue, 24 Jun 2025 08:03:50 +0000</pubDate><guid>https://foojayio.github.io/website/today/clean-and-modular-java-a-hexagonal-architecture-approach/</guid><description>&lt;p&gt;One of the discussions that always leaves me with both doubts and excitement is the one about system architecture. Ever since I started diving deeper into programming, I&amp;rsquo;ve encountered questions like how to separate packages and modules: is it really worth creating so many divisions? I must admit, it&amp;rsquo;s often complicated to understand or make decisions without being fully sure that I&amp;rsquo;m doing the right thing.&lt;/p&gt;
&lt;p&gt;Right from the start, I want to make it clear that this content will definitely spark a lot of discussion around best practices and whether what I&amp;rsquo;m doing is correct &amp;mdash; but, above all, I guarantee it will be fun!&lt;/p&gt;</description></item><item><title>Java, What's Old? Part I: Collections</title><link>https://foojayio.github.io/website/today/java-whats-old-part-i-collections/</link><pubDate>Thu, 19 Jun 2025 08:31:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-whats-old-part-i-collections/</guid><description>&lt;p&gt;A few weeks ago, I had the honor to present at the &lt;a href="https://www.meetup.com/nl-NL/arnhemjug/" target="_blank" rel="noopener noreferrer"&gt;Arnhem JUG&lt;/a&gt;
 in the Netherlands about &amp;ldquo;Java, What&amp;rsquo;s old?&amp;rdquo; In this series, I&amp;rsquo;m focusing on what&amp;rsquo;s old in the JDK, not that known, and can be useful. A few hidden gems in the JDK.&lt;/p&gt;
&lt;p&gt;Everything in this series is in Java 8 and earlier. So after reading this article, you will be able to use it in your projects.&lt;/p&gt;</description></item><item><title>Foojay Podcast #73: JCon Report, Part 2 – Evolutions in the Java language and runtime</title><link>https://foojayio.github.io/website/today/foojay-podcast-73/</link><pubDate>Mon, 16 Jun 2025 07:42:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-73/</guid><description>&lt;p&gt;In the second part of our JCON interviews, recorded at the conference in May, we focuses on general evolutions within the Java world and how they influence how we write code and develop applications. We take a look back at the history of Java, discuss new features in the latest release, how Java evolves with OpenJDK projects and JEPS, how Java is used in education, and much more&amp;hellip;&lt;/p&gt;
&lt;h2 id="h2-0-video"&gt;Video&lt;/h2&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/T9_5LYsFZn8?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-podcast-apps"&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>Java’s Structured Concurrency: Finally Finding Its Footing</title><link>https://foojayio.github.io/website/today/javas-structured-concurrency-finally-finding-its-footing/</link><pubDate>Wed, 04 Jun 2025 12:21:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/javas-structured-concurrency-finally-finding-its-footing/</guid><description>&lt;p&gt;The structured concurrency API changed again after two incubations and four rounds of previews.&lt;/p&gt;
&lt;p&gt;Ideally, this scenario is unexpected.&lt;/p&gt;
&lt;p&gt;However, given its status as a preview API, such changes can occur, as was the case here.&lt;/p&gt;
&lt;p&gt;These changes lend considerable maturity to the API, and I am hopeful it will now stabilize without requiring further modifications.&lt;/p&gt;
&lt;h3 id="h3-0-what-actually-changed-this-time"&gt;&lt;strong&gt;What Actually Changed This Time&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;When I first started working with structured concurrency back in its incubation phase, I was excited about the promise of cleaner concurrent code.&lt;/p&gt;</description></item><item><title>Foojay Podcast #71: Celebrating 30 Years of Java with James Gosling</title><link>https://foojayio.github.io/website/today/foojay-podcast-71/</link><pubDate>Mon, 05 May 2025 06:55:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-71/</guid><description>&lt;p&gt;&lt;strong&gt;We are celebrating Java&amp;rsquo;s 30th anniversary this May!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is a very special anniversary episode of the Foojay Podcast! As we approach May 23rd, marking exactly 30 years since Java&amp;rsquo;s first beta release in 1995, we&amp;rsquo;re honored to present our first-ever single-guest podcast. But we have a very special guest for you: James Gosling, the creator of Java!&lt;/p&gt;
&lt;p&gt;Join us for this exclusive conversation as we explore Java&amp;rsquo;s beginnings, its revolutionary impact on the programming world, its continuous evolution over three decades, and James&amp;rsquo;s insights on where the language is heading. From that groundbreaking beta release over &amp;ldquo;Write Once, Run Anywhere&amp;rdquo; to powering billions of devices worldwide, this is the story of Java, told by the man who started it all, the father of Java.&lt;/p&gt;</description></item><item><title>Async file IO with Java and io_uring</title><link>https://foojayio.github.io/website/today/async-file-io-with-java-and-io_uring/</link><pubDate>Fri, 18 Apr 2025 09:28:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/async-file-io-with-java-and-io_uring/</guid><description>&lt;p&gt;When I first started exploring Virtual Threads in Java, I wanted to understand everything about them like, performance characteristics, when they yield, and limitations. This journey led me to an interesting challenge about file I/O operations. These operations cause Virtual Threads to become &amp;ldquo;pinned&amp;rdquo; to platform threads, limiting their effectiveness for I/O-heavy applications.&lt;/p&gt;
&lt;p&gt;This pinning issue has been widely acknowledged across the Java community. It&amp;rsquo;s mentioned in the Virtual Threads &lt;a href="https://openjdk.org/jeps/425" target="_blank" rel="noopener noreferrer"&gt;JEP&lt;/a&gt;
, discussed on &lt;a href="https://www.reddit.com/r/java/comments/1h0cr5g/comment/lz3lv11/" target="_blank" rel="noopener noreferrer"&gt;Reddit threads&lt;/a&gt;
, debated on &lt;a href="https://mail.openjdk.org/pipermail/loom-dev/2024-June/006638.html" target="_blank" rel="noopener noreferrer"&gt;mailing lists&lt;/a&gt;
, and highlighted in the &amp;ldquo;&lt;a href="https://cr.openjdk.org/~rpressler/loom/loom/sol1_part1.html" target="_blank" rel="noopener noreferrer"&gt;State of Loom&lt;/a&gt;
&amp;rdquo;. The consistent message: File I/O and Virtual Threads don&amp;rsquo;t play nicely together.&lt;/p&gt;</description></item><item><title>Six JDK 24 Features You Should Know About</title><link>https://foojayio.github.io/website/today/six-jdk-24-features-you-should-know-about/</link><pubDate>Thu, 03 Apr 2025 08:42:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/six-jdk-24-features-you-should-know-about/</guid><description>&lt;p&gt;&lt;em&gt;Since 2018, we&amp;rsquo;ve had a new release of the Java platform every six months. With Swiss watch-like regularity, the latest version of Java is upon us. This time it&amp;rsquo;s JDK 24. In an almost poetic way, it contains 24 JDK Enhancement Proposals (JEPs).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;JDK 24, which was released on March 18, 2025, has 24 JDK Enhancement Proposals (JEPs), the largest number of new features since the introduction of the time-based release schedule. While 10 of them are preview features, incubator modules, or experimental, that still leaves 14 new features.&lt;/p&gt;</description></item><item><title>Clean your Memory: From Finalize to Cleaner</title><link>https://foojayio.github.io/website/today/clean-memory-from-finalize-to-cleaner/</link><pubDate>Mon, 31 Mar 2025 12:30:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/clean-memory-from-finalize-to-cleaner/</guid><description>&lt;p&gt;Garbage collection in Java takes care of memory management, but it does not clean up non-memory resources like sockets or file handles.&lt;/p&gt;
&lt;p&gt;Resource leaks may occur without proper management, leading to performance degradation or crashes.&lt;/p&gt;
&lt;p&gt;Java&amp;rsquo;s &lt;a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/ref/Cleaner.html" target="_blank" rel="noopener noreferrer"&gt;Cleaner API&lt;/a&gt;
, introduced in Java 9, provides a modern and efficient mechanism for resource cleanup when objects are no longer reachable.&lt;/p&gt;
&lt;p&gt;It addresses the shortcomings of the deprecated finalize() method, offering a predictable and efficient way to manage non-memory resources: so let&amp;rsquo;s take a short trip on clean memory from finalize to Cleaner API.&lt;/p&gt;</description></item><item><title>Foojay Podcast #68: Welcome to OpenJDK (Java) 24</title><link>https://foojayio.github.io/website/today/foojay-podcast-68/</link><pubDate>Mon, 17 Mar 2025 06:44:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-68/</guid><description>&lt;p&gt;We serve you a podcast about the new Java version every six months.&lt;/p&gt;
&lt;p&gt;Our regular guest, Simon Ritter, Deputy CTO of Azul, is known on social media as &amp;ldquo;speakjava.&amp;rdquo; He is part of the OpenJDK vulnerability group, JCP executive committee, and expert group for the Java SE specification request so that he can share a lot of inside information with us.&lt;/p&gt;
&lt;p&gt;In this episode, we are joined by Hanno Embregts, a Java Developer by day and musician by night. He publishes a post on Foojay with all the details of every new Java release and prepared a long description of all the new features included in Java 24.&lt;/p&gt;</description></item><item><title>Project Loom: Structured Concurrency - Java</title><link>https://foojayio.github.io/website/today/project-loom-structured-concurrency-java/</link><pubDate>Wed, 29 Jan 2025 12:12:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/project-loom-structured-concurrency-java/</guid><description>&lt;p&gt;In today&amp;rsquo;s era of cloud computing, where high-performance infrastructure is readily available, developers face a complex challenge in achieving efficient concurrency.&lt;/p&gt;
&lt;p&gt;While modern technological advancements have brought us closer to solving these challenges, we must adopt a thoughtful, incremental approach to concurrency.&lt;/p&gt;
&lt;p&gt;This principle holds especially true as we strive to design scalable, reliable, and easy-to-maintain systems.&lt;/p&gt;
&lt;p&gt;One such advancement in this domain is &lt;em&gt;structured concurrency&lt;/em&gt;, a paradigm that simplifies concurrent programming by bringing order and predictability to task management.&lt;/p&gt;</description></item><item><title>How JVM handles exceptions</title><link>https://foojayio.github.io/website/today/how-jvm-handles-exceptions/</link><pubDate>Tue, 21 Jan 2025 14:45:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-jvm-handles-exceptions/</guid><description>&lt;p&gt;&lt;strong&gt;It&amp;rsquo;s interesting to know how the JVM runs bytecode instructions&amp;hellip; But do you know what is going on when an exception is thrown? How does the JVM handle the delegation of control? What does it look like in the bytecode?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Let me quickly show you!&lt;/p&gt;
&lt;h3 id="h3-0-example"&gt;Example&lt;/h3&gt;
&lt;p&gt;Here&amp;rsquo;s a simple bit of Java code that includes all the important actors in the exception-throwing game (try-catch-finally):&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="generic"&gt;int a = 0;
try {
 if (a == 0) { // to make it less boring, let's have some branching logic
 throw new Exception("Exception message!");
 }
} catch (Exception e) {
 doSomethingOnException();
} finally {
 doSomethingFinally();
}&lt;/pre&gt;
&lt;h3 id="h3-1-exception-table"&gt;Exception table&lt;/h3&gt;
&lt;p&gt;The resulting bytecode includes an interesting section in the Code attribute called the Exception table. Each method can have its own exception table, and it&amp;rsquo;s only present when relevant. If there is no exception-handling logic in the method, it won&amp;rsquo;t have an exception table.&lt;/p&gt;</description></item><item><title>Foojay Podcast #64: Interviews at JFall about opensource, OpenJDK evolutions, Project Loom, JVM,...</title><link>https://foojayio.github.io/website/today/foojay-podcast-64/</link><pubDate>Mon, 23 Dec 2024 10:51:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-64/</guid><description>&lt;p&gt;Let&amp;rsquo;s wrap up this year with more interviews from the JFall conference.&lt;/p&gt;
&lt;p&gt;In this episode you&amp;rsquo;ll learn more about Foojay, JVM internals and writing your own programming language, Project Loom and structured concurrency, learning at conferences, code reviews, creating desktop applications with Java, infrastructure as code, JUG Noord, and much more!&lt;/p&gt;
&lt;h2 id="h2-0-video"&gt;Video&lt;/h2&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/kx6DfVE-I0o?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-podcast-apps"&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>Foojay Podcast #63: How do we keep your Java applications up to date and secure?</title><link>https://foojayio.github.io/website/today/foojay-podcast-63/</link><pubDate>Mon, 16 Dec 2024 12:41:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-63/</guid><description>&lt;h2 id="h2-0-last-month-i-published-a-foojay-article-about-the-risks-in-systems-that-are-stuck-on-old-or-outdated-java-versions-and-got-a-lot-of-feedback-from-developers-most-of-them-want-to-move-on-but-get-stuck-on-management-decisions-outdated-production-environments-or-one-of-the-many-other-reasons-that-keep-systems-stuck-on-old-java-versions-and-dependencies"&gt;Last month, I published a Foojay article about &lt;a href="https://foojayio.github.io/website/today/why-java-8-is-a-ticking-time-bomb-hiding-within-your-organization/"&gt;the risks in systems that are stuck on old or outdated Java versions&lt;/a&gt;
 and got &lt;a href="https://foojayio.github.io/website/today/how-organizations-became-stuck-on-outdated-java-versions/"&gt;a lot of feedback from developers&lt;/a&gt;
. Most of them want to move on but get stuck on management decisions, outdated production environments, or one of the many other reasons that keep systems stuck on old Java versions and dependencies.&lt;/h2&gt;
&lt;p&gt;Do you want to bring your system from Java 8 to 23? Did you know that Java 17 already has 13 security releases? And that you can use tools like OpenRewrite to help you update your code?&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>Hot Class Reload in Java: A Webpack HMR-Like Experience</title><link>https://foojayio.github.io/website/today/hot-class-reload-in-java-a-webpack-hmr-like-experience-for-java-developers/</link><pubDate>Tue, 19 Nov 2024 15:57:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/hot-class-reload-in-java-a-webpack-hmr-like-experience-for-java-developers/</guid><description>&lt;p&gt;&lt;strong&gt;In the world of software development, time is everything. Every developer knows the frustration of waiting for a full application restart just to see a small change take effect.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Java developers, in particular, have long dealt with this issue. But what if you didn&amp;rsquo;t have to stop and restart every time you updated a class? Enter &lt;strong&gt;Hot Class Reload (HCR)&lt;/strong&gt; in Java&amp;mdash;a technique that can keep you in the flow, reloading classes on the fly, much like &lt;strong&gt;Hot Module Reload (HMR)&lt;/strong&gt; does in JavaScript.&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>JDK 23: Module Design Pattern with JEP-476</title><link>https://foojayio.github.io/website/today/exploring-new-features-in-jdk-23-module-design-pattern-with-jep-476/</link><pubDate>Thu, 31 Oct 2024 09:41:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/exploring-new-features-in-jdk-23-module-design-pattern-with-jep-476/</guid><description>&lt;p&gt;Although the module design pattern can be implemented in many different ways, the main motivation behind using it remains the same. This is the isolation of a specific section into small building blocks, which are the so-called modules. Therefore, the module design pattern belongs to the structural design pattern family.&lt;/p&gt;
&lt;p&gt;Before Java 9, each project using the module design pattern at any level was a bit difficult and many times broken. Such a situation had a direct impact on source code maintainability and event extensibility, as it was very easy to break module boundaries. Many times this state has been called a bit like &amp;ldquo;classpath hell&amp;rdquo;. In order to avoid such a situation, it was necessary to preserve the coding discipline.&lt;/p&gt;</description></item><item><title>Learn About How Your Peers Use Java!</title><link>https://foojayio.github.io/website/today/learn-about-how-your-peers-use-java/</link><pubDate>Thu, 24 Oct 2024 12:44:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/learn-about-how-your-peers-use-java/</guid><description>&lt;p&gt;&lt;strong&gt;Do you ever wonder what OpenJDK distributions and what Java versions your peers are using? Java-based infrastructures and languages? How many are using Java to code AI functionality? How Java workloads are affecting cloud compute costs?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.azul.com/" target="_blank" rel="noopener noreferrer"&gt;Azul&lt;/a&gt;
 has been gathering all that data from a survey of Java users, running until 6:30pm CT on October 31, 2024. If you want to participate, the survey is short, and we&amp;rsquo;ll hook you up with the report after the survey is complete in January 2025.
&lt;a href="https://survey.alchemer.com/s3/8032225/Foo" target="_blank" rel="noopener noreferrer"&gt;&lt;img src="https://foojayio.github.io/website/today/learn-about-how-your-peers-use-java/dimresearch-1024x557.png" alt="" loading="lazy"&gt;
&lt;/a&gt;
&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>Deep dive into bits, bytes, shorts, ints, longs, signed, and unsigned with Java</title><link>https://foojayio.github.io/website/today/deep-dive-into-bits-bytes-shorts-ints-longs-signed-and-unsigned-with-java/</link><pubDate>Fri, 18 Oct 2024 13:54:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/deep-dive-into-bits-bytes-shorts-ints-longs-signed-and-unsigned-with-java/</guid><description>&lt;p&gt;On the Pi4J discussion list, someone recently asked what the &lt;a href="https://github.com/Pi4J/pi4j-v2/discussions/379" target="_blank" rel="noopener noreferrer"&gt;best and easiest way is in Java to convert a byte value&lt;/a&gt;
. In Java, there is no distinction between signed and unsigned bytes, which can be confusing. My book &lt;a href="https://webtechie.be/books/" target="_blank" rel="noopener noreferrer"&gt;&amp;ldquo;Getting Started with Java on the Raspberry Pi&amp;rdquo;&lt;/a&gt;
 contains an explanation about this, and I am happy to share it in this post with some more info and code examples&amp;hellip;&lt;/p&gt;</description></item><item><title>Foojay Podcast #58: How Java Developers Can Secure Their Code</title><link>https://foojayio.github.io/website/today/foojay-podcast-58/</link><pubDate>Mon, 30 Sep 2024 07:43:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-58/</guid><description>&lt;p&gt;Three years after Log4Shell caused a significant security issue, we still struggle with insecure dependencies and injection problems.&lt;/p&gt;
&lt;p&gt;In this podcast, we&amp;rsquo;ll discuss how developers can secure their code.&lt;/p&gt;
&lt;p&gt;I talked with three authors who posted a security and code quality post on Foojay.io.&lt;/p&gt;
&lt;h2 id="h2-0-video"&gt;Video&lt;/h2&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/sRVcqILDuSo?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-podcast-apps"&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>Azul Brings Java from Edge to Cloud</title><link>https://foojayio.github.io/website/today/azul-brings-java-from-edge-to-cloud/</link><pubDate>Fri, 27 Sep 2024 11:30:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/azul-brings-java-from-edge-to-cloud/</guid><description>&lt;p&gt;In Part 1 of this series, &amp;ldquo;&lt;a href="https://foojayio.github.io/website/today/a-fresh-look-at-embedded-java/"&gt;A Fresh Look at Embedded Java&lt;/a&gt;
,&amp;rdquo; we explored the use of Java for embedded use cases.&lt;/p&gt;
&lt;p&gt;Azul and its Zulu Build of OpenJDK (Zulu) are the ideal partners in this part of the software world.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s expand and look at the cloud part of a typical end-to-end solution with sensors, edge devices, client applications, and cloud services.
&lt;img src="https://foojayio.github.io/website/today/azul-brings-java-from-edge-to-cloud/edge-diagram.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;h2 id="Azul-Platform-Core-for-Edge-Devices-and-Client-Applications"&gt;Azul Platform Core for edge devices and client applications&lt;/h2&gt;
&lt;p&gt;Because Java delivers fast development speed thanks to its amazing methods and tools and its impressive performance in handling massive amounts of data, it&amp;rsquo;s the ideal programming language for building applications for edge devices that collect data from various sensors.&lt;/p&gt;</description></item><item><title>Java 23 Has Arrived, And It Brings a Truckload of Changes</title><link>https://foojayio.github.io/website/today/java-23-has-arrived-and-it-brings-a-truckload-of-changes/</link><pubDate>Tue, 17 Sep 2024 06:45:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-23-has-arrived-and-it-brings-a-truckload-of-changes/</guid><description>&lt;p&gt;Java 23 has arrived! It&amp;rsquo;s been six months since Java 22 was released, so it&amp;rsquo;s time for a fresh truckload of JEPs.&lt;/p&gt;
&lt;p&gt;In this article, we take you on a tour of everything that is part of this release, giving you a brief introduction to each of them.&lt;/p&gt;
&lt;p&gt;Where applicable the differences with Java 22 are highlighted and a few typical use cases are provided, so that you&amp;rsquo;ll be more than ready to start using these features after reading this.&lt;/p&gt;</description></item><item><title>Foojay Podcast #57: Welcome to OpenJDK 23</title><link>https://foojayio.github.io/website/today/foojay-podcast-57/</link><pubDate>Mon, 16 Sep 2024 11:34:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-57/</guid><description>&lt;p&gt;OpenJDK (Java) 23 is (almost) here!&lt;/p&gt;
&lt;p&gt;OpenJDK 23 introduces three new features to the language and runtime and many bug fixes, small improvements, and a longer list of preview features.&lt;/p&gt;
&lt;p&gt;What are the most important facts about this release? Let&amp;rsquo;s find out&amp;hellip;&lt;/p&gt;
&lt;h2 id="h2-0-video"&gt;Video&lt;/h2&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/7PGOhbiPoRY?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-podcast-apps"&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>A Fresh Look at Embedded Java</title><link>https://foojayio.github.io/website/today/a-fresh-look-at-embedded-java/</link><pubDate>Wed, 11 Sep 2024 07:37:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/a-fresh-look-at-embedded-java/</guid><description>&lt;p&gt;&lt;strong&gt;Since its inception, Java has promised to &amp;ldquo;Write Once, Run Anywhere.&amp;rdquo; In its early days, the main focus of Java was embedded devices, such as set-top boxes and televisions.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;But soon, it became one of the leading programming languages powering high-scale business applications that can handle massive amounts of transactions with high throughput.&lt;/p&gt;
&lt;p&gt;Because those use cases are very visible and there are a lot of job opportunities within that area, we tend to forget that Java on embedded is also still very much alive and kicking!
&lt;img src="https://foojayio.github.io/website/today/a-fresh-look-at-embedded-java/fresh-look-embedded-java-1024x400.png" alt="" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>Top Security Flaws hiding in your code right now</title><link>https://foojayio.github.io/website/today/top-security-flaws-hiding-in-your-code-right-now-and-how-to-fix-them/</link><pubDate>Thu, 05 Sep 2024 16:41:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/top-security-flaws-hiding-in-your-code-right-now-and-how-to-fix-them/</guid><description>&lt;h3 id="h3-0-recent-years-have-seen-numerous-injection-attacks-causing-significant-damage-including-a-2019-sql-injection-breach-in-the-fortnite-video-game-and-a-2018-attack-on-tesla-s-systems"&gt;Recent years have seen numerous injection attacks causing significant damage, including a 2019 SQL injection breach in the Fortnite video game and a 2018 attack on Tesla&amp;rsquo;s systems.&lt;/h3&gt;
&lt;p&gt;Other serious incidents involve the Log4Shell logging injection and a deserialization attack on Atlassian Jira. These examples show that various code vulnerabilities can affect any organization. This article will examine the three most common attack types&amp;mdash;SQL injection, Deserialization Injection, and Logging Injection&amp;mdash;and discuss ways to prevent them.&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>Trash Pandas Love Enterprise Java Garbage Code</title><link>https://foojayio.github.io/website/today/trash-pandas-love-enterprise-java-garbage-code/</link><pubDate>Tue, 13 Aug 2024 08:16:55 +0000</pubDate><guid>https://foojayio.github.io/website/today/trash-pandas-love-enterprise-java-garbage-code/</guid><description>&lt;p&gt;&lt;strong&gt;If raccoons were software engineers, they would feel at home inside many enterprise systems. These systems are often full of unused and dead code that was written, fully tested, then altered in a way that prevents teams from ever running it.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This garbage code &amp;mdash; a raccoon&amp;rsquo;s favorite &amp;mdash; is a maintenance burden that developers must work around to keep passing tests while other major changes are made. This code often doesn&amp;rsquo;t end up in the trash because it&amp;rsquo;s hard to know what can be safely removed without breaking the application. But you can better identify bad code if you understand how to look for it.&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>JUG PH: 1-Day Modern Java Development Bootcamp</title><link>https://foojayio.github.io/website/today/jug-ph-1-day-modern-java-development-bootcamp/</link><pubDate>Fri, 02 Aug 2024 07:53:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/jug-ph-1-day-modern-java-development-bootcamp/</guid><description>&lt;p&gt;&lt;strong&gt;A 1-Day Modern Java Bootcamp for students, early professionals and career shifters with minimal Java programming or general programming experience.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The Java User Group Philippines (JUG PH) in partnership with Developer Connect (DEVCON) Philippines/Manila executed its 1st Modern Java Development Bootcamp.&lt;/p&gt;
&lt;p&gt;The bootcamp was organized by the JUG Leaders and Volunteers and DEVCON Volunteers.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/jug-ph-1-day-modern-java-development-bootcamp/java-bootcamp-2024-1-510x510.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;h2 id="h2-0-registration"&gt;Registration&lt;/h2&gt;
&lt;p&gt;The bootcamp received an overwhelming &lt;strong&gt;110+ registrations&lt;/strong&gt; but 50 was only accomodated due to the slots of the venue.&lt;/p&gt;</description></item><item><title>Understanding JVM Memory Layout with OpenJDK24's New PrintMemoryMapAtExit VM Option</title><link>https://foojayio.github.io/website/today/understanding-jvm-memory-layout-with-openjdk24s-new-printmemorymapatexit-vm-option/</link><pubDate>Sat, 27 Jul 2024 10:38:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/understanding-jvm-memory-layout-with-openjdk24s-new-printmemorymapatexit-vm-option/</guid><description>&lt;p&gt;&lt;strong&gt;OpenJDK24 recently added a new HotSpot JVM option called &lt;code&gt;PrintMemoryMapAtExit&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I know this because I&amp;rsquo;m the maintainer of a project called VMOptionsExplorer, whose job is to track changes to the more than 2000 command line options you can use to control the Java Virtual Machine (JVM).&lt;/p&gt;
&lt;p&gt;VMOptionsExplorer presents this information as a searchable online dictionary of VM options available at &lt;a href="https://chriswhocodes.com" target="_blank" rel="noopener noreferrer"&gt;https://chriswhocodes.com&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/understanding-jvm-memory-layout-with-openjdk24s-new-printmemorymapatexit-vm-option/vmoe-700x329.png" alt="A screenshot of the VMOptionsExplorer website" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;and also on Foojay at &lt;a href="https://foojayio.github.io/website/command-line-arguments/"&gt;https://foojay.io/command-line-arguments/&lt;/a&gt;
 (although the Foojay copy doesn&amp;rsquo;t always cover the latest JDKs).&lt;/p&gt;</description></item><item><title>Effective Java Logging</title><link>https://foojayio.github.io/website/today/effective-java-logging/</link><pubDate>Mon, 22 Jul 2024 11:39:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/effective-java-logging/</guid><description>&lt;p&gt;Effective Logging is an essential aspect of any Java application, providing insights into its operational state. It is especially crucial in production environments, where it aids in debugging, monitoring, and incident response. In this comprehensive guide, we will explore the effective practices for using SLF4J with Logback, ensuring a reliable and maintainable logging strategy.&lt;/p&gt;
&lt;p&gt;By following these best practices, developers and operations teams can leverage SLF4J and Logback to turn logs into strategic resources for application management and incident resolution. Embracing these guidelines will lead to improved observability, quicker troubleshooting, and a deeper understanding of system behavior, establishing a solid foundation for application reliability and performance.&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>Structured Concurrency is More Than ShutdownOnFailure</title><link>https://foojayio.github.io/website/today/structured-concurrency-is-more-than-shutdownonfailure/</link><pubDate>Thu, 11 Jul 2024 16:34:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/structured-concurrency-is-more-than-shutdownonfailure/</guid><description>&lt;p&gt;&lt;strong&gt;Since Java 21, structured concurrency has been added as a preview feature. Structured concurrency is a way to manage sub-tasks that are run in parallel within a given scope.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve ever seen a presentation about &lt;a href="https://docs.oracle.com/en/java/javase/21/core/structured-concurrency.html" target="_blank" rel="noopener noreferrer"&gt;structured concurrency&lt;/a&gt;
, you&amp;rsquo;ve probably seen the use of the &lt;code&gt;ShutdownOnSuccess&lt;/code&gt; or &lt;code&gt;ShutdownOnFailure&lt;/code&gt; classes.&lt;/p&gt;
&lt;p&gt;These classes will stop the scope and the still running sub-tasks within that scope when one of the sub-task succeeds or fails.&lt;/p&gt;</description></item><item><title>Dynamic watermarking on the JVM</title><link>https://foojayio.github.io/website/today/dynamic-watermarking-on-the-jvm/</link><pubDate>Tue, 09 Jul 2024 07:59:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/dynamic-watermarking-on-the-jvm/</guid><description>&lt;p&gt;Displaying images on your website makes for an interesting problem: on one side, you want to make them publicly available; on the other, you want to protect them against undue use. The age-long method to achieve it is watermarking:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A &lt;strong&gt;digital watermark&lt;/strong&gt; is a kind of marker covertly embedded in a noise-tolerant signal such as audio, video or image data. It is typically used to identify ownership of the copyright of such signal. &amp;ldquo;Watermarking&amp;rdquo; is the process of hiding digital information in a carrier signal; the hidden information should, but does not need to, contain a relation to the carrier signal. Digital watermarks may be used to verify the authenticity or integrity of the carrier signal or to show the identity of its owners. It is prominently used for tracing copyright infringements and for banknote authentication.&lt;/p&gt;</description></item><item><title>The Best Way to Handle Phone Numbers</title><link>https://foojayio.github.io/website/today/the-best-way-to-handle-phone-numbers/</link><pubDate>Fri, 05 Jul 2024 07:00:23 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-best-way-to-handle-phone-numbers/</guid><description>&lt;p&gt;Processing phone numbers seems complicated at first glance because of the many different formats. In this post, I&amp;rsquo;ll show you that with libphonenumber, it becomes child&amp;rsquo;s play. I&amp;rsquo;ll also recommend how to store the phone number in the database.&lt;/p&gt;
&lt;h2 id="h2-0-introduction-google-s-libphonenumber"&gt;Introduction Google&amp;rsquo;s libphonenumber&lt;/h2&gt;
&lt;p&gt;According to the GitHub repository &lt;a href="https://github.com/google/libphonenumber/" target="_blank" rel="noopener noreferrer"&gt;https://github.com/google/libphonenumber/&lt;/a&gt;
 libphone number is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;br /&gt;
&lt;p&gt;Google&amp;rsquo;s common Java, C++ and JavaScript library for parsing, formatting, and validating international phone numbers. The Java version is optimized for running on smartphones, and is used by the Android framework since 4.0 (Ice Cream Sandwich).&lt;/p&gt;</description></item><item><title>Foojay Podcast #55: Embedded Java, Part 2</title><link>https://foojayio.github.io/website/today/foojay-podcast-55/</link><pubDate>Mon, 01 Jul 2024 08:21:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-55/</guid><description>&lt;p&gt;As a backend developer, you may not realize that Java was initially born on embedded devices like set-top boxes and gateways. We discussed this topic for the first time almost three years ago in &lt;a href="https://foojayio.github.io/website/today/foojay-podcast-2/"&gt;Foojay Podcast #2 with James Gosling, Johan Vos, Erik Costlow, and Frank Delporte&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;In this episode #55, we look into the history of the Java Micro Edition and how things evolved. Nowadays, with processors becoming increasingly powerful, we can run the exact same Java runtime on any Linux system, from the biggest cloud servers to the smallest Raspberry Pi Zero.&lt;/p&gt;</description></item><item><title>Master Your Journey in the School of OpenJDK Migration</title><link>https://foojayio.github.io/website/today/master-your-journey-in-the-school-of-openjdk-migration/</link><pubDate>Sun, 30 Jun 2024 09:46:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/master-your-journey-in-the-school-of-openjdk-migration/</guid><description>&lt;p&gt;Azul has led so many OpenJDK migrations, we could write a book. Like, seriously, &lt;a href="https://www.azul.com/openjdk-migration-for-dummies/" target="_blank" rel="noopener noreferrer"&gt;we wrote the book&lt;/a&gt;
. If you prefer more a more visual, immersive experience, welcome to the School of OpenJDK Migration!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.azul.com/school-of-open-jdk-migration/" target="_blank" rel="noopener noreferrer"&gt;The School of OpenJDK Migration&lt;/a&gt;
 is your ultimate resource for mastering OpenJDK migration. Dive into our rich collection of webinars, where OpenJDK experts divulge their secrets, from foundational knowledge to advanced tactics, derived from industry knowledge and professional experience. You&amp;rsquo;ll leave the course with a blueprint to navigate the complexities of OpenJDK migration with confidence and ease.&lt;/p&gt;</description></item><item><title>Foojay Podcast #54: Music and MIDI with Java and Kotlin</title><link>https://foojayio.github.io/website/today/foojay-podcast-54/</link><pubDate>Mon, 24 Jun 2024 18:23:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-54/</guid><description>&lt;p&gt;MIDI is a universal standard for communicating between musical instruments and computers.&lt;/p&gt;
&lt;p&gt;Within OpenJDK, there is a whole Java package dedicated to MIDI communication and data handling. Is it up to date? Are there better approaches now? And what can we do with music, Java, and Kotlin?&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s find out&amp;hellip;&lt;/p&gt;
&lt;h2 id="h2-0-video"&gt;Video&lt;/h2&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/tHKZA9yqIVM?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-podcast-apps"&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>Foojay Podcast #53: JCON Report, Part 5 – CQRS, JOOQ, GraphQL, API, Vaadin, OpenRewrite, ErrorProne, Gateways, Proxies,...</title><link>https://foojayio.github.io/website/today/foojay-podcast-53/</link><pubDate>Mon, 17 Jun 2024 09:24:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-53/</guid><description>&lt;p&gt;This is the final part of the JCON interviews. Did I save the best for last? It&amp;rsquo;s up to you to decide&amp;hellip;&lt;/p&gt;
&lt;p&gt;In this episode you&amp;rsquo;ll hear Simon Martinelli, Nicolas Fränkel, Marcus Hellberg, Rick Ossendrijver, and Abdel Sghiouar.&lt;/p&gt;
&lt;p&gt;We talked about a bunch of topics like evolving your APIs, GraphQL, Java versus Kotlin versus Rust, Vaadin, AI and ChatGPT, OpenRewrite, ErrorProne, Infrastructure, and a lot more.&lt;/p&gt;
&lt;h2 id="h2-0-video"&gt;Video&lt;/h2&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/6ops5sU_UiY?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-podcast-apps"&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>Foojay Podcast #52 from JCON in Cologne!</title><link>https://foojayio.github.io/website/today/foojay-podcast-52/</link><pubDate>Mon, 10 Jun 2024 09:32:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-52/</guid><description>&lt;p&gt;This is part 4 of the JCON interviews!&lt;/p&gt;
&lt;p&gt;In this episode, we have 5 new guests for you.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We start with garbage collectors and Intelligence Cloud, a tool created by Azul to find out which of your code is actually used in production and which dependencies are known to have vulnerabilities. My colleague Gerrit Grunwald was at JCON to give a talk about these subjects.&lt;/li&gt;
&lt;li&gt;With Balkrishna Rawool we dove into Virtual Threads, a very interesting topic as concurrency and threads can be challenging&amp;hellip;&lt;/li&gt;
&lt;li&gt;Piotr Przybyl came to JCON to give a talk about Test Containers and how to test your application in an environment that is similar to your production environment. Another important topic related to testing is Flaky Tests. How do you handle tests that only fail from time to time and make your whole test report unreliable?&lt;/li&gt;
&lt;li&gt;François Martin had a talk about this subject, and he came to the conference together with Annelore Egger, who was one of the many volunteers.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-0-video"&gt;Video&lt;/h2&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/9q7kSibmVBA?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-podcast-apps"&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>Java: Functional Programming f(x) – Part2</title><link>https://foojayio.github.io/website/today/java-functional-programming-fx-part2/</link><pubDate>Mon, 03 Jun 2024 17:05:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-functional-programming-fx-part2/</guid><description>&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/java-functional-programming/"&gt;the preceding article&lt;/a&gt;
, we explored the significance of &lt;strong&gt;Functional Programming, Lambda Calculus&lt;/strong&gt;, and other related concepts.&lt;/p&gt;
&lt;p&gt;In this article, we delve deeper into the essential aspects of Functional Programming, such as&amp;hellip;​&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Lambda Expressions
2. Method References
3. Functional Interfaces&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And we will discuss about the relationship between each of the features.&lt;/p&gt;
&lt;p&gt;JSR 335 has greatly facilitated programming in a multicore environment by introducing Lambda Expressions/closures/anonymous method, and related features.&lt;/p&gt;</description></item><item><title>Foojay Podcast #50: JCON Report, Part 2 - Maven, Software Security, Code Quality</title><link>https://foojayio.github.io/website/today/foojay-podcast-50/</link><pubDate>Mon, 27 May 2024 08:07:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-50/</guid><description>&lt;p&gt;This is part 2 of the interviews we recorded at the JCON conference earlier this month in Germany. In this episode, you get two main topics: &lt;strong&gt;Maven and Code Quality&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In the first part, you&amp;rsquo;ll hear Karl Heinz Marbaise and Steve Poole discuss the Maven project, the repository, Sonaytype, and the security impact of dependencies.&lt;/p&gt;
&lt;p&gt;But next to security, we developers are also responsible for creating readable and maintainable code. Miro Wengner, Marit van Dijk, and Hinse ter Schuur dive into this topic, in the second part!&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>Foojay Podcast #49: JCON Report, Part 1 - JUGs, Communities, Generative AI, and more!</title><link>https://foojayio.github.io/website/today/foojay-podcast-49/</link><pubDate>Tue, 21 May 2024 06:05:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-49/</guid><description>&lt;p&gt;On Tuesday, May 14th, the Foojay Podcast went live at the JCON conference in Cologne, Germany, to talk with speakers and visitors about all things Java.&lt;/p&gt;
&lt;p&gt;We had so many amazing talks that we will combine them into several podcast episodes in the next weeks.&lt;/p&gt;
&lt;p&gt;This is part 1 about JUGs, Communities, Open Source, Generative AI, LangChain4j, Machine Learning!&lt;/p&gt;
&lt;h2 id="h2-0-video"&gt;Video&lt;/h2&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/-wVCYj8oQUY?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-podcast-apps"&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>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>Let's Replace the synchronized Keyword</title><link>https://foojayio.github.io/website/today/lets-replace-the-synchronized-keyword/</link><pubDate>Tue, 07 May 2024 04:26:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/lets-replace-the-synchronized-keyword/</guid><description>&lt;p&gt;&lt;strong&gt;Let&amp;rsquo;s see in this article different ways to replace the synchronized keyword to make our code more virtual threads friendly.&lt;/strong&gt;&lt;br&gt;
&lt;img src="https://foojayio.github.io/website/today/lets-replace-the-synchronized-keyword/synchronized-loc.png" alt="" loading="lazy"&gt;
 Lines of code of the different solutions discussed in this article&lt;/p&gt;
&lt;h2 id="h2-0-synchronized-and-pinning-threads"&gt;Synchronized and pinning threads&lt;/h2&gt;
&lt;p&gt;Since Java 21, we can enjoy virtual threads and have more than 1 million threads in Java.&lt;/p&gt;
&lt;p&gt;But it has a condition, the virtual thread shouldn&amp;rsquo;t be pinned to the OS thread.&lt;/p&gt;
&lt;p&gt;Pinning means that a virtual thread is blocking the OS thread from being used by any other virtual threads.&lt;/p&gt;</description></item><item><title>Functional Programming: Revolutionizing Software Development</title><link>https://foojayio.github.io/website/today/java-functional-programming/</link><pubDate>Thu, 25 Apr 2024 17:43:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-functional-programming/</guid><description>&lt;p&gt;&lt;strong&gt;Mathematics serves as the driving force behind significant advancements in computer science from my perspective. We deeply root the fundamental principles that we utilize in our daily programming tasks and application development in mathematical concepts. I am constantly intrigued by the opportunity to incorporate mathematical ideas into the programming languages I work with as a student of Mathematics.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Many other programming paradigms, like functional programming, take inspiration from Mathematics to address challenges related to concurrency and parallelism. Computing shifts towards utilizing multiple cores and distributed systems, which makes this increasingly important.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Java 22 Is Here, And It's Ready To Rock</title><link>https://foojayio.github.io/website/today/java-22-is-here-and-its-ready-to-rock/</link><pubDate>Tue, 19 Mar 2024 13:56:23 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-22-is-here-and-its-ready-to-rock/</guid><description>&lt;p&gt;Java 22 is here!&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s been six months since Java 21 was released, so it&amp;rsquo;s time for another fresh set of Java features.&lt;/p&gt;
&lt;p&gt;In this article, you&amp;rsquo;ll go on a tour of the JEPs that are part of this release, giving you a brief introduction to each of them.&lt;/p&gt;
&lt;p&gt;Where applicable, the differences with Java 21 are highlighted and a few typical use cases are provided, so that you&amp;rsquo;ll be more than ready to use these features after reading this!&lt;/p&gt;</description></item><item><title>Foojay Podcast #45: Welcome to Java 22</title><link>https://foojayio.github.io/website/today/foojay-podcast-45/</link><pubDate>Mon, 18 Mar 2024 10:31:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-45/</guid><description>&lt;p&gt;Last September, we got Java 21, a Long Term Support (LTS) version with eight new big features and seven incubator or preview features.&lt;/p&gt;
&lt;p&gt;Does Java 22 also bring that much innovation, or is it just a bug-fix release?&lt;/p&gt;
&lt;p&gt;And what needs to be done to get such a release published on time? Let&amp;rsquo;s find out&amp;hellip;&lt;/p&gt;
&lt;h2 id="h2-0-video"&gt;Video&lt;/h2&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/_NYuuoCQgO8?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-podcast-apps"&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>How Oracle Separates Java Pricing from Value</title><link>https://foojayio.github.io/website/today/how-oracle-separates-java-pricing-from-value/</link><pubDate>Fri, 15 Mar 2024 14:00:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-oracle-separates-java-pricing-from-value/</guid><description>&lt;p&gt;&lt;strong&gt;On January 23, 2023, Oracle quietly replaced the online link to the Oracle Java SE Subscription Global Price List with a link to a new Oracle Java SE Universal Subscription Global Price List.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The old Oracle Java pricing was far from perfect. It was based on a processor-count metric for servers and a named-user-plus metric for desktops. With the processor-count metric, the license cost was determined by multiplying a processor&amp;rsquo;s total number of cores by a core processor licensing factor specified by Oracle. The named-user metric applied to all individuals &lt;em&gt;authorized&lt;/em&gt; to use a program regardless of whether they were &lt;em&gt;actively&lt;/em&gt; using it. These definitions left the door open for uncomfortable conversations with Oracle reps who were famous for setting up meetings &amp;ldquo;to talk about your Java usage.&amp;rdquo; Unpleasant in themselves, these meetings could lead to painful Java audits.&lt;/p&gt;</description></item><item><title>More readability &amp; less complexity with Java's Pattern Matching.</title><link>https://foojayio.github.io/website/today/increase-readability-and-reduce-complexity-with-javas-pattern-matching/</link><pubDate>Thu, 14 Mar 2024 13:29:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/increase-readability-and-reduce-complexity-with-javas-pattern-matching/</guid><description>&lt;p&gt;&lt;strong&gt;Increase readability, reduce cognitive complexity, and avoid bugs that are hard to spot with Java&amp;rsquo;s Pattern Matching.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I bet you don&amp;rsquo;t like writing ugly but necessary boilerplate code or reading it. But, sometimes we need to create logic that has to deal with an object of unknown type and follow different paths depending on the type. This code is prone to be too verbose, is complex to understand, and may involve some hidden errors hard to spot due to intermediate assignments.&lt;/p&gt;</description></item><item><title>Builders, Withers, and Records - Java’s path to immutability</title><link>https://foojayio.github.io/website/today/builders-withers-and-records-javas-path-to-immutability/</link><pubDate>Wed, 28 Feb 2024 12:19:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/builders-withers-and-records-javas-path-to-immutability/</guid><description>&lt;p&gt;&lt;strong&gt;We know that immutable objects are easier to maintain, lead to fewer errors, and are multi-thread friendly. In this article, I will talk about two different approaches in Java to creating objects: Builders and Withers, typically used in the context of immutable objects, along with a new type of immutable object in Java: Records.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When it comes to creating objects in Java, we can use fluent approaches, especially for complex objects containing lots of fields, that will increase readability and also adaptability allowing us to evolve the code with lower impact on the existing code. And we want to because fluent code is both easier to read and easier to write.&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>foojay – Sorting Text in Java</title><link>https://foojayio.github.io/website/today/sorting-text-in-java-how-complicated-can-it-be/</link><pubDate>Wed, 07 Feb 2024 08:41:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/sorting-text-in-java-how-complicated-can-it-be/</guid><description>&lt;p&gt;&lt;strong&gt;Sorting text should be easy as String implements the &lt;em&gt;Comparable&lt;/em&gt; interface. In this article, we&amp;rsquo;ll see that it can be more complicated than that.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Text is represented by the &lt;em&gt;String&lt;/em&gt; class in Java. In this article we&amp;rsquo;ll explore how to sort String, the advantages and drawbacks of each possibility.&lt;/p&gt;
&lt;h2 id="h2-0-level-1-comparable"&gt;Level 1: Comparable&lt;/h2&gt;
&lt;p&gt;The class String implements &lt;em&gt;Comparable&lt;/em&gt; so sorting a list of String is as simple as&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;String&amp;gt; textList = new ArrayList&amp;lt;&amp;gt;(List.of("test","test11","test2","Test4","test3","test5","tést2","test2","3test","testa","test2a","test4a","test2b"));
Collections.sort(textList);&lt;/pre&gt;
&lt;p&gt;=&amp;gt; &lt;strong&gt;[3test, Test4, test, test11, test2, test2, test2a, test2b, test3, test4a, test5, testa, tést2]&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Achieving High Throughput Without Sacrificing Latency</title><link>https://foojayio.github.io/website/today/achieving-high-throughput-without-sacrificing-latency/</link><pubDate>Fri, 02 Feb 2024 09:39:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/achieving-high-throughput-without-sacrificing-latency/</guid><description>&lt;h2 id="h2-0-latency-and-throughput"&gt;Latency and Throughput&lt;/h2&gt;
&lt;p&gt;In discussions on performance, it is common to encounter the terms &lt;em&gt;Latency&lt;/em&gt; and &lt;em&gt;Throughput&lt;/em&gt; to describe the characteristics of a software component.&lt;/p&gt;
&lt;p&gt;We can define these terms as follows:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Latency&lt;/strong&gt; is a measure of the time taken for one thing to occur. For example, it could be the time taken to respond to a change in the price of a financial instrument that could influence the decision on whether to buy, or sell. It could be the time taken for a component monitoring some external device to respond to an indication of a change in the status of that device (like a change in temperature reported from a thermometer).&lt;/p&gt;</description></item><item><title>Building gdocweb with Java 21, Spring Boot 3.x and Beyond</title><link>https://foojayio.github.io/website/today/building-gdocweb-with-java-21-spring-boot-3-x-and-beyond/</link><pubDate>Tue, 30 Jan 2024 12:40:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-gdocweb-with-java-21-spring-boot-3-x-and-beyond/</guid><description>&lt;p&gt;&lt;strong&gt;Table of Contents&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#introducing-gdocweb"&gt;Introducing gdocweb&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#java-21-and-spring-boot-3x-innovation-and-maturity"&gt;Java 21 and Spring Boot 3.x: Innovation and Maturity&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#graalvm-native-image-for-efficiency"&gt;GraalVM Native Image for Efficiency&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#implementing-graalvm"&gt;Implementing GraalVM&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#facing-the-production-challenges"&gt;Facing the Production Challenges&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-decision-to-move-on"&gt;The Decision to Move On&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#deployment-vps-and-docker-compose"&gt;Deployment: VPS and Docker Compose&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#avoiding-raw-vps-deployment"&gt;Avoiding Raw VPS Deployment&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#steering-clear-of-managed-containers-orchestration"&gt;Steering Clear of Managed Containers &amp;amp; Orchestration&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-choice-of-docker-compose"&gt;The Choice of Docker Compose&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#front-end-thymeleaf-over-modern-alternatives"&gt;Front-End: Thymeleaf Over Modern Alternatives&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#react-modern-but-not-a-one-size-fits-all-solution"&gt;React: Modern but Not a One-Size-Fits-All Solution&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-appeal-of-thymeleaf"&gt;The Appeal of Thymeleaf&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#considering-htmx-for-dynamic-functionality"&gt;Considering HTMX for Dynamic Functionality&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Starting a new project is always a mix of excitement and tough decisions, especially when you&amp;rsquo;re stitching together familiar tools like Google Docs with powerhouses like GitHub Pages.&lt;/p&gt;</description></item><item><title>Java Flight Recording and Analysis with Azul Mission Control</title><link>https://foojayio.github.io/website/today/java-flight-recording-and-analysis-with-azul-mission-control/</link><pubDate>Thu, 25 Jan 2024 07:59:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-flight-recording-and-analysis-with-azul-mission-control/</guid><description>&lt;p&gt;&lt;strong&gt;Java Flight Recording (JFR) is a Java Virtual Machine (JVM) profiling and diagnostics tool. It enables you to collect and analyze data regarding the performance and behavior of a Java application. As JFR is included in the JVM, there is no need for additional tools or installations to make recordings of your applications.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;By utilizing JFR, you gain valuable insights into the runtime behavior of your Java applications. It helps you to optimize performance, identify and troubleshoot issues, and ensure better overall reliability. JFR is designed with very low overhead, allowing its use in production environments with minimal impact on the performance of your application.&lt;/p&gt;</description></item><item><title>Revolutionising Java Collections: The Advent of Sequenced Collections in Java 21</title><link>https://foojayio.github.io/website/today/revolutionising-java-collections-the-advent-of-sequenced-collections-in-java-21/</link><pubDate>Tue, 26 Dec 2023 14:07:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/revolutionising-java-collections-the-advent-of-sequenced-collections-in-java-21/</guid><description>&lt;p&gt;&lt;strong&gt;Java has been a staple in the software development world for decades, renowned for its robustness and vast ecosystem. However, some seasoned Java developers have encountered limitations within its collections framework, particularly when dealing with ordered elements.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Enter JEP 431. JEP 431, part of the Java Enhancement Proposal system, represents a significant advancement in Java&amp;rsquo;s ongoing evolution.&lt;/p&gt;
&lt;p&gt;The Java Enhancement Proposal system is a process for proposing, reviewing, and implementing new features in the Java programming language.&lt;/p&gt;</description></item><item><title>Writing C Code in Java</title><link>https://foojayio.github.io/website/today/writing-c-code-in-java/</link><pubDate>Wed, 20 Dec 2023 09:21:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/writing-c-code-in-java/</guid><description>&lt;p&gt;&lt;img src="https://mostlynerdless.de/wp-content/uploads/2023/12/panama-2000x981.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Foreign Function &amp;amp; Memory API (also called Project Panama) has come a long way since it started. You can find the latest version implemented in JDK 21 as a preview feature (use &lt;code&gt;--enable-preview&lt;/code&gt; to enable it) which is specified by the &lt;a href="https://openjdk.org/jeps/454" target="_blank" rel="noopener noreferrer"&gt;JEP 454&lt;/a&gt;
:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;By efficiently invoking foreign functions (i.e., code outside the JVM), and by safely accessing foreign memory (i.e., memory not managed by the JVM), the API enables Java programs to call native libraries and process native data without the brittleness and danger of JNI.
&lt;a href="https://openjdk.org/jeps/454" target="_blank" rel="noopener noreferrer"&gt;JEP 454&lt;/a&gt;
&lt;/p&gt;</description></item><item><title>Strategies for Managing State in Chronicle Services</title><link>https://foojayio.github.io/website/today/strategies-for-managing-state-in-chronicle-services/</link><pubDate>Fri, 01 Dec 2023 08:41:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/strategies-for-managing-state-in-chronicle-services/</guid><description>&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In distributed, microservice-based applications, the management of state is one of the most important, yet difficult aspects of design.&lt;/p&gt;
&lt;p&gt;Ensuring the accuracy and consistency of state without introducing excessive complexity that affects performance or flexibility to support evolving requirements requires careful thought.&lt;/p&gt;
&lt;p&gt;This article discusses issues around state management and shows how the &lt;a href="https://chronicle.software/services/" title="Chronicle Services" target="_blank" rel="noopener noreferrer"&gt;Chronicle Services&lt;/a&gt;
 framework provides support to deal with these in ways that maintain a resilient and high performing microservices architecture.&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>Video: "If I decide to stay with Oracle Java what issues will I face?"</title><link>https://foojayio.github.io/website/today/video-if-i-decide-to-stay-with-oracle-java-what-issues-will-i-face/</link><pubDate>Thu, 23 Nov 2023 09:12:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/video-if-i-decide-to-stay-with-oracle-java-what-issues-will-i-face/</guid><description>&lt;p&gt;Simon Ritter and Gerrit Grunwald answer a question that they hear repeatedly: &lt;strong&gt;&amp;ldquo;If I decide to stay with Oracle Java (rather than migrate to an OpenJDK distribution) what issues will I face?&amp;rdquo;&lt;/strong&gt;&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/rGiIm2xdp7w?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;br /&gt;
&lt;br /&gt;</description></item><item><title>Announcing the Build Server for Gradle Open-Source Repository</title><link>https://foojayio.github.io/website/today/announcing-the-bsp-repo/</link><pubDate>Tue, 21 Nov 2023 10:08:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/announcing-the-bsp-repo/</guid><description>&lt;h3 id="h3-0-build-server-for-gradle"&gt;Build Server for Gradle&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;In September, we shared that Microsoft and Gradle &lt;a href="https://devblogs.microsoft.com/java/new-build-server-for-gradle/" target="_blank" rel="noopener noreferrer"&gt;have joined forces&lt;/a&gt;
 to explore a novel approach to Gradle project import and building, based on the &lt;a href="https://build-server-protocol.github.io/" target="_blank" rel="noopener noreferrer"&gt;Build Server Protocol (BSP)&lt;/a&gt;
. The objective is address the existing Gradle issues on Visual Studio Code and improve support for Gradle projects.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The Build Server for Gradle, developed in collaboration with Gradle, will delegate build tasks to the Gradle build tool, which will be responsible for compiling and generating code directly. This ensures that the results of building in Visual Studio Code will be consistent with the output obtained by running Gradle build commands.&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>JDWP, onthrow and a mysterious error</title><link>https://foojayio.github.io/website/today/jdwp-onthrow-and-a-mysterious-error/</link><pubDate>Thu, 26 Oct 2023 13:44:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/jdwp-onthrow-and-a-mysterious-error/</guid><description>&lt;p&gt;&lt;strong&gt;In my previous Java-related blog post called &lt;a href="https://foojayio.github.io/website/today/level-up-your-java-debugging-skills-with-on-demand-debugging/"&gt;Level-up your Java Debugging Skills with on-demand Debugging&lt;/a&gt;
, I showed you how to use the &lt;code&gt;onthrow&lt;/code&gt; option of the JDWP agent to start the debugging session on the first throw of a specific exception.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This gave us a mysterious error in JDB:
&lt;img src="https://mostlynerdless.de/wp-content/uploads/2023/10/image-3.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;And I asked if somebody had any ideas. No one had, but I was at Devoxx Belgium and happened to talk with &lt;a href="https://shipilev.net/" target="_blank" rel="noopener noreferrer"&gt;Aleksey Shipilev&lt;/a&gt;
 about it at the Corretto booth:
&lt;img src="https://mostlynerdless.de/wp-content/uploads/2023/10/F7hNsheWUAA0Y46-2000x1500.jpg" alt="" loading="lazy"&gt;
 Two OpenJDK developers having fun at Devoxx: Investigating a jdb bug with Shipilev&lt;br&gt;
in the Coretto booth (&lt;a href="https://twitter.com/parttimen3rd/status/1709201492115095904" target="_blank" rel="noopener noreferrer"&gt;Tweet&lt;/a&gt;
)&lt;/p&gt;</description></item><item><title>Navigating Behaviour with Events</title><link>https://foojayio.github.io/website/today/navigating-behaviour-with-events/</link><pubDate>Wed, 25 Oct 2023 15:04:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/navigating-behaviour-with-events/</guid><description>&lt;h2 id="h2-0-two-approaches"&gt;Two Approaches&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s little doubt that modern software architectures lean towards asynchronous models for communication between distributed components (where &amp;ldquo;distributed&amp;rdquo; means components that are not part of the same process, be they on the same or on different physical machines). Synchronous models such as Remote Procedure Call (RPC) are now largely discredited [&lt;a href="https://www.researchgate.net/profile/Ellen-Isaacs/publication/220168963_Why_do_users_like_video/links/02e7e5186b67219c70000000/Why-do-users-like-video.pdf#page=89" title="Waldo" target="_blank" rel="noopener noreferrer"&gt;Waldo&lt;/a&gt;
, &lt;a href="http://steve.vinoski.net/blog/2008/07/01/convenience-over-correctness/" title="Vinoski" target="_blank" rel="noopener noreferrer"&gt;Vinoski&lt;/a&gt;
]; even asynchronous variants of these are not seen as desirable.&lt;/p&gt;
&lt;p&gt;When we strip away the layers that present the illusion that RPC is really just the same as Local Procedure Call (i.e. a normal method invocation), we find sitting above the transport some form of messaging protocol. And these days, the APIs seem more willing to expose developers to these lower-level details, making it clear to programmers that communication with a remote component is inherently more complex than making a simple procedure call.&lt;/p&gt;</description></item><item><title>Foojay Podcast #31: Report of Devoxx 23 in Belgium</title><link>https://foojayio.github.io/website/today/foojay-podcast-31/</link><pubDate>Mon, 16 Oct 2023 07:16:57 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-31/</guid><description>&lt;p&gt;The first week of October, the 20th edition of Devoxx took place in Antwerp, Belgium.&lt;/p&gt;
&lt;p&gt;Over 3000 Java developers, speakers, and enthusiasts gathered to share their knowledge and learn from each other.&lt;/p&gt;
&lt;p&gt;I got the opportunity to walk around with a microphone and talk to visitors and speakers.&lt;/p&gt;
&lt;p&gt;Not all of them, as there were just too many people and too many exciting sessions happening simultaneously.&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/VJJmoiP7e-I?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-0-podcast-apps"&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>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>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>Java 21 Is Available Today, And It's Quite The Update</title><link>https://foojayio.github.io/website/today/java-21-is-available-today-and-its-quite-the-update/</link><pubDate>Tue, 19 Sep 2023 05:31:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-21-is-available-today-and-its-quite-the-update/</guid><description>&lt;p&gt;&lt;strong&gt;Today&amp;rsquo;s the first day of Java 21&amp;rsquo;s availability! It&amp;rsquo;s been six months since Java 20 was released, so it&amp;rsquo;s time for another fresh wave of Java features. This post takes you on a tour of the JEPs that are associated with this release and it gives you a brief introduction to each of them, and &lt;a href="https://foojayio.github.io/website/today/foojay-podcast-28/"&gt;check out the Java 21 podcast here&lt;/a&gt;
. Where applicable the differences with Java 20 are highlighted and a few typical use cases are provided, so that you&amp;rsquo;ll be more than ready to use these features after reading this!&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Foojay Podcast #28: Java 21 Has Arrived!</title><link>https://foojayio.github.io/website/today/foojay-podcast-28/</link><pubDate>Tue, 19 Sep 2023 05:27:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-28/</guid><description>&lt;p&gt;Since 2018, we get a new version of Java every 6 months.&lt;/p&gt;
&lt;p&gt;And &lt;a href="https://foojayio.github.io/website/today/java-21-is-available-today-and-its-quite-the-update/"&gt;version 21, released during today, is a long-term support version&lt;/a&gt;
 that can be used for many years.&lt;/p&gt;
&lt;p&gt;It also brings a lot of new features and improvements in both the language and the runtime.&lt;/p&gt;
&lt;p&gt;Actually, there are so many that we&amp;rsquo;ll probably not get all of them discussed in this podcast!&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s see what our experts find the most important facts we need to know about Java 21.&lt;/p&gt;</description></item><item><title>The DiscoAPI Helps You To Find Any OpenJDK Distribution</title><link>https://foojayio.github.io/website/today/disco-api-helping-you-to-find-any-openjdk-distribution/</link><pubDate>Tue, 12 Sep 2023 03:42:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/disco-api-helping-you-to-find-any-openjdk-distribution/</guid><description>&lt;p&gt;&lt;strong&gt;Did you know Foojay is not only a human-readable OpenJDK knowledge base but also provides the Disco API that lets you search all OpenJDK distributions? And even if you didn&amp;rsquo;t know, you probably already are using it, as it&amp;rsquo;s integrated into &lt;a href="https://sdkman.io/" target="_blank" rel="noopener noreferrer"&gt;SDKMAN!&lt;/a&gt;
, &lt;a href="https://jreleaser.org/" target="_blank" rel="noopener noreferrer"&gt;JReleaser&lt;/a&gt;
, &lt;a href="https://www.jbang.dev/" target="_blank" rel="noopener noreferrer"&gt;JBang!&lt;/a&gt;
, &lt;a href="https://docs.gradle.org/current/userguide/toolchains.html" target="_blank" rel="noopener noreferrer"&gt;Gradle toolchain&lt;/a&gt;
, &lt;a href="https://paketo.io/docs/howto/java/" target="_blank" rel="noopener noreferrer"&gt;Paketo buildpacks&lt;/a&gt;
,and more.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The Disco API (i.e., the short name for the Universal OpenJDK Discovery API) is a database and API with all the available OpenJDK versions from all distributors, like Corretto, Liberica, Oracle, Temurin, Zulu, and many others. In total, there are now 89352 different packages at the end of August 2023.&lt;/p&gt;</description></item><item><title>The Evolution of Bugs</title><link>https://foojayio.github.io/website/today/the-evolution-of-bugs/</link><pubDate>Tue, 12 Sep 2023 03:34:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-evolution-of-bugs/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#memory-management-the-past-and-the-present"&gt;Memory Management: The Past and The Present&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-classic-challenges-memory-leaks-and-corruption"&gt;The Classic Challenges: Memory Leaks and Corruption&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#enter-garbage-collection-a-mixed-blessing"&gt;Enter Garbage Collection: A Mixed Blessing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#memory-profiling-the-contemporary-solution"&gt;Memory Profiling: The Contemporary Solution&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#concurrency-a-double-edged-sword"&gt;Concurrency: A Double-Edged Sword&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-bright-side-predictable-threading"&gt;The Bright Side: Predictable Threading&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-murky-waters-multi-container-concurrency"&gt;The Murky Waters: Multi-Container Concurrency&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#reproducing-the-elusive-threading-bugs"&gt;Reproducing The Elusive: Threading Bugs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#race-conditions-the-ever-present-ghost"&gt;Race Conditions: The Ever-Present Ghost&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-pervasiveness-of-state-bugs"&gt;The Pervasiveness of State Bugs&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#what-are-state-bugs"&gt;What Are State Bugs?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#from-simple-variables-to-complex-data-structures"&gt;From Simple Variables to Complex Data Structures&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#interactions-and-events-where-timing-matters"&gt;Interactions and Events: Where Timing Matters&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#persistence-when-bugs-linger"&gt;Persistence: When Bugs Linger&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#concurrency-compounds-state-issues"&gt;Concurrency Compounds State Issues&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#tools-and-strategies-to-combat-state-bugs"&gt;Tools and Strategies to Combat State Bugs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#exceptions-the-noisy-neighbor"&gt;Exceptions: The Noisy Neighbor&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#what-are-exceptions"&gt;What Are Exceptions?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-informative-nature-of-exceptions"&gt;The Informative Nature of Exceptions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#causes-of-exceptions"&gt;Causes of Exceptions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#handling-exceptions-a-delicate-balance"&gt;Handling Exceptions: A Delicate Balance&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#proactive-prevention"&gt;Proactive Prevention&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#faults-beyond-the-surface"&gt;Faults: Beyond the Surface&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#what-constitutes-a-fault"&gt;What Constitutes a Fault?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#origins-of-faults"&gt;Origins of Faults&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#detecting-and-isolating-faults"&gt;Detecting and Isolating Faults&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#addressing-faults"&gt;Addressing Faults&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-value-of-learning-from-faults"&gt;The Value of Learning from Faults&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#thread-bugs-unraveling-the-knot"&gt;Thread Bugs: Unraveling the Knot&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#a-glimpse-into-thread-bugs"&gt;A Glimpse into Thread Bugs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-common-culprits-behind-thread-bugs"&gt;The Common Culprits Behind Thread Bugs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#diagnosing-the-tangle"&gt;Diagnosing the Tangle&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#untangling-the-knot"&gt;Untangling the Knot&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#race-conditions-always-a-step-ahead"&gt;Race Conditions: Always a Step Ahead&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#what-exactly-is-a-race-condition"&gt;What Exactly is a Race Condition?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#why-are-race-conditions-so-tricky"&gt;Why are Race Conditions so Tricky?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#guarding-against-the-unpredictable"&gt;Guarding Against the Unpredictable&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#testing-for-races"&gt;Testing for Races&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#performance-pitfalls-monitor-contention-and-resource-starvation"&gt;Performance Pitfalls: Monitor Contention and Resource Starvation&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#monitor-contention-a-bottleneck-in-disguise"&gt;Monitor Contention: A Bottleneck in Disguise&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#why-its-problematic"&gt;Why It&amp;rsquo;s Problematic&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#mitigation-strategies"&gt;Mitigation Strategies&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#resource-starvation-the-silent-performance-killer"&gt;Resource Starvation: The Silent Performance Killer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-impact"&gt;The Impact&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#solutions-to-counteract-starvation"&gt;Solutions to Counteract Starvation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-bigger-picture"&gt;The Bigger Picture&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Programming, regardless of the era, has been riddled with bugs that vary in nature but often remain consistent in their basic problems. Whether we&amp;rsquo;re talking about mobile, desktop, server, or different operating systems and languages, bugs have always been a constant challenge. Here&amp;rsquo;s a dive into the nature of these bugs and how we can tackle them effectively.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>A Look at Sealed Classes, Pattern Matching, Functional Paradigms</title><link>https://foojayio.github.io/website/today/embracing-modernity-a-comprehensive-look-at-sealed-classes-pattern-matching-and-functional-paradigms-in-java/</link><pubDate>Mon, 11 Sep 2023 08:42:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/embracing-modernity-a-comprehensive-look-at-sealed-classes-pattern-matching-and-functional-paradigms-in-java/</guid><description>&lt;h3 id="h3-0-introduction"&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The introduction of Sealed Classes in Java and the combination with pattern matching in switch statements has sparked a debate among software developers.&lt;/p&gt;
&lt;p&gt;The argument in question raises concerns about the real-life use cases for Sealed Classes and suggests that pattern matching with switch might promote poor coding practices.&lt;/p&gt;
&lt;p&gt;This article aims to counter these assertions by examining the principles and practical applications of Sealed Classes and pattern matching.&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-2/</link><pubDate>Fri, 01 Sep 2023 07:42:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/book-review-openjdk-migration-for-dummies-2/</guid><description>&lt;p&gt;&lt;strong&gt;In the past couple of years, there have been quite a lot of Oracle Java licensing changes which can have quite the impact on how much using the Oracle JDK will cost your organization, especially since under the latest terms it&amp;rsquo;s quite easy to have a &amp;ldquo;rogue&amp;rdquo; install cost you quite a bit.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is where the new &lt;strong&gt;free&lt;/strong&gt; book &lt;a href="https://www.azul.com/openjdk-migration-for-dummies/" target="_blank" rel="noopener noreferrer"&gt;OpenJDK Migration for Dummies&lt;/a&gt;
 by &lt;a href="https://www.linkedin.com/in/siritter/" target="_blank" rel="noopener noreferrer"&gt;Simon Ritter&lt;/a&gt;
 offers a very useful resource.&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>Well Worth My Time: "OpenJDK Migration for Dummies"</title><link>https://foojayio.github.io/website/today/well-worth-my-time-openjdk-migration-for-dummies/</link><pubDate>Thu, 24 Aug 2023 07:51:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/well-worth-my-time-openjdk-migration-for-dummies/</guid><description>&lt;p&gt;I&amp;rsquo;ve just read the (free) &lt;a href="https://www.azul.com/openjdk-migration-for-dummies/" target="_blank" rel="noopener noreferrer"&gt;OpenJDK Migration for Dummies book&lt;/a&gt;
. It was well worth my time!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I first started using Java in 1998, so I&amp;rsquo;ve got a long history with it and feel very comfortable with the language itself. However, the licensing changes and proliferation of OpenJDK distributions are much more recent, and those aspects can be a bit confusing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The book is obviously written by a vendor, but it&amp;rsquo;s very honest about that. It does a good job of establishing the motivation for using OpenJDK, providing actionable steps for how to pursue that migration, and presenting meaningful information that a business should consider when selecting an OpenJDK vendor.&lt;/p&gt;</description></item><item><title>Is OpenJDK Just a Drop-In Replacement?</title><link>https://foojayio.github.io/website/today/is-openjdk-just-a-drop-in-replacement/</link><pubDate>Fri, 18 Aug 2023 07:58:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/is-openjdk-just-a-drop-in-replacement/</guid><description>&lt;p&gt;&lt;strong&gt;I don&amp;rsquo;t know anyone who is still using the Oracle JDK. It has been my recommendation for quite a while to just switch to an OpenJDK distribution as they are roughly drop-in replacements for Oracle&amp;rsquo;s official JDK. I&amp;rsquo;ve repeated that advice quite frequently but I guess I glossed over a lot of details that might be insignificant for hackers but can become a pretty big deal in an enterprise setting.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Taming the Bias: Unbiased Safepoint-Based Stack Walking</title><link>https://foojayio.github.io/website/today/taming-the-bias-unbiased-safepoint-based-stack-walking/</link><pubDate>Thu, 17 Aug 2023 14:00:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/taming-the-bias-unbiased-safepoint-based-stack-walking/</guid><description>&lt;p&gt;&lt;strong&gt;Walking only at safepoints has advantages. The main one is that you aren&amp;rsquo;t walking the stack in a signal handler but synchronously to the executed program. Therefore you can allocate memory, acquire locks and rematerialize virtual thread / Loom frames. The latter is significant because virtual threads are &lt;em&gt;the&lt;/em&gt; new Java feature that cannot support using signal-handler-based APIs like AsyncGetCallTrace.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This article is based on the ideas of Erik Österlund, and the second one is related to these new ideas. The first one is &lt;a href="https://mostlynerdless.de/blog/2023/08/07/asyncgetcalltrace-reworked-frame-by-frame-with-an-iterative-touch/" target="_blank" rel="noopener noreferrer"&gt;AsyncGetCallTrace Reworked: Frame by Frame with an Iterative Touch!&lt;/a&gt;
, which you should read before continuing with this post. For a refresher on safepoints, please read &lt;a href="https://mostlynerdless.de/blog/2023/07/31/the-inner-workings-of-safepoints/" target="_blank" rel="noopener noreferrer"&gt;The Inner Workings of Safepoints&lt;/a&gt;
.&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>Building High-Performance Java Microservices with EDA</title><link>https://foojayio.github.io/website/today/6-considerations-when-building-high-performance-java-microservices-with-eda/</link><pubDate>Wed, 16 Aug 2023 21:34:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/6-considerations-when-building-high-performance-java-microservices-with-eda/</guid><description>&lt;p&gt;&lt;strong&gt;Event-Driven Architecture (EDA) is a design principle focused on the creation, detection, and reaction to events.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Renowned for its resilience and low latency, EDA is a reliable choice for developing robust, high-performing microservices.&lt;/p&gt;
&lt;p&gt;Moreover, this method can be helpful in improving productivity and making the process of cloud migration smoother.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/6-considerations-when-building-high-performance-java-microservices-with-eda/Screenshot-2023-08-10-at-5.13.36-PM-1024x607.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;In this article we will outline 6 key considerations and tactics for developing such services.&lt;/p&gt;
&lt;h3 id="h3-0-1-crafting-event-based-microservices"&gt;1) Crafting Event-Based Microservices&lt;/h3&gt;
&lt;p&gt;Within EDA, microservices interact with each other through events. An event is simply an immutable indication that something has happened. Microservices register their interest in a subset of events and perform their processing by reacting to these events when they occur. On completion of handling of an event, microservices will usually post one or more events reflecting the result of this processing, which will trigger further downstream microservices.&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>Sealed Interfaces &amp; Pattern Matching: Java's Modern Capabilities</title><link>https://foojayio.github.io/website/today/sealed-interfaces-and-pattern-matching-a-quick-dive-into-javas-modern-capabilities/</link><pubDate>Wed, 09 Aug 2023 07:01:51 +0000</pubDate><guid>https://foojayio.github.io/website/today/sealed-interfaces-and-pattern-matching-a-quick-dive-into-javas-modern-capabilities/</guid><description>&lt;p&gt;&lt;strong&gt;Sealed classes in Java are a new feature that provides a way to restrict the classes that can inherit from a superclass or extend an interface. This new language feature enhances the encapsulation and provides more control to developers over their codebase.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this tutorial, we will explore sealed classes, how to use them to find all subclasses, and how to apply pattern matching in a practical context.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with a basic interface definition named &lt;code&gt;Shape&lt;/code&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 Inner Workings of Safepoints</title><link>https://foojayio.github.io/website/today/the-inner-workings-of-safepoints/</link><pubDate>Wed, 02 Aug 2023 10:27:27 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-inner-workings-of-safepoints/</guid><description>&lt;p&gt;A Java thread in the JVM regularly checks whether it should do extra work besides the execution of the bytecode.&lt;/p&gt;
&lt;p&gt;This work is done during so-called safepoints. There are two types of safepoints: local and global.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;At thread-local safepoints, also known as thread-local handshakes, only the current thread does some work and is therefore blocked from executing the application.&lt;/li&gt;
&lt;li&gt;At global safepoints, all Java threads are blocked and do some work. At these safepoints, the state of the thread (thread-local safepoints) or the JVM (global safepoints) is fixed. This allows the JVM to do activities like method deoptimizations or stop-the-world garbage collections, where the amount of concurrency should be limited.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But this article isn&amp;rsquo;t about what (global) safepoints are. Fr this, please refer to Nitsan Wakart&amp;rsquo;s and Seetha Wenner&amp;rsquo;s articles on this topic and for thread-local safepoints, which are a relatively recent addition to JEP 312.&lt;/p&gt;</description></item><item><title>Building for Failure: Best Practices for Easy Production Debugging</title><link>https://foojayio.github.io/website/today/building-for-failure-best-practices-for-easy-production-debugging/</link><pubDate>Fri, 21 Jul 2023 15:29:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-for-failure-best-practices-for-easy-production-debugging/</guid><description>&lt;p&gt;&lt;strong&gt;Before going into the content of this post, check out&lt;/strong&gt; &lt;a href="https://www.amazon.com/Java-21-Explore-cutting-edge-features-ebook/dp/B0C9WW8PFL/" target="_blank" rel="noopener noreferrer"&gt;&lt;strong&gt;my new book&lt;/strong&gt;&lt;/a&gt;
 &lt;strong&gt;which launched last week!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Quite a few years ago I was maintaining a database-driven system and ran into a weird production bug.&lt;/p&gt;
&lt;p&gt;The column I was reading from had a null value, but this wasn&amp;rsquo;t allowed in the code and there was no place where that value could have been null.&lt;/p&gt;
&lt;p&gt;The database was corrupt in a bad way and we didn&amp;rsquo;t have anything to go on.&lt;/p&gt;</description></item><item><title>JDK Safari: How To Find Hidden Tools in the JDK</title><link>https://foojayio.github.io/website/today/jdk-safari-how-to-find-hidden-tools-in-the-jdk/</link><pubDate>Wed, 19 Jul 2023 08:25:23 +0000</pubDate><guid>https://foojayio.github.io/website/today/jdk-safari-how-to-find-hidden-tools-in-the-jdk/</guid><description>&lt;p&gt;We all have some hobby, be it sports, fishing, playing games or building compilers.&lt;/p&gt;
&lt;p&gt;One of my hobbies is regularly searching the JDK for new Java classes with executable main methods.&lt;/p&gt;
&lt;p&gt;Many years ago, during my forays through the JDK sources, I first encountered a class with a main-method I didn&amp;rsquo;t know about. That was in 2007 (oh boy).&lt;/p&gt;
&lt;p&gt;The class was Class2HTML from the BCEL (Bytecode Engineering Library) library embedded in the JDK back then.&lt;/p&gt;</description></item><item><title>Dive into the OpenJDK: Top 10 Reads on Foojay.io</title><link>https://foojayio.github.io/website/today/dive-into-the-openjdk-top-10-reads-on-foojay-io/</link><pubDate>Wed, 19 Jul 2023 07:45:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/dive-into-the-openjdk-top-10-reads-on-foojay-io/</guid><description>&lt;p&gt;Foojay.io is a community platform dedicated to the needs of Java developers (and beyond, e.g., Kotlin) who use OpenJDK and related technologies.&lt;/p&gt;
&lt;p&gt;It serves as a central hub for sharing knowledge, resources, and tools related to Java and OpenJDK.&lt;/p&gt;
&lt;p&gt;The platform offers a wide range of content, including articles, tutorials, and insights from industry experts and Java enthusiasts.&lt;/p&gt;
&lt;p&gt;Whether you&amp;rsquo;re a seasoned developer or a beginner in the world of Java, Foojay.io provides valuable information and a supportive community to help you navigate and excel in your Java development journey.&lt;/p&gt;</description></item><item><title>Journeys in Java, Level 10: Service Discovery with Eureka</title><link>https://foojayio.github.io/website/today/journeys-in-java-level-10-service-discovery-with-eureka/</link><pubDate>Thu, 13 Jul 2023 06:39:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/journeys-in-java-level-10-service-discovery-with-eureka/</guid><description>&lt;p&gt;Gaining complexity in a microservices system certainly isn&amp;rsquo;t for the faint of heart (though neither is complexity in monoliths!).&lt;/p&gt;
&lt;p&gt;When there are many services that need to communicate with one another, we might need to coordinate multiple services communicating with multiple other services.&lt;/p&gt;
&lt;p&gt;We also might code for varying environments such as local, development server, or the cloud.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How do services know where to find one another?&lt;/li&gt;
&lt;li&gt;How can we avoid problems when a service is unavailable?&lt;/li&gt;
&lt;li&gt;How do we handle requests when we scale up or down certain parts of our system?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is where something like Spring Cloud Netflix Eureka comes into play.&lt;/p&gt;</description></item><item><title>Billions of Messages Per Minute Over TCP/IP</title><link>https://foojayio.github.io/website/today/billions-of-messages-tcp-ip/</link><pubDate>Wed, 05 Jul 2023 21:05:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/billions-of-messages-tcp-ip/</guid><description>&lt;h3 id="h3-0-key-takeaways"&gt;Key Takeaways&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Data consistency is critical when communicating between software components on different machines to ensure information remains in tact.&lt;/li&gt;
&lt;li&gt;Low-latency data exchange requires a different approach than common formats.&lt;/li&gt;
&lt;li&gt;Chronicle&amp;rsquo;s open-source Wire library provides a highly efficient means of marshalling and unmarshalling data for transmission to and from Chronicle Queue.&lt;/li&gt;
&lt;li&gt;Recent additions to the library extend its use with TCP/IP communications channels, offering extremely high throughput.&lt;/li&gt;
&lt;li&gt;Using Wire across TCP/IP opens up the possibility of Cloud Native deployment of Chronicle-based applications.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="h3-1-introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;One of the most important issues when building distributed applications is that of data representation. We must ensure that data sent by a component to a &amp;ldquo;remote&amp;rdquo; component (i.e. one that is part of a different process) is received correctly, with the same values. This may seem straightforward but remember that the communicating components may have been written in completely different languages.&lt;/p&gt;</description></item><item><title>Time Machine: A Look-Back at Java Sessions from NODES 2022</title><link>https://foojayio.github.io/website/today/time-machine-a-look-back-at-java-sessions-from-nodes-2022/</link><pubDate>Wed, 28 Jun 2023 07:53:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/time-machine-a-look-back-at-java-sessions-from-nodes-2022/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/time-machine-a-look-back-at-java-sessions-from-nodes-2022/nodes2023-java-scaled.jpg" alt="Base Photo by Compare Fibre on Unsplash" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Figure 1. Base Photo by Compare Fibre on Unsplash&lt;/p&gt;
&lt;p&gt;As we prepare for NODES 2023, I wanted to pull out the time machine and review the Java sessions from &lt;a href="https://neo4j.com/video/nodes-2022/" target="_blank" rel="noopener noreferrer"&gt;NODES 2022&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;I will be submitting some abstracts to the &lt;a href="https://sessionize.com/neo4j-nodes-2023" target="_blank" rel="noopener noreferrer"&gt;2023 Call for Proposal&lt;/a&gt;
 here soon, likely in the Java category, so I thought looking at last year&amp;rsquo;s sessions might give me some inspiration or ideas for gaps or continuations I might want to explore.&lt;/p&gt;</description></item><item><title>Building Custom Solutions vs. Buy-and-Build Software</title><link>https://foojayio.github.io/website/today/building-custom-solutions-vs-buy-and-build-software/</link><pubDate>Wed, 21 Jun 2023 14:41:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-custom-solutions-vs-buy-and-build-software/</guid><description>&lt;h3 id="h3-0-the-challenges-of-building-a-fix-engine"&gt;The Challenges of Building a FIX Engine&lt;/h3&gt;
&lt;p&gt;The first day I was introduced to &lt;a href="https://en.wikipedia.org/wiki/Financial_Information_eXchange" target="_blank" rel="noopener noreferrer"&gt;Financial Information eXchange (FIX)&lt;/a&gt;
 was when I worked at an investment bank in London as a developer.&lt;/p&gt;
&lt;p&gt;I was told to write a feed handler to retrieve market data.&lt;/p&gt;
&lt;p&gt;Bear in mind that at this time, I knew nothing about FIX, apart from Googling it for about 10 mins on the internet.&lt;/p&gt;
&lt;p&gt;With a touch of overconfidence and slight arrogance, I set to work coding a direct socket connection to the remote FIX endpoint, &amp;ldquo;how hard could it be?&amp;rdquo;&lt;/p&gt;</description></item><item><title>Exploring Java 21's Intriguing Additions (Part 1)</title><link>https://foojayio.github.io/website/today/exploring-java-21s-intriguing-additions-unveiling-new-features-part-1/</link><pubDate>Tue, 20 Jun 2023 13:40:21 +0000</pubDate><guid>https://foojayio.github.io/website/today/exploring-java-21s-intriguing-additions-unveiling-new-features-part-1/</guid><description>&lt;h2 id="h2-0-introduction"&gt;Introduction:&lt;/h2&gt;
&lt;p&gt;Java 21 is going to introduce several intriguing additions that enhance the language&amp;rsquo;s capabilities.&lt;/p&gt;
&lt;p&gt;This article aims to discuss a few notable features that stand out, providing an overview of their functionalities and potential use cases.&lt;/p&gt;
&lt;br /&gt;
&lt;h2 id="h2-1-character-enhancements"&gt;Character Enhancements:&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Character.isEmoji(int codePoint)&lt;/code&gt;: This method determines whether a character is considered an emoji based on its Unicode properties defined in Unicode Emoji (&lt;a href="https://unicode.org/reports/tr51/#Emoji_Properties_and_Data_Files" target="_blank" rel="noopener noreferrer"&gt;Unicode Emoji Technical Standard #51&lt;/a&gt;
). For example, executing &lt;code&gt;Character.isEmoji(9203)&lt;/code&gt; would return &lt;code&gt;true&lt;/code&gt; for the character ⏳, which has the code point 9203.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Character.isEmojiPresentation(int codePoint)&lt;/code&gt;: Similar to &lt;code&gt;isEmoji()&lt;/code&gt;, this method checks if a character has the Emoji Presentation property. It helps identify characters that display as emojis when rendered.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Example:&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>Operator Overloading in Java</title><link>https://foojayio.github.io/website/today/operator-overloading-in-java/</link><pubDate>Sat, 10 Jun 2023 12:19:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/operator-overloading-in-java/</guid><description>&lt;p&gt;In this article, we&amp;rsquo;ll delve into the fascinating world of operator overloading in Java.&lt;/p&gt;
&lt;p&gt;Although Java doesn&amp;rsquo;t natively support operator overloading, we&amp;rsquo;ll discover how Manifold can extend Java with that functionality.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll explore its benefits, limitations, and use cases, particularly in scientific and mathematical code.&lt;/p&gt;
&lt;p&gt;We will also explore three powerful features provided by Manifold that enhance the default Java type safety while enabling impressive programming techniques.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll discuss unit expressions, type-safe reflection coding, and fixing methods like equals during compilation.&lt;/p&gt;</description></item><item><title>Upgrade a Java 8 Project to 11 or Higher</title><link>https://foojayio.github.io/website/today/upgrade-a-java-8-project-to-11-or-higher/</link><pubDate>Thu, 08 Jun 2023 15:12:27 +0000</pubDate><guid>https://foojayio.github.io/website/today/upgrade-a-java-8-project-to-11-or-higher/</guid><description>&lt;p&gt;&lt;strong&gt;Java 8 is a Long Term Supported (LTS) version, and &lt;a href="https://www.azul.com/" target="_blank" rel="noopener noreferrer"&gt;Azul&lt;/a&gt;
 will maintain it until 2030 for customers with a support license. You can continue to run Java 8 applications until then on updated and secure Java runtimes. But by staying on Java 8, you miss many other improvements in runtime performance and language enhancements for your developers.&lt;/strong&gt;
&lt;img src="https://foojayio.github.io/website/today/upgrade-a-java-8-project-to-11-or-higher/6-1-23-java-8-11-higher-1024x400.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Keeping a project on Java 8 will eventually lead to running it on a non-maintained runtime.&lt;/p&gt;</description></item><item><title>Class Loader Hierarchies</title><link>https://foojayio.github.io/website/today/class-loader-hierarchies/</link><pubDate>Sat, 03 Jun 2023 08:56:55 +0000</pubDate><guid>https://foojayio.github.io/website/today/class-loader-hierarchies/</guid><description>&lt;p&gt;Understanding class loader hierarchies is essential when developing Java agents, especially if these agents are instrumenting code.&lt;/p&gt;
&lt;p&gt;In my &lt;a href="https://foojayio.github.io/website/today/instrumenting-java-code-to-find-and-handle-unused-classes/"&gt;Instrumenting Java Code to Find and Handle Unused Classes&lt;/a&gt;
 article, I instrumented all classes with an agent and used a &lt;code&gt;Store&lt;/code&gt; class in this newly added code:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A challenge here is that all instrumented classes will use the Store. We, therefore, have to put the store onto the bootstrap classpath, making it visible to all classes.&lt;/p&gt;</description></item><item><title>Java is Very Fast, If You Don’t Create Many Objects</title><link>https://foojayio.github.io/website/today/java-is-very-fast/</link><pubDate>Thu, 01 Jun 2023 04:45:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-is-very-fast/</guid><description>&lt;p&gt;This article looks at a benchmark passing events over TCP/IP at 4 billion events per minute using the net.openhft.chronicle.wire.channel package in &lt;a href="https://chronicle.software/wire/?utm_source=article&amp;amp;amp;utm_medium=foojay&amp;amp;amp;utm_campaign=java-is-fast" title="Chronicle Wire" target="_blank" rel="noopener noreferrer"&gt;Chronicle Wire&lt;/a&gt;
 and why we aim to avoid object allocations.&lt;/p&gt;
&lt;p&gt;One of the key optimisations is creating almost no garbage. Allocation is supposed to be a very cheap operation and garbage collection of very short lived objects is also very cheap.&lt;/p&gt;
&lt;p&gt;Does not allocating really make such a difference? What difference does one small object per event (44 bytes) make to the performance in a throughput test where GC pauses are amortised?&lt;/p&gt;</description></item><item><title>Rolling Binary Trees: A Guide to Common Design Patterns in Java</title><link>https://foojayio.github.io/website/today/rolling-binary-trees-a-guide-to-common-design-patterns-in-java/</link><pubDate>Wed, 24 May 2023 12:55:14 +0000</pubDate><guid>https://foojayio.github.io/website/today/rolling-binary-trees-a-guide-to-common-design-patterns-in-java/</guid><description>&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Binary trees are fundamental data structures, ubiquitous in computer science and software engineering. We use them to represent hierarchical data and implement more complex data structures, such as search trees, syntax trees, cryptographic hash trees, space partitioning trees, heaps, and so on. Common binary tree operations include insertion, deletion, traversal, and rotation.&lt;/p&gt;
&lt;p&gt;A relatively uncommon and unexplored operation is &lt;strong&gt;roll&lt;/strong&gt; , which modifies the structure of a binary tree in such a way that, when visualized, the newly obtained structure appears to be rolled at a 90-degree angle, either clockwise or counterclockwise. This gives us two variants of the roll operation &amp;mdash; &lt;strong&gt;clockwise roll&lt;/strong&gt; (CR) and &lt;strong&gt;counterclockwise roll&lt;/strong&gt; (CCR).&lt;/p&gt;</description></item><item><title>"Transitioning to Java": My First Book!</title><link>https://foojayio.github.io/website/today/transitioning-to-java-my-first-book/</link><pubDate>Wed, 24 May 2023 08:01:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/transitioning-to-java-my-first-book/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/transitioning-to-java-my-first-book/BookCover-407x510.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;When I retired from the classroom in 2021, I had no intention of sitting on a rocking chair on my front porch.&lt;/p&gt;
&lt;p&gt;I looked for speaking opportunities, became a member of the JCP EC, and continued thinking about ways to enhance Java teaching.&lt;/p&gt;
&lt;p&gt;I also wanted to write a book. I approached a number of publishers with my idea for a beginner&amp;rsquo;s book. I even wrote a sample chapter and publsihed it on my blog, &lt;a href="https://www.omnijava.com/2021/10/20/java-for-beginners-my-unsuccessful-book-proposal/" target="_blank" rel="noopener noreferrer"&gt;https://www.omnijava.com/2021/10/20/java-for-beginners-my-unsuccessful-book-proposal/&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Foojay Developer Certification: Measure Skills!</title><link>https://foojayio.github.io/website/today/foojay-developer-certification-measure-skills/</link><pubDate>Tue, 23 May 2023 16:32:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-developer-certification-measure-skills/</guid><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;Learn the why and how of a group of enthusiastic people implementing a new sort of developer certification that objectively measures dev skills. We also invite you to join our initiative if you&amp;rsquo;re interested via #certification &lt;a href="https://bit.ly/join-foojay-slack" target="_blank" rel="noopener noreferrer"&gt;on the Foojay slack&lt;/a&gt;
.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a lot of debate about what defines a &amp;lsquo;good&amp;rsquo; developer. Of course, there are different dimensions to start with. Perhaps you can say there are two main ones: soft and technical skills. Soft skills include collaboration skills, communication, organizational sensitivity, personal leadership and so on.&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>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>Write Once, Run Embedded in any IDE</title><link>https://foojayio.github.io/website/today/write-once-run-embedded-in-any-ide/</link><pubDate>Tue, 16 May 2023 13:34:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/write-once-run-embedded-in-any-ide/</guid><description>&lt;p&gt;&lt;a href="https://foojayio.github.io/website/time-zones.png"&gt;&lt;img src="https://foojayio.github.io/website/today/write-once-run-embedded-in-any-ide/time-zones-1024x192.png" alt="Same Time Zones application running in IntelliJ IDEA, Eclipse and NetBeans" title="Same application running in IntelliJ IDEA, Eclipse and NetBeans" loading="lazy"&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Having written many Java GUI applications, I thought it would be cool to run them embedded in IntelliJ IDEA, Eclipse and NetBeans. I didn&amp;rsquo;t want to write three plugins per application so I came up with this solution.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="h2-0-the-embedded-panel-criteria"&gt;The embedded panel criteria&lt;/h2&gt;
&lt;p&gt;To convert my Java Swing applications to run embedded in an IDE, I had to put the user interface in a panel with minimal implementation changes. I came up with these &lt;em&gt;should ideally&lt;/em&gt; criteria:&lt;/p&gt;</description></item><item><title>Monitoring Event Loops for Blockages</title><link>https://foojayio.github.io/website/today/monitoring-event-loops-for-blockages/</link><pubDate>Mon, 15 May 2023 16:42:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/monitoring-event-loops-for-blockages/</guid><description>&lt;p&gt;Chronicle&amp;rsquo;s open source &lt;a href="https://github.com/OpenHFT/Chronicle-Threads" title="Chronicle Threads " target="_blank" rel="noopener noreferrer"&gt;Chronicle Threads&lt;/a&gt;
library has a little known feature which is one of the first tools I get from my bag if a client reports that they are seeing latency outliers.&lt;/p&gt;
&lt;p&gt;The usual way that a developer will measure their system for latency hotspots is to use a profiler, and modern profilers are amazing; there are numerous commercially available, but I generally find myself using Java Flight Recorder, async-profiler, or honest-profiler. These three are engineered to avoid the &lt;a href="https://stackoverflow.com/questions/17839933/what-are-safe-points-and-safe-point-polling-in-context-of-profiling" title="safepoint bias" target="_blank" rel="noopener noreferrer"&gt;safepoint bias&lt;/a&gt;
, and thus give very accurate results.&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>Unconventional Remote Process Control in Java</title><link>https://foojayio.github.io/website/today/presenting-xpipe/</link><pubDate>Mon, 08 May 2023 14:03:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/presenting-xpipe/</guid><description>&lt;p&gt;Have you ever wanted to control a remote process from a Java application? Essentially something like a &lt;code&gt;ProcessBuilder&lt;/code&gt; for remote systems that allows you to run and configure a process on almost any system and also supports all regular features that you would expect from it.&lt;/p&gt;
&lt;p&gt;Now obviously, this isn&amp;rsquo;t a revolutionary idea. You can easily take an SSH library like the &lt;a href="https://github.com/mwiede/jsch" target="_blank" rel="noopener noreferrer"&gt;newer jsch fork&lt;/a&gt;
 and use the &lt;code&gt;exec&lt;/code&gt; or &lt;code&gt;shell&lt;/code&gt; channel to control remote processes or remote shells by just copying and pasting some tutorial code. So what is this about then?&lt;/p&gt;</description></item><item><title>Interview with Paul Kocian aka Orango_Mango</title><link>https://foojayio.github.io/website/today/interview-with-paul-kocian-aka-orango_mango/</link><pubDate>Mon, 08 May 2023 07:49:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/interview-with-paul-kocian-aka-orango_mango/</guid><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;Some time ago on Twitter, I discovered &lt;a href="https://twitter.com/orango_mango" target="_blank" rel="noopener noreferrer"&gt;@Orango_Mango&lt;/a&gt;
, who shared his progress in creating a 3D engine with JavaFX. The shared videos started with a &lt;a href="https://twitter.com/orango_mango/status/1610894079654563843" target="_blank" rel="noopener noreferrer"&gt;Rubik&amp;rsquo;s cube in January &amp;lsquo;23&lt;/a&gt;
, over a &lt;a href="https://twitter.com/orango_mango/status/1620493609287172096" target="_blank" rel="noopener noreferrer"&gt;basic tumbling car in February&lt;/a&gt;
, to a &lt;a href="https://twitter.com/orango_mango/status/1646218237535813639" target="_blank" rel="noopener noreferrer"&gt;full Minecraft-like world in April&lt;/a&gt;
. Who is this @OrangoMango? And why did he take up the challenge to create a 3D engine with Java and JavaFX? Let&amp;rsquo;s find out&amp;hellip;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Spring Boot Debugging with Aspect-Oriented Programming (AOP)</title><link>https://foojayio.github.io/website/today/spring-boot-debugging-with-aspect-oriented-programming-aop/</link><pubDate>Fri, 05 May 2023 08:19:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-debugging-with-aspect-oriented-programming-aop/</guid><description>&lt;p&gt;Aspect-Oriented Programming (AOP) is a programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns.&lt;/p&gt;
&lt;p&gt;In simple terms, it helps you keep your code clean, modular, and easy to maintain.&lt;/p&gt;
&lt;p&gt;We can leverage AOP to debug Spring Boot applications more effectively and seamlessly.&lt;/p&gt;
&lt;p&gt;In this post, we will explore how to use AOP to debug a Spring Boot application effectively.&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/6kxpkcEqssw?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;br /&gt;
&lt;h2 id="h2-0-aop-concepts"&gt;AOP Concepts&lt;/h2&gt;
&lt;p&gt;Before diving into debugging with AOP, it is essential to understand the core concepts. AOP lets us write code that executes before or after a method. It includes the following common terms:&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>Hidden and Not-So-Hidden Gems In Java 20</title><link>https://foojayio.github.io/website/today/hidden-and-not-so-hidden-gems-in-java-20/</link><pubDate>Wed, 03 May 2023 14:32:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/hidden-and-not-so-hidden-gems-in-java-20/</guid><description>&lt;p&gt;&lt;strong&gt;Let&amp;rsquo;s see the preview and incubator JEPs in Java 20, as well as many smaller enhancements, bug fixes, and deprecations.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;March 2023 marked the latest feature release of the Java platform, which was delivered on time through the six-month release cadence as Java 20. Like Java 19, which became generally available in September 2022, Java 20 targeted JEPs&amp;mdash;seven, in this case&amp;mdash;from the &lt;a href="https://openjdk.org/projects/panama/" target="_blank" rel="noopener noreferrer"&gt;Panama&lt;/a&gt;
, &lt;a href="https://openjdk.org/projects/amber/" target="_blank" rel="noopener noreferrer"&gt;Amber&lt;/a&gt;
, and &lt;a href="https://wiki.openjdk.org/display/loom" target="_blank" rel="noopener noreferrer"&gt;Loom&lt;/a&gt;
 projects.&lt;/p&gt;
&lt;p&gt;I am using the Java 20 jshell tool to demonstrate the code in this article. To follow along, &lt;a href="https://foojayio.github.io/website/download/"&gt;download JDK 20&lt;/a&gt;
, fire up your terminal, check your version, and run jshell. Note that you might see a newer version of the JDK; that&amp;rsquo;s okay.&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>Creating Scalable OpenAI GPT Applications in Java</title><link>https://foojayio.github.io/website/today/creating-scalable-openai-gpt-applications-in-java/</link><pubDate>Thu, 27 Apr 2023 14:18:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/creating-scalable-openai-gpt-applications-in-java/</guid><description>&lt;p&gt;One of the more notable aspects of ChatGPT is its engine, which not only powers the web-based chatbot but can also be integrated into your Java applications.&lt;/p&gt;
&lt;p&gt;Whether you prefer reading or watching, let&amp;rsquo;s review how to start using the OpenAI GPT engine in your Java projects in a scalable way, by sending prompts to the engine only when necessary:&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/8bpIXrz7xJw?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;br /&gt;
&lt;p&gt;Imagine you want to visit a city and have a specific budget in mind. How should you spend the money and make your trip memorable? This is an excellent question to delegate to the OpenAI engine.&lt;/p&gt;</description></item><item><title>Approaches to Durability in Low Latency Messaging Queues</title><link>https://foojayio.github.io/website/today/comparing-approaches-to-durability-in-low-latency-messaging-queues/</link><pubDate>Wed, 26 Apr 2023 13:17:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/comparing-approaches-to-durability-in-low-latency-messaging-queues/</guid><description>&lt;p&gt;A significant feature of &lt;a href="https://chronicle.software/queue-enterprise/?utm_source=foojay&amp;amp;amp;utm_medium=article&amp;amp;amp;utm_campaign=comparing-approaches" title="Chronicle Queue Enterprise" target="_blank" rel="noopener noreferrer"&gt;Chronicle Queue Enterprise&lt;/a&gt;
 is support for TCP replication across multiple servers to ensure high availability of application infrastructure.&lt;/p&gt;
&lt;p&gt;I have generally held the view that replicating data to a secondary system is faster than sync-ing to disk, assuming the round trip network delay wasn&amp;rsquo;t high due to quality networks and co-located redundant servers.&lt;/p&gt;
&lt;p&gt;This is the first time I have benchmarked it with a realistic example.&lt;/p&gt;</description></item><item><title>Relearning Java Thread Primitives</title><link>https://foojayio.github.io/website/today/relearning-java-thread-primitives/</link><pubDate>Tue, 25 Apr 2023 05:26:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/relearning-java-thread-primitives/</guid><description>&lt;p&gt;I&amp;rsquo;ve coded in Java since the first beta, even back then threads were at the top of my list of favorite features.&lt;/p&gt;
&lt;p&gt;Java was the first language to introduce thread support in the language itself, it was a controversial decision back then.&lt;/p&gt;
&lt;p&gt;In the past decade, every language raced to include async/await and &lt;a href="https://github.com/awaitility/awaitility" target="_blank" rel="noopener noreferrer"&gt;even Java had some third-party support for that&lt;/a&gt;
&amp;hellip;&lt;/p&gt;
&lt;p&gt;But Java zigged instead of zagging and introduced the far superior &lt;a href="https://www.youtube.com/watch?v=4mf24mzm0ks" target="_blank" rel="noopener noreferrer"&gt;virtual threads (project Loom)&lt;/a&gt;
. This article isn&amp;rsquo;t about that.&lt;/p&gt;</description></item><item><title>A Java Library’s New Approach To Observability</title><link>https://foojayio.github.io/website/today/not-your-grandfathers-logs-a-java-librarys-new-approach-to-observability/</link><pubDate>Tue, 18 Apr 2023 08:10:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/not-your-grandfathers-logs-a-java-librarys-new-approach-to-observability/</guid><description>&lt;h3 id="h3-0-how-a-java-library-is-taking-a-completely-new-approach-to-understanding-what-the-code-does-and-why-it-makes-perfect-developer-sense"&gt;How a Java library is taking a completely new approach to understanding what the code does, and why it makes perfect developer sense.&lt;/h3&gt;
&lt;p&gt;A while back, I &lt;a href="https://medium.com/gitconnected/breaking-the-fourth-wall-in-coding-189055955c85" title="wrote" target="_blank" rel="noopener noreferrer"&gt;wrote&lt;/a&gt;
 about the fact that logs need an overhaul, and that practices that were relevant when logs were still text messages in files may no longer be relevant in an age when logs traces and metrics are as artifacts and observations stored in cloud platforms.&lt;/p&gt;</description></item><item><title>Time Zone and Currency Database in JDK</title><link>https://foojayio.github.io/website/today/time-zone-and-currency-database-in-jdk/</link><pubDate>Sat, 08 Apr 2023 13:39:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/time-zone-and-currency-database-in-jdk/</guid><description>&lt;p&gt;There is a saying that you aren&amp;rsquo;t a real developer until you have done programming involving dates, times, daylight savings, and time zones.&lt;/p&gt;
&lt;p&gt;Luckily the JDK contains multiple methods to assist you.&lt;/p&gt;
&lt;p&gt;Related to this topic, it is essential to understand that each new JDK release includes a new version of the time zone and currency database.&lt;/p&gt;
&lt;p&gt;As we will discover, you can get correct output by just switching to the most up-to-date version of Java &amp;ndash; without changing code!&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>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>Event-Driven Order Processing Program</title><link>https://foojayio.github.io/website/today/event-driven-order-processing-program/</link><pubDate>Thu, 23 Mar 2023 09:27:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/event-driven-order-processing-program/</guid><description>&lt;p&gt;Following the &lt;a href="https://foojayio.github.io/website/today/event-driven-hello-world-program/" title="Hello World example"&gt;Hello World example&lt;/a&gt;
 of a simple, independently deployable real-time Event-Driven Microservice, this article looks at a more realistic example of an Order Processor with a New Order Single in and an Execution Report out.&lt;/p&gt;
&lt;p&gt;A &lt;a href="https://www.onixs.biz/fix-dictionary/4.4/msgtype_d_68.html" title="New Order Single" target="_blank" rel="noopener noreferrer"&gt;New Order Single&lt;/a&gt;
 is a standard message type for the order of one asset in the FIX protocol used widely by financial institutions such as banks.&lt;/p&gt;
&lt;p&gt;The reply is typically one or more &lt;a href="https://www.onixs.biz/fix-dictionary/4.2/msgtype_8_8.html" title="Execution Reports" target="_blank" rel="noopener noreferrer"&gt;Execution Reports&lt;/a&gt;
 updating the status of that order.&lt;/p&gt;</description></item><item><title>It's Java 20 Release Day! Here's What's New | foojay.io Today</title><link>https://foojayio.github.io/website/today/its-java-20-release-day-heres-whats-new/</link><pubDate>Tue, 21 Mar 2023 06:40:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/its-java-20-release-day-heres-whats-new/</guid><description>&lt;p&gt;This will be a good day, because it&amp;rsquo;s Java 20 release day!&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s been six months since Java 19 was released, and so it&amp;rsquo;s time for another fresh wave of Java features.&lt;/p&gt;
&lt;p&gt;In this article, we will take you on a tour through all JEPs that come with this release and give you a brief introduction of each one of them.&lt;/p&gt;
&lt;p&gt;Where applicable the differences with Java 19 are highlighted and a few typical use cases are provided, so that you&amp;rsquo;ll be more than ready to use these features after you&amp;rsquo;ve finished reading!&lt;/p&gt;</description></item><item><title>Foojay Podcast #16: Welcome to Java 20!</title><link>https://foojayio.github.io/website/today/foojay-podcast-16/</link><pubDate>Mon, 20 Mar 2023 08:00:14 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-16/</guid><description>&lt;p&gt;Since 2018, we get a new version of Java every 6 months.&lt;/p&gt;
&lt;p&gt;Some are long-term supported versions that can be used for many years, while others are only maintained for a short time. Version 20 is such a short-term supported version.&lt;/p&gt;
&lt;p&gt;So, what new features does this version bring? And why should we use it? And what can we expect from the next version, 21, in September that will be a long-term supported version?&lt;/p&gt;</description></item><item><title>Book Review: "API Design Patterns"</title><link>https://foojayio.github.io/website/today/book-review-api-design-patterns/</link><pubDate>Sun, 19 Mar 2023 15:20:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/book-review-api-design-patterns/</guid><description>&lt;p&gt;&lt;em&gt;Disclaimer: this post includes affiliate links; I may receive compensation if you purchase the book from the different links provided in this post.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This review is about &lt;a href="https://www.manning.com/books/api-design-patterns?utm_source=frankel&amp;amp;amp;utm_medium=affiliate&amp;amp;amp;utm_campaign=affiliate&amp;amp;amp;a_aid=frankel" target="_blank" rel="noopener noreferrer"&gt;API Design Patterns&lt;/a&gt;
 by JJ Geewax from Manning.&lt;/p&gt;
&lt;p&gt;I &lt;a href="https://blog.frankel.ch/structured-errors-http-apis/" target="_blank" rel="noopener noreferrer"&gt;already mentioned&lt;/a&gt;
 how I&amp;rsquo;m trying to get to speed in the API world: reading books, viewing relevant YouTube videos and reading relevant s.&lt;/p&gt;
&lt;h2 id="h2-0-facts"&gt;Facts&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;30 chapters, $35.00&lt;/li&gt;
&lt;li&gt;The author is a Principal Software Engineer at Google&lt;/li&gt;
&lt;li&gt;He&amp;rsquo;s also the author behind&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-1-chapters"&gt;Chapters&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Introduction&lt;/li&gt;
&lt;li&gt;Design principles
3. Naming
4. Resource scope and hierarchy
5. Data types and defaults&lt;/li&gt;
&lt;li&gt;Fundamentals
6. Resource identification: How to identify resources in an API
7. Standard methods: The set of standard methods for use in resource-oriented APIs
8. Partial updates and retrievals: How to interact with portions of resources
9. Custom methods: Using custom (non-standard) methods in resource-oriented APIs
10. Long-running operations: How to handle methods that are not instantaneous
11. Rerunnable jobs: Running repeated custom functionality in an API&lt;/li&gt;
&lt;li&gt;Resource relationships
12. Singleton sub-resources: Isolating portions of resource data
13. Cross references: How to reference other resources in an API
14. Association resources: How to manage many-to-many relationships with metadata
15. Add and remove custom methods: How to manage many-to-many relationships &lt;em&gt;without&lt;/em&gt; metadata
16. Polymorphism: Designing resources with dynamically-typed attributes&lt;/li&gt;
&lt;li&gt;Collective operations
17. Copy and move: Duplicating and relocating resources in an API
18. Batch operations: Extending methods to apply to groups of resources atomically
19. Criteria-based deletion: Deleting multiple resources based on a set of filter criteria
20. Anonymous writes: Ingesting unaddressable data into an API
21. Pagination: Consuming large amounts of data in bite-sized chunks
22. Filtering: Limiting result sets according to a user-specified filter
23. Importing and exporting: Moving data into or out of an API by interacting directly with a storage system&lt;/li&gt;
&lt;li&gt;Safety and security
24. Versioning and compatibility: Defining compatibility and strategies for versioning APIs
25. Soft deletion: Moving resources to the &amp;ldquo;API recycle bin&amp;rdquo;
26. Request deduplication: Preventing duplicate work due to network interruptions in APIs
27. Request validation: Allowing API methods to be called in &amp;ldquo;safe mode&amp;rdquo;
28. Resource revisions: Tracking resource change history
29. Request retrial: Algorithms for safely retrying API requests
30. Request authentication: Verifying that requests are authentic and untampered with&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each &lt;em&gt;design pattern&lt;/em&gt; chapter follows the same structure:&lt;/p&gt;</description></item><item><title>Book review - Practical Design Patterns for Java Developers</title><link>https://foojayio.github.io/website/today/book-review-practical-design-patterns-for-java-developers/</link><pubDate>Fri, 17 Mar 2023 08:27:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/book-review-practical-design-patterns-for-java-developers/</guid><description>&lt;h2 id="h2-0-hone-your-software-design-skills-by-implementing-popular-design-patterns-in-java"&gt;Hone your software design skills by implementing popular design patterns in Java&lt;/h2&gt;
&lt;p&gt;This book is for sale on &lt;a href="https://www.amazon.de/dp/180461467X" target="_blank" rel="noopener noreferrer"&gt;Amazon in Kindle and Paperback editions&lt;/a&gt;
.&lt;/p&gt;
&lt;figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex"&gt;
 &lt;figure class="wp-block-image size-large"&gt;
 &lt;img fetchpriority="high" decoding="async" width="830" height="1024" data-id="62853" src="practical-cover-830x1024.jpg" alt="" class="wp-image-62853"&gt;
 &lt;/figure&gt;
 &lt;figure class="wp-block-image size-large"&gt;
 &lt;img decoding="async" width="600" height="740" data-id="62852" src="practical-backside.jpg" alt="" class="wp-image-62852"&gt;
 &lt;/figure&gt;
 &lt;figure class="wp-block-image size-large"&gt;
 &lt;img decoding="async" width="426" height="426" data-id="62851" src="miro.jpg" alt="" class="wp-image-62851"&gt;
 &lt;/figure&gt;
&lt;/figure&gt;
&lt;p&gt;We&amp;rsquo;ll start this post with the personal verdict of two avid readers of this book:&lt;/p&gt;
&lt;h2 id="h2-1-frank-delporte-s-verdict"&gt;Frank Delporte&amp;rsquo;s Verdict&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve been programming since I was 10y old, but I graduated from film school as a video editor, so I never learned the &amp;ldquo;official&amp;rdquo; way to be a programmer. It was only by following courses and, most importantly, learning from colleagues that I started making &amp;ldquo;readable and maintainable&amp;rdquo; code, which is precisely the topic of this book.&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>How Gradle Works: Inside the Daemon</title><link>https://foojayio.github.io/website/today/how-gradle-works-inside-the-daemon/</link><pubDate>Tue, 14 Mar 2023 11:27:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-gradle-works-inside-the-daemon/</guid><description>&lt;p&gt;Previously in the &lt;em&gt;How Gradle Works&lt;/em&gt;series:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/how-gradle-works-startup/"&gt;How Gradle Works: Startup&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is the second article of the series &lt;em&gt;How Gradle Works&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll explain what happens inside the &lt;code&gt;Gradle Daemon JVM&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="h2-0-why-do-we-need-gradle-daemon"&gt;Why Do We Need Gradle Daemon?&lt;/h2&gt;
&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/how-gradle-works-startup/"&gt;the last article&lt;/a&gt;
, we mentioned that Gradle starts a &lt;code&gt;Gradle Daemon JVM&lt;/code&gt; (&amp;ldquo;the daemon&amp;rdquo;) to run the build.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.gradle.org/current/userguide/gradle_daemon.html" target="_blank" rel="noopener noreferrer"&gt;The userguide&lt;/a&gt;
 explains why we need the daemon.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Daemon is a long-lived background process that reduces the time it takes to run a build. The Daemon reduces build times by caching project information across builds, running in the background so every Gradle build doesn&amp;rsquo;t have to wait for JVM startup, benefiting from continuous runtime optimization in the JVM, and watching the file system to calculate exactly what needs to be rebuilt before you run a build.&lt;/p&gt;</description></item><item><title>9 Outdated Ideas About Java</title><link>https://foojayio.github.io/website/today/9-outdated-ideas-about-java/</link><pubDate>Sat, 11 Mar 2023 08:56:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/9-outdated-ideas-about-java/</guid><description>&lt;p&gt;Since the first release of Java in 1995, a lot has changed in both software and hardware, and each evolution impacts the next.&lt;/p&gt;
&lt;p&gt;Powerful processors and cheaper memory allow software to do more and do it faster.&lt;/p&gt;
&lt;p&gt;As Azul Deputy CTO Simon Ritter says, &amp;ldquo;&lt;em&gt;&lt;strong&gt;Java shows no danger of becoming the new COBOL. By adding new features to the platform under the six-month release cadence, we are seeing Java evolve faster than ever before.&lt;/strong&gt;&lt;/em&gt;&amp;rdquo;&lt;/p&gt;</description></item><item><title>How to Best Use Java Records as DTOs in Spring Boot 3</title><link>https://foojayio.github.io/website/today/how-to-best-use-java-records-as-dtos-in-spring-boot-3/</link><pubDate>Thu, 09 Mar 2023 17:06:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-best-use-java-records-as-dtos-in-spring-boot-3/</guid><description>&lt;p&gt;With the Spring 6 and Spring Boot 3 releases, &lt;a href="https://spring.io/blog/2022/11/16/spring-framework-6-0-goes-ga" title="Java 17&amp;#43; became the baseline framework" target="_blank" rel="noopener noreferrer"&gt;Java 17+ became the baseline framework&lt;/a&gt;
 version.&lt;/p&gt;
&lt;p&gt;So now is a great time to start using compact &lt;a href="https://docs.oracle.com/en/java/javase/14/language/records.html" title="Java Records" target="_blank" rel="noopener noreferrer"&gt;Java Records&lt;/a&gt;
 as Data Transfer Objects (&lt;a href="https://en.wikipedia.org/wiki/Data_transfer_object" title="DTOs" target="_blank" rel="noopener noreferrer"&gt;DTOs&lt;/a&gt;
) for various database and API calls.&lt;/p&gt;
&lt;p&gt;Whether you prefer reading or watching, let&amp;rsquo;s review a few approaches for using Java records as DTOs that apply to Spring Boot 3 with Hibernate 6 as the persistence provider.&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>42 Practical Java Design Patterns: Builder and More</title><link>https://foojayio.github.io/website/today/42-practical-java-design-patterns-builder-and-more/</link><pubDate>Mon, 27 Feb 2023 08:27:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/42-practical-java-design-patterns-builder-and-more/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/42-practical-java-design-patterns-builder-and-more/book_cover-414x510.jpeg" alt="Figure 1: Hone your software design skills" loading="lazy"&gt;
 &lt;strong&gt;Figure 1&lt;/strong&gt;.: Hone your software design skills&lt;/p&gt;
&lt;p&gt;The aim of the article is to introduce my newly published book &amp;ldquo;Practical Design Pattern for Java Developers&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Together, we&amp;rsquo;ll explore today&amp;rsquo;s application development challenges and dive deeper into some of Java&amp;rsquo;s new language enhancements by exploring the &lt;strong&gt;Builder&lt;/strong&gt; Design pattern in more detail.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;T&lt;/strong&gt;he days when applications were developed &amp;ldquo;ad hoc&amp;rdquo; seem to have ended only on paper.&lt;/p&gt;</description></item><item><title>Journeys in Java, Level 9: Docker compose all the things</title><link>https://foojayio.github.io/website/today/journeys-in-java-level-9-docker-compose-all-the-things/</link><pubDate>Sun, 26 Feb 2023 10:02:15 +0000</pubDate><guid>https://foojayio.github.io/website/today/journeys-in-java-level-9-docker-compose-all-the-things/</guid><description>&lt;p&gt;Our microservices project contains quite a few pieces now.&lt;/p&gt;
&lt;p&gt;We have two databases, three API services, a user-view service for books, and a service to host our configuration.&lt;/p&gt;
&lt;p&gt;With so many pieces to manage, it would be nice to have something that orchestrates the individual services into a system, such as Docker Compose.&lt;/p&gt;
&lt;p&gt;Back in our &lt;a href="https://foojayio.github.io/website/today/journeys-in-java-level-5-building-an-empire-of-microservices/"&gt;Level 5&lt;/a&gt;
 rendition, we did exactly this for our smaller version of the project.&lt;/p&gt;
&lt;p&gt;Now that we have expanded our services, we need to add those new pieces into the existing Docker Compose management umbrella.&lt;/p&gt;</description></item><item><title>Update or Upgrade Java... and Which Version Should You Use?</title><link>https://foojayio.github.io/website/today/should-you-update-java-or-upgrade-and-which-version-should-you-use/</link><pubDate>Thu, 23 Feb 2023 09:12:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/should-you-update-java-or-upgrade-and-which-version-should-you-use/</guid><description>&lt;h2 id="h2-0-update-versus-upgrade-what-s-the-difference-and-what-are-the-consequences-of-your-decision"&gt;&lt;em&gt;Update versus Upgrade: what&amp;rsquo;s the difference and what are the consequences of your decision?&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;Since 2018, every six months we get an upgrade to a new OpenJDK version, and this year versions 20 and 21 will be released.&lt;/p&gt;
&lt;p&gt;Next to these six-month releases, OpenJDK distributor Azul, amongst others, provides four critical patch updates (CPU) and patch set updates (PSU) per year.&lt;/p&gt;
&lt;p&gt;So what&amp;rsquo;s the difference between a Java upgrade and an update?&lt;/p&gt;</description></item><item><title>Is There a Best OS to Develop a Java Application on?</title><link>https://foojayio.github.io/website/today/is-there-a-best-os-to-develop-a-java-application-on/</link><pubDate>Wed, 22 Feb 2023 11:43:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/is-there-a-best-os-to-develop-a-java-application-on/</guid><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;One subject that often evokes a lot of debate is which is the best OS to develop a Java application on. This article gives my view on the issue.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Java runs very well on Windows, macOS and Linux Distributions.&lt;/p&gt;
&lt;p&gt;I work for &lt;a href="https://ga-dev-tools.web.app/campaign-url-builder/" title="Chronicle Software" target="_blank" rel="noopener noreferrer"&gt;Chronicle Software&lt;/a&gt;
, and much of our software is open-source Java libraries, so we don&amp;rsquo;t, or rather we can&amp;rsquo;t, require our customers to run on a particular operating system. You may be surprised to hear that we don&amp;rsquo;t mandate which operating system our staff should use either. We let them use the one that causes the least friction, the one that they are most productive with.&lt;/p&gt;</description></item><item><title>An Introduction to Scoped Values in Java</title><link>https://foojayio.github.io/website/today/an-introduction-to-scoped-values-in-java/</link><pubDate>Mon, 20 Feb 2023 11:32:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/an-introduction-to-scoped-values-in-java/</guid><description>&lt;p&gt;After moving to the six-month release cadence, the Java language has entered a rapid development process.&lt;/p&gt;
&lt;p&gt;While the process introduces many new features, these new features sometimes cause updates to existing APIs and sometimes result in the development of new APIs.&lt;/p&gt;
&lt;p&gt;An example of the second is &lt;a href="https://openjdk.org/jeps/429" title="Scoped Values" target="_blank" rel="noopener noreferrer"&gt;Scoped Values&lt;/a&gt;
 which has been included in the JDK since Java 20 as an incubator API.&lt;/p&gt;
&lt;h3 id="h3-0-why-were-scoped-values-proposed"&gt;Why were Scoped Values proposed?&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://openjdk.org/jeps/425" title="Virtual threads" target="_blank" rel="noopener noreferrer"&gt;Virtual threads&lt;/a&gt;
 became a part of JDK as a preview feature in Java 19.&lt;/p&gt;</description></item><item><title>Java Sealed Classes: Building Robust and Secure Applications</title><link>https://foojayio.github.io/website/today/java-sealed-classes-in-action-building-robust-and-secure-applications/</link><pubDate>Mon, 20 Feb 2023 11:11:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-sealed-classes-in-action-building-robust-and-secure-applications/</guid><description>&lt;p&gt;Java sealed classes were introduced in Java 15 as a way to restrict the inheritance hierarchy of a class or interface.&lt;/p&gt;
&lt;p&gt;A sealed class or interface restricts the set of classes that can implement or extend it, which can help prevent bugs and make code more maintainable.&lt;/p&gt;
&lt;p&gt;Suppose you&amp;rsquo;re building an e-commerce application that supports different payment methods, such as credit cards, PayPal, and Bitcoin. You could define a sealed class called PaymentMethod that permits various subclasses for each payment method:&lt;/p&gt;</description></item><item><title>Foojay Podcast #14: Debugging Tools and Skills for Fun and Profit</title><link>https://foojayio.github.io/website/today/foojay-podcast-14/</link><pubDate>Mon, 20 Feb 2023 08:29:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-14/</guid><description>&lt;p&gt;Let&amp;rsquo;s talk about debugging and observability.&lt;/p&gt;
&lt;p&gt;We work with debugging all the time, but how well do we know this common practice?&lt;/p&gt;
&lt;p&gt;Observability, monitoring, and debugging at scale for your production&amp;hellip;&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/ozcC3scY0Ig?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;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://open.spotify.com/show/6CpTfgn9LirzJGAtc4ICdQ" target="_blank" rel="noopener noreferrer"&gt;Spotify&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://podcasts.apple.com/be/podcast/foojay-io-the-friends-of-openjdk/id1652281304" target="_blank" rel="noopener noreferrer"&gt;Apple Podcasts&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;And most others&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-1-guests"&gt;Guests&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A lot of rubber ducks&lt;/li&gt;
&lt;li&gt;Johannes Bechberger
&lt;ul&gt;
&lt;li&gt;JVM and profiler developer&lt;/li&gt;
&lt;li&gt;Worked on the JDWP protocol and profiling&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/parttimenerd" target="_blank" rel="noopener noreferrer"&gt;https://github.com/parttimenerd&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/parttimen3rd" target="_blank" rel="noopener noreferrer"&gt;https://twitter.com/parttimen3rd&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mastodon.social/@parttimenerd" target="_blank" rel="noopener noreferrer"&gt;https://mastodon.social/@parttimenerd&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&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;AsyncGetStackTrace: A better Stack Trace API for the JVM&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mostlynerdless.de/blog/2022/12/27/a-short-primer-on-java-debugging-internals/" target="_blank" rel="noopener noreferrer"&gt;A short primer on Java debugging internals&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Marit van Dijk
&lt;ul&gt;
&lt;li&gt;Developer Advocate at JetBrains&lt;/li&gt;
&lt;li&gt;&lt;a href="https://maritvandijk.com/" target="_blank" rel="noopener noreferrer"&gt;https://maritvandijk.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/MaritvanDijk77" target="_blank" rel="noopener noreferrer"&gt;https://twitter.com/MaritvanDijk77&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mastodon.social/@maritvandijk" target="_blank" rel="noopener noreferrer"&gt;https://mastodon.social/@maritvandijk&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ties van de Ven
&lt;ul&gt;
&lt;li&gt;Software Engineer @ JDriven, Coach @ Jcore&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tiesvandeven.nl/" target="_blank" rel="noopener noreferrer"&gt;https://www.tiesvandeven.nl/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/ties_ven" target="_blank" rel="noopener noreferrer"&gt;https://twitter.com/ties_ven&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.jdriven.com/2017/10/6-steps-to-help-you-debug-your-application/" target="_blank" rel="noopener noreferrer"&gt;6 Steps to help you debug your application&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-2-host"&gt;Host&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Shai Almog
&lt;ul&gt;
&lt;li&gt;Author of &amp;ldquo;&lt;a href="https://www.amazon.com/dp/1484290410/" target="_blank" rel="noopener noreferrer"&gt;Practical Debugging at Scale&lt;/a&gt;
&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://debugagent.com/" target="_blank" rel="noopener noreferrer"&gt;https://debugagent.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mastodon.social/@debugagent" target="_blank" rel="noopener noreferrer"&gt;https://mastodon.social/@debugagent&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/debugagent" target="_blank" rel="noopener noreferrer"&gt;https://twitter.com/debugagent&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-3-producer"&gt;Producer&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Frank Delporte
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://foojay.social/@frankdelporte" target="_blank" rel="noopener noreferrer"&gt;https://foojay.social/@frankdelporte&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/frankdelporte" target="_blank" rel="noopener noreferrer"&gt;https://twitter.com/frankdelporte&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-4-content"&gt;Content&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;00'00 Intro and music&lt;/li&gt;
&lt;li&gt;00'24 About the topic of this podcast&lt;/li&gt;
&lt;li&gt;00'58 Introduction of the guests and host&lt;/li&gt;
&lt;li&gt;05'14 Debugging with IntelliJ IDEA and discoverability of tools
&lt;ul&gt;
&lt;li&gt;YouTube: &lt;a href="https://www.youtube.com/watch?v=59RC8gVPlvk&amp;amp;list=PLPZy-hmwOdEUWF85MuwrKV8YVWLmZW4ZA" target="_blank" rel="noopener noreferrer"&gt;Debugger playlist&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;YouTube: &lt;a href="https://www.youtube.com/watch?v=OQcyAtukps4" target="_blank" rel="noopener noreferrer"&gt;Profiling tools&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;YouTube: &lt;a href="https://www.youtube.com/watch?v=TDpbt4thECc" target="_blank" rel="noopener noreferrer"&gt;Profiling live stream&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;13'27 JDWP protocol
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dzone.com/articles/remote-debugging-java-applications-with-jdwp" target="_blank" rel="noopener noreferrer"&gt;DZone: Remote Debugging Java Applications With JDWP&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/psa-the-risks-of-remote-jdwp-debugging/"&gt;Foojay: PSA: The Risks of Remote JDWP Debugging&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/a-short-primer-on-java-debugging-internals/"&gt;Foojay: A Short Primer on Java Debugging Internals&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;19'43 Exception breakpoints
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/exception-breakpoint-that-doesnt-suck-and-a-real-use-case-for-method-breakpoints/"&gt;Foojay: Exception Breakpoint that Doesn&amp;rsquo;t Suck and a Real Use Case for Method Breakpoints&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;20'34 External debugging tools
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://rubberduckdebugging.com/" target="_blank" rel="noopener noreferrer"&gt;https://rubberduckdebugging.com/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;26'55 Observability
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://istio.io/latest/about/service-mesh/" target="_blank" rel="noopener noreferrer"&gt;https://istio.io/latest/about/service-mesh/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.redhat.com/en/topics/microservices/what-is-a-service-mesh" target="_blank" rel="noopener noreferrer"&gt;https://www.redhat.com/en/topics/microservices/what-is-a-service-mesh&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openjdk.org/jeps/435" target="_blank" rel="noopener noreferrer"&gt;https://openjdk.org/jeps/435&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;37'58 What information should you look for while debugging&lt;/li&gt;
&lt;li&gt;45'46 Be aware of tunnel vision while debugging&lt;/li&gt;
&lt;li&gt;49'33 What to do if you don&amp;rsquo;t know where to search for the bug
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/docs/git-bisect" target="_blank" rel="noopener noreferrer"&gt;https://git-scm.com/docs/git-bisect&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/understand-the-root-cause-of-regressions-with-git-bisect/"&gt;Foojay: External Debugging Tools 2: git bisect&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;57'05 Outro&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Schedule your 2038 holiday and experiment with dates in jshell!</title><link>https://foojayio.github.io/website/today/still-time-to-schedule-your-holiday-for-2038/</link><pubDate>Thu, 16 Feb 2023 15:54:51 +0000</pubDate><guid>https://foojayio.github.io/website/today/still-time-to-schedule-your-holiday-for-2038/</guid><description>&lt;p&gt;It&amp;rsquo;s still more or less the beginning of the year, where you may want to start scheduling your holidays until the end of it. And I decided to go a step further and I&amp;rsquo;ve already planned those for 2038!&lt;/p&gt;
&lt;p&gt;Why? Well, some time ago I gave a presentation to students, when I realized they had no idea what I was talking about when mentioning the Y2K-problem. Most of them weren&amp;rsquo;t even born in the year 2000!&lt;/p&gt;</description></item><item><title>Behaviour Driven Development with Event Driven Architectures</title><link>https://foojayio.github.io/website/today/how-behaviour-driven-development-works-well-with-event-driven-architectures/</link><pubDate>Wed, 15 Feb 2023 07:57:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-behaviour-driven-development-works-well-with-event-driven-architectures/</guid><description>&lt;p&gt;Behaviour Driven Development (BDD) and Event Driven Architecture (EDA) work well together as they complement each other&amp;rsquo;s strengths and weaknesses.&lt;/p&gt;
&lt;p&gt;Using both can result in a shorter time to market for new functionality and a more maintainable system.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Behaviour Driven Development (BDD)&lt;/strong&gt; encourages a common language between users and developers in describing requirements in a form the users can understand but can also automatically be checked as the application is developed and maintained.&lt;/p&gt;</description></item><item><title>Null Safety: Kotlin vs. Java</title><link>https://foojayio.github.io/website/today/null-safety-kotlin-vs-java/</link><pubDate>Mon, 13 Feb 2023 12:12:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/null-safety-kotlin-vs-java/</guid><description>&lt;p&gt;Last week, I was at the &lt;a href="https://fosdem.org/" target="_blank" rel="noopener noreferrer"&gt;FOSDEM&lt;/a&gt;
 conference. FOSDEM is specific in that it has multiple rooms, each dedicated to a different theme and organized by a team. I had two talks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fosdem.org/2023/schedule/event/tracing/" target="_blank" rel="noopener noreferrer"&gt;Practical Introduction to OpenTelemetry Tracing&lt;/a&gt;
, in the &lt;em&gt;Monitoring and Observability&lt;/em&gt; devroom&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fosdem.org/2023/schedule/event/miss/" target="_blank" rel="noopener noreferrer"&gt;What I miss in Java, the perspective of a Kotlin developer&lt;/a&gt;
, in the &lt;em&gt;Friends of OpenJDK&lt;/em&gt; devroom&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The second talk is from &lt;a href="https://blog.frankel.ch/miss-in-java-kotlin-developer/" target="_blank" rel="noopener noreferrer"&gt;an earlier post&lt;/a&gt;
. Martin Bonnin did a tweet from a single slide, and it created quite a stir, even attracting Brian Goetz.&lt;/p&gt;</description></item><item><title>Journeys in Java, Level 8: Add MongoDB to Spring Cloud Config</title><link>https://foojayio.github.io/website/today/journeys-in-java-level-8-add-mongodb-to-spring-cloud-config/</link><pubDate>Thu, 09 Feb 2023 16:56:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/journeys-in-java-level-8-add-mongodb-to-spring-cloud-config/</guid><description>&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/journeys-in-java-level-7-externalize-microservice-configuration/"&gt;our last article&lt;/a&gt;
, we used Spring Cloud Config to provide database credentials to a microservice application connecting to a cloud-hosted Neo4j database. This post will backport this concept to our existing MongoDB database instance and its related microservices.&lt;/p&gt;
&lt;p&gt;We will add our MongoDB credentials to the config server, so that it will be the central place for both our Neo4j and MongoDB database access. However, each service only has access to the credentials that it needs to operate, which provides some level of security through &amp;ldquo;separation of concerns&amp;rdquo; (versus universal access).&lt;/p&gt;</description></item><item><title>How Gradle Works: Startup</title><link>https://foojayio.github.io/website/today/how-gradle-works-startup/</link><pubDate>Thu, 09 Feb 2023 08:45:57 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-gradle-works-startup/</guid><description>&lt;p&gt;This is the first article of a series &lt;em&gt;How Gradle Works&lt;/em&gt;, which includes the following topics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How Gradle starts up&lt;/li&gt;
&lt;li&gt;How many JVMs are involved in a Gradle build&lt;/li&gt;
&lt;li&gt;What happens in each JVM during the build&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&amp;rsquo;ll explain the first topic &lt;em&gt;How Gradle Starts Up&lt;/em&gt; in this blog.&lt;/p&gt;
&lt;p&gt;Before reading on, we assume you are familiar with basic JVM/Gradle concepts (jar, classpath, wrapper, daemon, project, task, etc.).&lt;/p&gt;
&lt;h2 id="h2-0-how-gradle-starts-up"&gt;How Gradle Starts Up&lt;/h2&gt;
&lt;p&gt;There are many ways to start a Gradle build:&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>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>Optional in Java: A Swiss Army Knife for Handling Nulls and Improving Code Quality</title><link>https://foojayio.github.io/website/today/optional-in-java-a-swiss-army-knife-for-handling-nulls-and-improving-code-quality/</link><pubDate>Wed, 01 Feb 2023 05:29:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/optional-in-java-a-swiss-army-knife-for-handling-nulls-and-improving-code-quality/</guid><description>&lt;p&gt;In Java, dealing with null values can be a real headache. Nulls can cause all sorts of problems in your code, from NullPointerExceptions to convoluted if statements and error-prone logic. Fortunately, Java 8 introduced the Optional class, which offers a simple and powerful way to handle nulls and improve code quality. Optional is a container object that may or may not contain a non-null value and provides a range of practical methods for working with its contents. In this article, we&amp;rsquo;ll explore the many use cases of Optional in Java and show you how to use this powerful class to write cleaner, more expressive, and more resilient code.&lt;/p&gt;</description></item><item><title>Journeys in Java, Level 7: Externalize Microservice Configuration</title><link>https://foojayio.github.io/website/today/journeys-in-java-level-7-externalize-microservice-configuration/</link><pubDate>Mon, 30 Jan 2023 15:43:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/journeys-in-java-level-7-externalize-microservice-configuration/</guid><description>&lt;p&gt;Our decided next step for this project takes us in a new direction by adding externalized configuration for our applications.&lt;/p&gt;
&lt;p&gt;We already saw how to do something similar with &lt;a href="https://jmhreif.com/blog/microservices-level5/" target="_blank" rel="noopener noreferrer"&gt;MongoDB database credentials in Docker Compose&lt;/a&gt;
 to access a local database container, but what do we do when the database is hosted on public cloud or contains sensitive data?&lt;/p&gt;
&lt;p&gt;We probably don&amp;rsquo;t want to publish our credentials anywhere or even prevent accidental publishing.&lt;/p&gt;</description></item><item><title>Java Bytecode: Journey to the Wonderland (Part 3)</title><link>https://foojayio.github.io/website/today/java-bytecode-simplified-journey-to-the-wonderland-part-3/</link><pubDate>Tue, 24 Jan 2023 15:27:51 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-bytecode-simplified-journey-to-the-wonderland-part-3/</guid><description>&lt;p&gt;Our &lt;a href="https://foojayio.github.io/website/today/java-bytecode-simplified-journey-to-the-wonderland-part-2/" title="previous article"&gt;previous article&lt;/a&gt;
 unpacked Bytecode further and discussed ConstantPool, today I&amp;rsquo;ll go through several resources for working with it now.&lt;/p&gt;
&lt;p&gt;Java bytecode is the Java Virtual Machine&amp;rsquo;s (JVM) intermediate representation of Java code. While Java bytecode is not meant to be human-readable, it may be edited and manipulated for several reasons. This article examines the tools and methods used to change and work with Java bytecode.&lt;/p&gt;
&lt;p&gt;Changing Java bytecode is often done to add new features to a Java program that already exists. This can be done with a bytecode injector, a tool that lets you add bytecode to a Java class file that has already been compiled. Bytecode injectors are often used for logging or debugging information and for allowing runtime updates like A/B testing or feature flags.&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>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>Why Picnic picked Java</title><link>https://foojayio.github.io/website/today/why-picnic-picked-java/</link><pubDate>Fri, 30 Dec 2022 08:22:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-picnic-picked-java/</guid><description>&lt;p&gt;&lt;strong&gt;Picking a tech stack for your startup isn&amp;rsquo;t something to do lightly. It&amp;rsquo;s a choice that will shape the future in many ways: how will the tech enable your emerging product and business, what talent can you attract, and how future-proof is the tech stack?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When &lt;a href="https://picnic.app/careers/blogs" target="_blank" rel="noopener noreferrer"&gt;Picnic&lt;/a&gt;
 launched as the first app-only supermarket back in 2015 in The Netherlands, the tech landscape looked markedly different from today.&lt;/p&gt;
&lt;p&gt;Java and .Net ruled the Dutch developer landscape for backend systems.&lt;/p&gt;</description></item><item><title>Challenges when Developing a GUI for FIX</title><link>https://foojayio.github.io/website/today/challenges-when-developing-a-gui-for-fix/</link><pubDate>Wed, 21 Dec 2022 08:06:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/challenges-when-developing-a-gui-for-fix/</guid><description>&lt;p&gt;In this article, we explore the challenges in developing a Graphical User Interface (GUI) for Financial Information Exchange (FIX) data.&lt;/p&gt;
&lt;p&gt;FIX is both a protocol and a message format, but to create a FIX GUI we will focus just on the message format.&lt;/p&gt;
&lt;p&gt;A FIX message is a standard message format for transmitting financial and investment banking data.&lt;/p&gt;
&lt;p&gt;Below is an example of a FIX message, where the &amp;ldquo;|&amp;rdquo; character is sent as &amp;lsquo;\1&amp;rsquo;:&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>What Java Version Are You Running?</title><link>https://foojayio.github.io/website/today/what-java-version-are-you-running-lets-take-a-look-under-the-hood-of-the-jdk/</link><pubDate>Thu, 15 Dec 2022 08:59:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/what-java-version-are-you-running-lets-take-a-look-under-the-hood-of-the-jdk/</guid><description>&lt;p&gt;From time to time, you need to check which Java version is installed on your computer or server, for instance when starting on a new project or configuring an application to run on a server.&lt;/p&gt;
&lt;p&gt;But did you know there are multiple ways you can do this and even get much more information than you might think, very quickly?&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s find out&amp;hellip;&lt;/p&gt;
&lt;h2 id="reading-the-java-version-in-the-terminal-whatjavaversionareyourunningtakingalookunderthehoodsofthejdk-readingthejavaversionintheterminal"&gt;Reading the Java Version in the Terminal {#WhatJavaversionareyourunning?TakingalookunderthehoodsoftheJDK.-ReadingtheJavaVersionintheTerminal}&lt;/h2&gt;
&lt;p&gt;Probably the easiest way to find the installed version is by using the &lt;code&gt;java -version&lt;/code&gt; terminal command:&lt;/p&gt;</description></item><item><title>Why the Cool Kids Use Event Loops</title><link>https://foojayio.github.io/website/today/why-the-cool-kids-use-event-loops/</link><pubDate>Wed, 14 Dec 2022 10:17:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-the-cool-kids-use-event-loops/</guid><description>&lt;h3 id="h3-0-a-discussion-on-the-benefits-of-event-loops-in-java"&gt;A Discussion On the Benefits of Event Loops in Java.&lt;/h3&gt;
&lt;p&gt;When I was working in software development back in the 1990s, nearly all the software libraries that I worked on made use of event loops. This was because at the time most hardware had just one single CPU.&lt;/p&gt;
&lt;p&gt;Back in the day, I remember the excitement when threads were introduced into our development framework. It was revolutionary that we could now run two things at once, or rather appear to run two things at once, since a lot of the hardware at that time still only had a single core, hence our threaded code was never really truly concurrent.&lt;/p&gt;</description></item><item><title>Compilation Avoidance with Gradle</title><link>https://foojayio.github.io/website/today/compilation-avoidance-with-gradle/</link><pubDate>Tue, 13 Dec 2022 15:35:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/compilation-avoidance-with-gradle/</guid><description>&lt;p&gt;We at Gradle recently noticed some community chatter about speeding up Gradle compilation on the JVM by ignoring changes not affecting the application binary interface (ABIs) of dependencies.&lt;/p&gt;
&lt;p&gt;What a great idea! In fact, Gradle has used ABIs for Java out of the box for this without any extra configuration &lt;a href="https://blog.gradle.org/incremental-compiler-avoidance" target="_blank" rel="noopener noreferrer"&gt;since version 3.4&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;We refer to this feature as &lt;strong&gt;&lt;a href="https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_compile_avoidance" target="_blank" rel="noopener noreferrer"&gt;compilation avoidance&lt;/a&gt;
&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This post explains what ABI-based compilation means for the average workflow. Spoiler: utilizing compilation avoidance is one of the best performance enhancements for any build.&lt;/p&gt;</description></item><item><title>Why Did We Choose JSF for the Eclipse Starter for Jakarta EE?</title><link>https://foojayio.github.io/website/today/why-did-we-choose-jakarta-faces-for-the-ui-of-the-eclipse-starter-for-jakarta-ee/</link><pubDate>Tue, 13 Dec 2022 10:27:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-did-we-choose-jakarta-faces-for-the-ui-of-the-eclipse-starter-for-jakarta-ee/</guid><description>&lt;p&gt;After being taken care of by the &lt;a href="https://www.jcp.org/en/home/index" target="_blank" rel="noopener noreferrer"&gt;Java Community Process&lt;/a&gt;
 (JCP), Java EE is now supported by the &lt;a href="https://www.eclipse.org/org/foundation/" target="_blank" rel="noopener noreferrer"&gt;Eclipse Foundation&lt;/a&gt;
 as &lt;a href="https://jakarta.ee/" target="_blank" rel="noopener noreferrer"&gt;Jakarta EE&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;This means that we can focus more on open standards for governance, open-source development, and testing for compatibility.&lt;/p&gt;
&lt;p&gt;It is also a great way to include openness to all vendors, a clear flow of intellectual property (IP), well-defined procedures for defining specifications, and a level playing field.&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>Introducing Gradle Test Suites</title><link>https://foojayio.github.io/website/today/introducing-gradle-test-suites/</link><pubDate>Tue, 06 Dec 2022 13:28:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/introducing-gradle-test-suites/</guid><description>&lt;p&gt;This article was initially published at &lt;a href="https://blog.gradle.org/introducing-test-suites" target="_blank" rel="noopener noreferrer"&gt;blog.gradle.org&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;As projects grow in size and complexity and otherwise mature, they tend to accumulate a large collection of automated tests.&lt;/p&gt;
&lt;p&gt;Testing your software at &lt;a href="https://martinfowler.com/articles/practical-test-pyramid.html" target="_blank" rel="noopener noreferrer"&gt;multiple levels of granularity&lt;/a&gt;
 is important to surface problems quickly and to increase developer productivity.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://docs.gradle.org/7.3/release-notes.html#new-features-and-usability-improvements" target="_blank" rel="noopener noreferrer"&gt;Gradle 7.3&lt;/a&gt;
, released November 2021, the Gradle team introduced a new feature called Declarative Test Suites.&lt;/p&gt;
&lt;p&gt;Using this feature makes it much easier to manage different types of tests within a single Gradle JVM project without worrying about low level &amp;ldquo;plumbing&amp;rdquo; details.&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>Unusual Java: StackTrace Extends Throwable</title><link>https://foojayio.github.io/website/today/unusual-java-stacktrace-extends-throwable/</link><pubDate>Wed, 23 Nov 2022 12:37:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/unusual-java-stacktrace-extends-throwable/</guid><description>&lt;p&gt;There are things you can do in Java you rarely see, generally because there is no use for it.&lt;/p&gt;
&lt;p&gt;However, there are some unusual things in Java that could be surprisingly useful.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://chronicle.software/" title="Chronicle Software" target="_blank" rel="noopener noreferrer"&gt;Chronicle Software&lt;/a&gt;
 uses a number of different useful patterns in its low-level libraries most developers wouldn&amp;rsquo;t generally come across.&lt;/p&gt;
&lt;p&gt;One of them is a class that extends Throwable but isn&amp;rsquo;t an Error or an Exception.&lt;/p&gt;
&lt;h3 id="h3-0-stacktrace-extends-throwable"&gt;StackTrace Extends Throwable&lt;/h3&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="java"&gt;package net.openhft.chronicle.core;
/**
* Throwable created purely for the purposes of reporting a stack trace.
* This is not an Error or an Exception and is not expected to be thrown or caught.
*/
public class StackTrace extends Throwable {
 public StackTrace() { this("stack trace"); }
 public StackTrace(String message) { this(message, null); }
 public StackTrace(String message, Throwable cause) {
 super(message + " on " + Thread.currentThread().getName(), cause);
 }

 public static StackTrace forThread(Thread t) {
 if (t == null) return null;
 StackTrace st = new StackTrace(t.toString());
 StackTraceElement[] stackTrace = t.getStackTrace();
 int start = 0;
 if (stackTrace.length &amp;gt; 2) {
 if (stackTrace[0].isNativeMethod()) {
 start++;
 }
 }
 if (start &amp;gt; 0) {
 StackTraceElement[] ste2 = new StackTraceElement[stackTrace.length - start];
 System.arraycopy(stackTrace, start, ste2, 0, ste2.length);
 stackTrace = ste2;
 }

 st.setStackTrace(stackTrace);
 return st;
 }
}&lt;/pre&gt;
&lt;p&gt;Some important side notes to get out of the way first&lt;/p&gt;</description></item><item><title>Foojay Podcast #7: Security in Java -- what do we need to know?</title><link>https://foojayio.github.io/website/today/foojay-podcast-7/</link><pubDate>Mon, 21 Nov 2022 10:22:14 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-7/</guid><description>&lt;p&gt;For this Foojay Podcast**,** we invited security experts to dive into the fascinating world of secure coding and detecting vulnerabilities in your Java applications.&lt;/p&gt;
&lt;p&gt;How can you make and keep your systems safe?&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s what we want to find out&amp;hellip;&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/ATXMizsu1Rc?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>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>Reducing Tail Latencies with Chronicle Queue Enterprise</title><link>https://foojayio.github.io/website/today/reducing-tail-latencies-with-chronicle-queue-enterprise/</link><pubDate>Wed, 09 Nov 2022 15:07:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/reducing-tail-latencies-with-chronicle-queue-enterprise/</guid><description>&lt;p&gt;Persistent queue solutions are frequently used when designing low-latency applications.&lt;/p&gt;
&lt;p&gt;The problem is that high sustained message rates, or bursty workloads, can lead to delays caused by the OS or hardware which are challenging to mitigate.&lt;/p&gt;
&lt;p&gt;In this article, we will describe how &lt;a href="https://chronicle.software/queue-enterprise/" title="Chronicle Queue Enterprise" target="_blank" rel="noopener noreferrer"&gt;Chronicle Queue Enterprise&lt;/a&gt;
 solves this.&lt;/p&gt;
&lt;h3 id="h3-0-background"&gt;Background&lt;/h3&gt;
&lt;p&gt;When benchmarking Java low-latency persistent queue solutions, latencies tend to be excellent up to high percentiles until sustained throughput limits are reached; these sustained throughput limits are determined by disk performance, OS version, and configuration.&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>The Problem with Functional Programming</title><link>https://foojayio.github.io/website/today/the-problem-with-functional-programming/</link><pubDate>Thu, 27 Oct 2022 10:17:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-problem-with-functional-programming/</guid><description>&lt;p&gt;Let me start off with saying that I love functional programming.&lt;/p&gt;
&lt;p&gt;Although&amp;hellip; a better way of saying it would be that I love what functional programming brings me.&lt;/p&gt;
&lt;p&gt;It reduces complexity, the code is nice and explicit, and it eliminates certain bugs from occurring.&lt;/p&gt;
&lt;p&gt;But there are a few things that I wanted to discuss regarding functional programming.&lt;/p&gt;
&lt;h2 id="h2-0-object-orientation-vs-functional-programming"&gt;Object Orientation vs. Functional Programming&lt;/h2&gt;
&lt;p&gt;Let me start off with the Object Oriented vs. Functional Programming discussion.&lt;/p&gt;</description></item><item><title>A Minor But Useful Refactoring Technique That Would Reduce Your Code Footprint (Part 2)</title><link>https://foojayio.github.io/website/today/a-minor-but-useful-refactoring-technique-that-would-reduce-your-code-footprint-part-2/</link><pubDate>Wed, 26 Oct 2022 15:16:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/a-minor-but-useful-refactoring-technique-that-would-reduce-your-code-footprint-part-2/</guid><description>&lt;p&gt;As I keep refactoring, this article will focus on a few more interesting ways to do it. These are pretty much minor yet effective and useful changes.&lt;/p&gt;
&lt;h2 id="h2-0-stream-nonematch-and-stream-anymatch"&gt;Stream.noneMatch() and Stream.anyMatch()&lt;/h2&gt;
&lt;p&gt;In some situations, we need to find a single case among many. For example, we want to do a certain operation if we have a list of items and a certain item is in that list. Usually, we run a for loop and then use a loop inside the for loop to check the value against our case. Check out the following piece of code:&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>How to Use Java DTOs to Stay Secure</title><link>https://foojayio.github.io/website/today/how-to-use-java-dtos-to-stay-secure/</link><pubDate>Fri, 21 Oct 2022 07:29:57 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-use-java-dtos-to-stay-secure/</guid><description>&lt;p&gt;&lt;del&gt;This article was orignally posted on &lt;a href="https://snyk.io/blog/how-to-use-java-dtos/" target="_blank" rel="noopener noreferrer"&gt;Snyk.io&lt;/a&gt;
 and is reused with permission.&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;Data Transfer Objects (DTOs) in Java are objects that transport data between subsystems.&lt;/p&gt;
&lt;p&gt;It is an enterprise design pattern to aggregate data.&lt;/p&gt;
&lt;p&gt;The main purpose is to reduce the number of system calls needed between the subsystems, reducing the amount of overhead created.&lt;/p&gt;
&lt;p&gt;In this article, I will explain how DTOs are used in modern Java applications, ways your application can benefit, and how Java DTOs can help you be more secure by preventing accidental data leaks.&lt;/p&gt;</description></item><item><title>Minor Techniques That Would Reduce Your Code Footprint (Part 1)</title><link>https://foojayio.github.io/website/today/a-minor-but-useful-refactoring-technique-that-would-reduce-your-code-footprint-part-1/</link><pubDate>Thu, 20 Oct 2022 14:32:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/a-minor-but-useful-refactoring-technique-that-would-reduce-your-code-footprint-part-1/</guid><description>&lt;p&gt;Finally, we upgraded to Java 11 from Java 8.&lt;/p&gt;
&lt;p&gt;That was a long-awaited move, but I&amp;rsquo;m pleased that we eventually made it.&lt;/p&gt;
&lt;p&gt;The next thing that came to mind when I stated this was, &amp;ldquo;Why not Java 17 directly?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Eventually, we will move to 17, but we had to begin someplace.&lt;/p&gt;
&lt;p&gt;And the transition to 11 was not easy either.&lt;/p&gt;
&lt;p&gt;We had several dependencies with Mockito, which made the journey somewhat tricky, but we were able to manage it.&lt;/p&gt;</description></item><item><title>Low Latency Crypto Trading Systems with Java and Chronicle</title><link>https://foojayio.github.io/website/today/low-latency-crypto-trading-systems-using-java-and-chronicle-services/</link><pubDate>Tue, 18 Oct 2022 14:59:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/low-latency-crypto-trading-systems-using-java-and-chronicle-services/</guid><description>&lt;p&gt;Cryptocurrency trading is an emerging market with its own rules.&lt;/p&gt;
&lt;p&gt;However, when it comes to the need for low-latency &lt;a href="https://en.wikipedia.org/wiki/Arbitrage" title="arbitrage" target="_blank" rel="noopener noreferrer"&gt;arbitrage&lt;/a&gt;
, that is, being able to react rapidly to changing market prices and placing orders ahead of the competition, there are lessons we can learn from optimizing classic trading systems.&lt;/p&gt;
&lt;p&gt;Chronicle Software has a successful track record of designing low-latency trading products. This background enables it to provide optimum performance solutions for Crypto trading systems.&lt;/p&gt;</description></item><item><title>MicroProfile Config for Java SE</title><link>https://foojayio.github.io/website/today/microprofile-config-for-java-se/</link><pubDate>Thu, 13 Oct 2022 16:10:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/microprofile-config-for-java-se/</guid><description>&lt;p&gt;The &lt;a href="https://microprofile.io/microprofile-config/" target="_blank" rel="noopener noreferrer"&gt;MicroProfile Config&lt;/a&gt;
 specification is one of those attempts to create a specification around application configuration for the Java Enterprise world. In the past, there were already some other attempts within Java EE to define this specification for Java EE, but they were never finalised.&lt;/p&gt;
&lt;p&gt;Currently, another attempt is in progress with Jakarta EE Config but since MicroProfile is closely related to Jakarta EE, it is the best available solution today. That is the reason why almost all Jakarta EE runtimes also support MicroProfile Config and the other specifications of the MicroProfile umbrella.&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>The Reason Java is Still Popular</title><link>https://foojayio.github.io/website/today/the-reason-java-is-still-popular/</link><pubDate>Mon, 10 Oct 2022 16:11:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-reason-java-is-still-popular/</guid><description>&lt;p&gt;A great time to post this, right after the release of Java 19, yes, another &amp;ldquo;my language is better&amp;rdquo; post. No, I didn&amp;rsquo;t want to write it. But sometimes people&amp;rsquo;s &lt;a href="https://medium.com/codex/i-finally-gave-up-on-java-5187947bef1b" target="_blank" rel="noopener noreferrer"&gt;bad projection&lt;/a&gt;
 gets the better of me.&lt;/p&gt;
&lt;p&gt;In this case the post started as a comment and I ended up deciding turn it into a post. This was strengthened with &lt;a href="https://news.ycombinator.com/item?id=32896228" target="_blank" rel="noopener noreferrer"&gt;this post&lt;/a&gt;
 which mostly complains about Quarkus (somewhat unfairly if I might add).&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>Low Latency Microservices, A Retrospective</title><link>https://foojayio.github.io/website/today/low-latency-microservices-a-retrospective/</link><pubDate>Thu, 06 Oct 2022 06:25:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/low-latency-microservices-a-retrospective/</guid><description>&lt;p&gt;I wrote an article on &lt;a href="https://vanilla-java.github.io/2016/03/22/Micro-services-for-performance.html" title="low latency microservices" target="_blank" rel="noopener noreferrer"&gt;low latency microservices&lt;/a&gt;
 almost five years ago now. Chronicle Software has worked with a number of tier one investment banks to implement and support those systems. What has changed in that time and what lessons have we learnt?&lt;/p&gt;
&lt;p&gt;Read this article and learn what we learned after five years of developing and supporting low latency microservices.&lt;/p&gt;
&lt;h3 id="h3-0-separation-of-concerns-gives-better-testability"&gt;Separation of Concerns Gives Better Testability&lt;/h3&gt;
&lt;p&gt;Microservices repeatedly demonstrated that testing and debugging business components were much easier with simple, stand-alone components with clear contracts between microservices.&lt;/p&gt;</description></item><item><title>What Does The JVM Look Like, How Does It Work?</title><link>https://foojayio.github.io/website/today/what-does-a-modern-jvm-look-like-and-how-does-it-work/</link><pubDate>Thu, 29 Sep 2022 05:29:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/what-does-a-modern-jvm-look-like-and-how-does-it-work/</guid><description>&lt;p&gt;Knowing how to code is fantastic, but it is even more enjoyable if we understand how a specific programming ecosystem works.&lt;/p&gt;
&lt;p&gt;I recall the C course I took during my first semester at university. I wanted to learn how C compilers take a program, verify it, and then compile it. As a side project, I wrote a small program that checks another C program to see if there are any syntax errors. I named it &lt;strong&gt;Cyntax&lt;/strong&gt;. It didn&amp;rsquo;t accomplish much, but I felt euphoria while doing it.&lt;/p&gt;</description></item><item><title>Storing 1TB in Virtual Memory on a 128GB Machine</title><link>https://foojayio.github.io/website/today/chronicle-queue-storing-1tb-in-virtual-memory-on-a-128gb-machine/</link><pubDate>Tue, 27 Sep 2022 09:10:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/chronicle-queue-storing-1tb-in-virtual-memory-on-a-128gb-machine/</guid><description>&lt;p&gt;If you use a standard JVM like the Oracle JVM or the OpenJDK, you might find that as the heap size grows the performance of your JVM can drop as GC pause time escalates.&lt;/p&gt;
&lt;p&gt;This tends to be a problem around 32 GB of heap, but it often depends on the application at which point the size of your heap becomes a problem.&lt;/p&gt;
&lt;p&gt;One way around this is to use an always concurrent collector such as &lt;a href="https://www.azul.com/products/prime/" target="_blank" rel="noopener noreferrer"&gt;Azul Platform Prime&lt;/a&gt;
 which is designed to both scale to much larger heap sizes and even reduces the GC pause times for smaller heap consistently.&lt;/p&gt;</description></item><item><title>The 5 Most Pivotal and Innovative Additions to OpenJDK 19</title><link>https://foojayio.github.io/website/today/the-5-most-pivotal-and-innovative-additions-to-openjdk-19/</link><pubDate>Tue, 20 Sep 2022 16:25:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-5-most-pivotal-and-innovative-additions-to-openjdk-19/</guid><description>&lt;p&gt;Although &lt;a href="https://foojayio.github.io/website/today/openjdk-19-released/"&gt;OpenJDK 19&lt;/a&gt;
 is not an LTS, it is still a significant release, in my opinion.&lt;/p&gt;
&lt;p&gt;It includes several game-changing features that will alter the Java landscape.&lt;/p&gt;
&lt;p&gt;Many features intrigue my interest, but there are five in particular that I can&amp;rsquo;t wait to try out. Let&amp;rsquo;s break those down and talk about them separately.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://openjdk.org/jeps/425" target="_blank" rel="noopener noreferrer"&gt;JEP 425: Virtual Threads (Preview)&lt;/a&gt;
&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Under the umbrella of Project Loom, JEP 425 introduces virtual threads, which aim to dramatically reduce the effort of writing, maintaining, and observing high-throughput concurrent applications on the Java platform. This is a &lt;a href="https://openjdk.java.net/jeps/12" target="_blank" rel="noopener noreferrer"&gt;preview feature&lt;/a&gt;
. Consider the following example:&lt;/p&gt;</description></item><item><title>OpenJDK 19 Released!</title><link>https://foojayio.github.io/website/today/openjdk-19-released/</link><pubDate>Tue, 20 Sep 2022 16:00:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/openjdk-19-released/</guid><description>&lt;p&gt;OpenJDK 19 has been released today! Get it from your favorite vendor&amp;hellip; whether it is BellSoft, Amazon, Red Hat, Azul, Oracle, Microsoft &lt;a href="https://foojayio.github.io/website/almanac/jdk-19/"&gt;or any other of a large number of Java providers&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;The friends of OpenJDK community has put together a number of resources, and more coming in the coming weeks, about the new features and all the enhancements and fixes that have gone into the release, accompanied by a brand new podcast released today, featuring key Java community leaders from around the world.&lt;/p&gt;</description></item><item><title>Foojay Podcast #5: OpenJDK Discussion Panel</title><link>https://foojayio.github.io/website/today/foojay-podcast-5/</link><pubDate>Tue, 20 Sep 2022 15:56:27 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-5/</guid><description>&lt;p&gt;It&amp;rsquo;s September 20th, OpenJDK 19 has been released. In this podcast, we discuss the new features and the changes that this release brings.&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/71ZAYZWwpuI?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;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://open.spotify.com/show/6CpTfgn9LirzJGAtc4ICdQ" target="_blank" rel="noopener noreferrer"&gt;Spotify&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://podcasts.apple.com/be/podcast/foojay-io-the-friends-of-openjdk/id1652281304" target="_blank" rel="noopener noreferrer"&gt;Apple Podcasts&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;And most others&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-1-guests"&gt;Guests&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://twitter.com/miragemiko" target="_blank" rel="noopener noreferrer"&gt;Miroslav Wengner&lt;/a&gt;
&lt;/strong&gt; (OpenValue)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://twitter.com/mgrygles" target="_blank" rel="noopener noreferrer"&gt;Mary Grygleski&lt;/a&gt;
&lt;/strong&gt; (CJUG, DataStax)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://twitter.com/deepu105" target="_blank" rel="noopener noreferrer"&gt;Deepu K Sasidharan&lt;/a&gt;
&lt;/strong&gt; (Okta, JHipster)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-2-podcast-host"&gt;Podcast host&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://twitter.com/costlow" target="_blank" rel="noopener noreferrer"&gt;Erik Costlow&lt;/a&gt;
&lt;/strong&gt; (Azul)&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>Use Pattern Matching to Simplify Java</title><link>https://foojayio.github.io/website/today/use-pattern-matching-to-simplify-java/</link><pubDate>Wed, 07 Sep 2022 10:55:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/use-pattern-matching-to-simplify-java/</guid><description>&lt;p&gt;The concept of pattern matching has been around since the 1960s. It&amp;rsquo;s a well-known language technique used in many programming languages, from Haskell and AWK to Rust and Scala.{#h-the-concept-of-pattern-matching-has-been-around-since-the-1960s-it-s-a-well-known-language-technique-used-in-many-programming-languages-from-haskell-and-awk-to-rust-and-scala}&lt;/p&gt;
&lt;p&gt;Pattern matching is relatively new to Java. It was introduced in JDK 14 and has been progressing with new uses since then.&lt;/p&gt;
&lt;p&gt;This article explores how these new features can make your code more concise without losing readability.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re more of an interactive learner, watch my &lt;a href="https://www.azul.com/resources-hub/webinars-2/the-art-of-java-language-pattern-matching-on-demand-webinar" target="_blank" rel="noopener noreferrer"&gt;on-demand webinar on pattern matching in Java&lt;/a&gt;
 from June 2022. First, let&amp;rsquo;s back up and explain what pattern matching is.&lt;/p&gt;</description></item><item><title>Java Thread Programming (Part 15)</title><link>https://foojayio.github.io/website/today/java-thread-programming-part-15/</link><pubDate>Wed, 31 Aug 2022 17:30:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-thread-programming-part-15/</guid><description>&lt;p&gt;This article will discuss how we do asynchronous method invocation with &lt;a href="https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/util/concurrent/Callable.html" target="_blank" rel="noopener noreferrer"&gt;Callable&lt;/a&gt;
 and &lt;a href="https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/util/concurrent/Future.html" target="_blank" rel="noopener noreferrer"&gt;Future&lt;/a&gt;
 with a practical example.&lt;/p&gt;
&lt;img fetchpriority="high" decoding="async" class="alignnone size-medium wp-image-57278" src="Playground.java_-700x227.png" alt="" width="700" height="227"&gt;
&lt;br /&gt;
&lt;p&gt;Look at the code snippet. It doesn&amp;rsquo;t have anything yet, but &lt;a href="https://foojayio.github.io/website/today/java-thread-programming-part-14/"&gt;as we learned about Java threading&lt;/a&gt;
, we know anything we put here will run on the main thread unless we spawn a new thread from here.&lt;/p&gt;
&lt;p&gt;Now consider a case where you work as a banker, and you need to calculate how much credit you can provide to a person.&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>Java Strings and confusion with Unicode</title><link>https://foojayio.github.io/website/today/confusing-java-strings/</link><pubDate>Tue, 23 Aug 2022 10:29:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/confusing-java-strings/</guid><description>&lt;p&gt;In this article, I would like to show you a couple of confusing things in connection with Java Strings.&lt;/p&gt;
&lt;p&gt;I would also like to give you a few suggestions to avoid issues with them.&lt;/p&gt;
&lt;p&gt;I also prepared a GitHub repo for you where you can find some code that you can use to try the examples out on your own: &lt;a href="https://github.com/jonatan-ivanov/java-strings-demo" target="_blank" rel="noopener noreferrer"&gt;github.com/jonatan-ivanov/java-strings-demo&lt;/a&gt;
.&lt;/p&gt;
&lt;h2 id="h2-0-quiz"&gt;Quiz&lt;/h2&gt;
&lt;p&gt;In order to demonstrate this, let me invite you for a little quiz:&lt;/p&gt;</description></item><item><title>Java Bytecode Simplified: Journey to the Wonderland (Part 2)</title><link>https://foojayio.github.io/website/today/java-bytecode-simplified-journey-to-the-wonderland-part-2/</link><pubDate>Tue, 16 Aug 2022 15:15:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-bytecode-simplified-journey-to-the-wonderland-part-2/</guid><description>&lt;p&gt;Our &lt;a href="https://foojayio.github.io/website/today/java-bytecode-simplified-journey-to-the-wonderland-part-1/"&gt;previous article&lt;/a&gt;
 introduced Bytecode and discussed what it includes.&lt;/p&gt;
&lt;p&gt;This article will delve a bit deeper into ConstantPool.&lt;/p&gt;
&lt;p&gt;Highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bytecode is a representation that is abstract in nature. They are fictitious codes for a fictitious machine known as the Java Virtual Machine. The Java virtual machine is a piece of software that interprets &lt;strong&gt;Bytecode&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The JVM is a stack-based computer. Real CPUs are register-based systems and execute machine code. Java is compiled into Bytecode, an intermediate form, which is then executed by the &lt;a href="https://en.wikipedia.org/wiki/Just-in-time_compilation" target="_blank" rel="noopener noreferrer"&gt;Just In Time&lt;/a&gt;
 (JIT) compiler, which generates machine code.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before going any further, let&amp;rsquo;s explore &lt;code&gt;javap&lt;/code&gt;, which is a very handy tool for deconstructing byte code.&lt;/p&gt;</description></item><item><title>Deserialization exploits in Java: why should I Care?</title><link>https://foojayio.github.io/website/today/deserialization-exploits-in-java-why-should-i-care/</link><pubDate>Thu, 14 Jul 2022 07:39:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/deserialization-exploits-in-java-why-should-i-care/</guid><description>&lt;p&gt;&lt;strong&gt;Hackers refer to deserialization in Java as &amp;ldquo;the gift that keeps on giving&amp;rdquo;. But what is actually the problem? In most cases, it is not even your own code that creates this security vulnerability. This problem is also not restricted to Java&amp;rsquo;s custom serialization framework. When deserializing JSON, XML, or YAML, similar issues can occur as well.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I recently gave a talk about this during &lt;a href="https://www.devoxx.co.uk/" target="_blank" rel="noopener noreferrer"&gt;Devoxx UK&lt;/a&gt;
, the largest and most prestigious Java community conference in the United Kingdom. In this talk, I explain how deserialization vulnerabilities work natively in Java and how attack chains are created. This was loosely based on my blog post: &lt;a href="https://snyk.io/blog/serialization-and-deserialization-in-java/" target="_blank" rel="noopener noreferrer"&gt;&amp;ldquo;Serialization and deserialization in Java: explaining the Java deserialize vulnerability&amp;rdquo;&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>JDK 7: An Extended Hello and Farewell</title><link>https://foojayio.github.io/website/today/jdk-7-an-extended-hello-and-farewell/</link><pubDate>Tue, 12 Jul 2022 11:03:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/jdk-7-an-extended-hello-and-farewell/</guid><description>&lt;p&gt;On July 7^th^, 2011, eleven years ago, &lt;a href="https://openjdk.org/projects/jdk7/" target="_blank" rel="noopener noreferrer"&gt;JDK 7 was released&lt;/a&gt;
. In some ways, it was one of the more significant releases of Java. Indeed, there were some excellent technical features: &lt;a href="https://openjdk.org/projects/coin/" target="_blank" rel="noopener noreferrer"&gt;Project Coin&lt;/a&gt;
 gave us things like try-with-resources, strings in switch and multi-catch.&lt;/p&gt;
&lt;p&gt;However, it was two non-technical aspects of JDK 7 that made it important.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The first was that it was the first release since &lt;a href="https://www.oracle.com/corporate/pressrelease/oracle-buys-sun-042009.html" target="_blank" rel="noopener noreferrer"&gt;Oracle acquired Sun Microsystems&lt;/a&gt;
. The Java community had been unsure how Java would fare under Oracle, so this release showed a solid commitment to the platform (which has been maintained since then).&lt;/li&gt;
&lt;li&gt;The second was even more important: the fact that a &lt;a href="https://www.jcp.org/en/jsr/detail?id=336" target="_blank" rel="noopener noreferrer"&gt;Java SE specification&lt;/a&gt;
 was published through the &lt;a href="https://www.jcp.org/en/home/index" target="_blank" rel="noopener noreferrer"&gt;Java Community Process&lt;/a&gt;
. Due to &lt;a href="https://en.wikipedia.org/wiki/Apache_Harmony#Difficulties_to_obtain_a_TCK_license_from_Sun" target="_blank" rel="noopener noreferrer"&gt;issues around the availability of the TCK&lt;/a&gt;
 and the &lt;a href="https://harmony.apache.org/" target="_blank" rel="noopener noreferrer"&gt;Apache Harmony project&lt;/a&gt;
, new versions of OpenJDK had been stalled since December 2006. To put this into context, the time between JDK 6 and JDK 7 (one release) was one month longer at four years and seven months than between JDK 9 and JDK 18 (nine releases). Getting things moving again was vital to keeping Java relevant to developers as applications and architectures evolved.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Another significant date for JDK 7 is July 19^th^ this year. That is when the &lt;a href="https://www.oracle.com/java/technologies/java-se-support-roadmap.html" target="_blank" rel="noopener noreferrer"&gt;last update will be made available from Oracle&lt;/a&gt;
, even for commercially supported users. It is the end of what Oracle terms Extended Support.&lt;/p&gt;</description></item><item><title>What I Miss in Java, the Perspective of a Kotlin Developer</title><link>https://foojayio.github.io/website/today/miss-java-kotlin-developer/</link><pubDate>Wed, 15 Jun 2022 08:15:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/miss-java-kotlin-developer/</guid><description>&lt;p&gt;Java has been my bread and butter for almost two decades.&lt;/p&gt;
&lt;p&gt;Several years ago, I started to learn Kotlin; I never regretted it.&lt;/p&gt;
&lt;p&gt;Though Kotlin compiles to JVM bytecode, I sometimes have to write Java again.&lt;/p&gt;
&lt;p&gt;Every time I do, I cannot stop pondering why my code doesn&amp;rsquo;t look as nice as in Kotlin.&lt;/p&gt;
&lt;p&gt;I miss some features that would improve my code&amp;rsquo;s readability, expressiveness, and maintainability.&lt;/p&gt;
&lt;p&gt;This article is not meant to bash Java but to list some features I&amp;rsquo;d like to find in Java.&lt;/p&gt;</description></item><item><title>Wordish with JavaFX - Part 5</title><link>https://foojayio.github.io/website/today/wordish-with-javafx-part-5/</link><pubDate>Tue, 14 Jun 2022 07:25:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/wordish-with-javafx-part-5/</guid><description>&lt;p&gt;Welcome to Part 5 and the final installment of this series.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In &lt;a href="https://foojayio.github.io/website/today/wordish-with-javafx-part-1/"&gt;Part 1&lt;/a&gt;
, we introduced the Wordish game with JavaFX and discussed the main UI layout.&lt;/li&gt;
&lt;li&gt;In &lt;a href="https://foojayio.github.io/website/today/wordish-with-javafx-part-2/"&gt;Part 2&lt;/a&gt;
, we discussed look and feel enhancements. We introduced specialized Label and Button controls that use pseudo-classes for advanced CSS styling. In addition, we covered incorporating third-party font libraries and customizing Scene Builder to leverage these features.&lt;/li&gt;
&lt;li&gt;Next, in &lt;a href="https://foojayio.github.io/website/today/wordish-with-javafx-part-3/"&gt;Part 3&lt;/a&gt;
, we explored the controller code that maintains game state and responds to user input with appropriate updates to the UI.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojayio.github.io/website/today/wordish-with-javafx-part-4/"&gt;Part 4&lt;/a&gt;
, &lt;strong&gt;What&amp;rsquo;s in a Word, Anyway?&lt;/strong&gt;, examines how we get our words and how we determine if a submitted word is valid.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And now in Part 5, we turn to JavaFX charts, showing how to customize charts with orientation and colors and how to add nodes to the chart scene graph.&lt;/p&gt;</description></item><item><title>Wordish with JavaFX - Part 4 : Foojay</title><link>https://foojayio.github.io/website/today/wordish-with-javafx-part-4/</link><pubDate>Tue, 07 Jun 2022 09:23:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/wordish-with-javafx-part-4/</guid><description>&lt;p&gt;Welcome to Part 4 of this five part series.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/wordish-with-javafx-part-1/"&gt;Part 1&lt;/a&gt;
, we introduced the Wordish game with JavaFX and discussed the main UI layout.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/wordish-with-javafx-part-2/"&gt;Part 2&lt;/a&gt;
, we discussed look and feel enhancements.&lt;/p&gt;
&lt;p&gt;We introduced specialized Label and Button controls that use pseudo-classes for advanced CSS styling.&lt;/p&gt;
&lt;p&gt;We covered incorporating third-party font libraries and customizing Scene Builder to leverage these features.&lt;/p&gt;
&lt;p&gt;Next, in &lt;a href="https://foojayio.github.io/website/today/wordish-with-javafx-part-3/"&gt;Part 3&lt;/a&gt;
, we explored the controller code that maintains game state and responds to user input with appropriate updates to the UI.&lt;/p&gt;</description></item><item><title>What Can We Expect In OpenJDK 19?</title><link>https://foojayio.github.io/website/today/what-can-we-expect-in-openjdk-19/</link><pubDate>Wed, 01 Jun 2022 19:00:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/what-can-we-expect-in-openjdk-19/</guid><description>&lt;p&gt;Although the Java 19 release is coming in September (2022-09-20), we already know what will happen in that release!&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll touch on upcoming features via examples to get a sense of how valuable these can be to a project.&lt;/p&gt;
&lt;h3 id="h3-0-jep-405-record-patterns-preview"&gt;JEP-405: Record Patterns (Preview)&lt;/h3&gt;
&lt;p&gt;Java 14 introduced (JEP-361, Reference 2), which made it possible to use a switch as a statement or an expression. In many cases, I think it was something the community shouted for quite some time, because many other JVM languages have already provided such constructs.&lt;/p&gt;</description></item><item><title>Wordish with JavaFX - Part 3</title><link>https://foojayio.github.io/website/today/wordish-with-javafx-part-3/</link><pubDate>Tue, 31 May 2022 07:23:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/wordish-with-javafx-part-3/</guid><description>&lt;p&gt;Welcome to Part 3 of this five part series.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/wordish-with-javafx-part-1/"&gt;Part 1&lt;/a&gt;
, we introduced the Wordish game with JavaFX and discussed the main UI layout.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/wordish-with-javafx-part-2/"&gt;Part 2&lt;/a&gt;
, we discussed look and feel enhancements.&lt;/p&gt;
&lt;p&gt;We introduced specialized Label and Button controls that use pseudo-classes for advanced CSS styling.&lt;/p&gt;
&lt;p&gt;We covered incorporating third-party font libraries and customizing Scene Builder to leverage these features.&lt;/p&gt;
&lt;p&gt;Now in Part 3, we&amp;rsquo;ll examine the controller code. The controller code maintains game state and responds to user input with appropriate updates to the UI.&lt;/p&gt;</description></item><item><title>Wordish with JavaFX - Part 2</title><link>https://foojayio.github.io/website/today/wordish-with-javafx-part-2/</link><pubDate>Tue, 24 May 2022 07:50:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/wordish-with-javafx-part-2/</guid><description>&lt;h2 id="h2-0-building-games-and-having-fun-with-java-and-javafx"&gt;Building Games and Having Fun with Java and JavaFX&lt;/h2&gt;
&lt;p&gt;Welcome to Part 2 of this five part series!&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/wordish-with-javafx-part-1/"&gt;Part 1&lt;/a&gt;
, we introduced the Wordish game with JavaFX and discussed the main UI layout.&lt;/p&gt;
&lt;p&gt;In this second part, we&amp;rsquo;ll discuss some important look and feel enhancements.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll show you specialized Label and Button controls and using pseudo-classes for advanced CSS styling.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll also cover incorporating third-party font libraries and customizing Scene Builder to leverage these features.&lt;/p&gt;</description></item><item><title>Wordish with JavaFX - Part 1</title><link>https://foojayio.github.io/website/today/wordish-with-javafx-part-1/</link><pubDate>Tue, 17 May 2022 10:13:21 +0000</pubDate><guid>https://foojayio.github.io/website/today/wordish-with-javafx-part-1/</guid><description>&lt;h2 id="h2-0-building-games-and-having-fun-with-java-and-javafx"&gt;Building Games and Having Fun with Java and JavaFX&lt;/h2&gt;
&lt;p&gt;Wordish is a JavaFX implementation of the game Wordle. It&amp;rsquo;s like Wordle. It is Wordle-ish. It&amp;rsquo;s Wordish.
&lt;img src="https://foojayio.github.io/website/today/wordish-with-javafx-part-1/playgame5-308x510.png" alt="" loading="lazy"&gt;
 Figure 1. Wordish main layout view&lt;/p&gt;
&lt;p&gt;Wordle is a daily online word game. You can play the official Wordle game here:&lt;a href="https://www.nytimes.com/games/wordle/index.html" target="_blank" rel="noopener noreferrer"&gt;https://www.nytimes.com/games/wordle/index.html&lt;/a&gt;
. If you haven&amp;rsquo;t played yet, go check it out.&lt;/p&gt;
&lt;p&gt;As I played Wordle, I realized how much fun it would be to create a JavaFX implementation. When you submit a word, each tile rotates to reveal how the individual letter matches &amp;ndash; or doesn&amp;rsquo;t match &amp;ndash; the target word. &lt;em&gt;(Ooh, animation!)&lt;/em&gt;&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>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>Top 10 Java Language Features</title><link>https://foojayio.github.io/website/today/top-10-java-language-features/</link><pubDate>Tue, 12 Apr 2022 17:06:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/top-10-java-language-features/</guid><description>&lt;p&gt;Every programming language provides ways to express our ideas and then translates them into reality.&lt;/p&gt;
&lt;p&gt;Some are unique to that particular language and some are common to many other programming languages.&lt;/p&gt;
&lt;p&gt;In this article, I will explore ten Java programming features used frequently by developers in their day-to-day programming jobs.&lt;/p&gt;
&lt;h2 id="h2-0-collection-s-factory-method"&gt;Collection&amp;rsquo;s factory method&lt;/h2&gt;
&lt;p&gt;Collections are the most frequently used feature in our daily coding. They are used as a container where we store objects and pass them along.&lt;/p&gt;</description></item><item><title>How to Create APIs with the Java 18 jwebserver Ready for Docker </title><link>https://foojayio.github.io/website/today/how-to-create-apis-with-the-java-18-jwebserver-ready-for-docker/</link><pubDate>Mon, 11 Apr 2022 14:26:57 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-create-apis-with-the-java-18-jwebserver-ready-for-docker/</guid><description>&lt;p&gt;In the age of cloud computing, it is at times very helpful to have the ability to run a very simple web server. A simple web server that delivers static content.&lt;/p&gt;
&lt;p&gt;Maybe some of us are already familiar with the neat python util &amp;ldquo;&lt;em&gt;SimpleHTTPServer&lt;/em&gt;&amp;rdquo; (Example 1.). It allows you to run a web server from the current location and obtain access to static content.&lt;/p&gt;
&lt;p&gt;Although such a server is very simple and even without the ability to define a directory, it is very helpful in many cases. For example, exposing a simple end-point that serves a JSON response:&lt;/p&gt;</description></item><item><title>Quest to the OS: Java Native Memory</title><link>https://foojayio.github.io/website/today/the-quest-to-the-os-java-native-memory-foojay-today/</link><pubDate>Fri, 08 Apr 2022 04:19:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-quest-to-the-os-java-native-memory-foojay-today/</guid><description>&lt;p&gt;&lt;img src="https://miro.medium.com/max/1400/0*QMIuX6OHkdzv3HGM" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;As developers we want to spend most time on new features and improvements, providing value to our users or customers. However, all software inevitably contains bugs and other defects. A lot can be done to catch defects before software reaches production (something Picnic&amp;rsquo;s automated fulfillment center team has &lt;a href="https://blog.picnic.nl/reinventing-the-qa-process-25854fee51f3" target="_blank" rel="noopener noreferrer"&gt;previously written about&lt;/a&gt;
) but some defects are likely to go undetected until the software is in the hands of users.{#44cf}&lt;/p&gt;</description></item><item><title>Switch Statement and the Factory Pattern in Three JVM Languages</title><link>https://foojayio.github.io/website/today/examining-the-switch-statement-and-the-factory-pattern-in-three-jvm-languages/</link><pubDate>Wed, 06 Apr 2022 09:10:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/examining-the-switch-statement-and-the-factory-pattern-in-three-jvm-languages/</guid><description>&lt;p&gt;The goal of this article is to examine a program selection control mechanism.&lt;/p&gt;
&lt;p&gt;A selection control mechanism allows a value, expression or variable type to influence the program flow execution. This concept is commonly used by developers.&lt;/p&gt;
&lt;p&gt;A good example for this is a widely used design pattern. A design pattern that belongs to the family of creational patterns and is used for an object creation without exposing the entire logic.&lt;/p&gt;</description></item><item><title>Handling Null: Optional and Nullable Types</title><link>https://foojayio.github.io/website/today/handling-null-optional-and-nullable-types/</link><pubDate>Mon, 04 Apr 2022 08:06:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/handling-null-optional-and-nullable-types/</guid><description>&lt;p&gt;Java has long been infamous for its &lt;code&gt;NullPointerException&lt;/code&gt;. The reason for the is calling a method or accessing an attribute of an &lt;strong&gt;object that has not been initialized&lt;/strong&gt;.&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="java"&gt;var value = foo.getBar().getBaz().toLowerCase();&lt;/pre&gt;
&lt;p&gt;Running this snippet may result in something like the following:&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="generic"&gt;Exception in thread "main" java.lang.NullPointerException
 at ch.frankel.blog.NpeSample.main(NpeSample.java:10)&lt;/pre&gt;
&lt;p&gt;At this point, you have no clue which part is &lt;code&gt;null&lt;/code&gt; in the call chain: &lt;code&gt;foo&lt;/code&gt;, or the value returned by &lt;code&gt;getBar()&lt;/code&gt; or &lt;code&gt;getBaz()&lt;/code&gt;?&lt;/p&gt;</description></item><item><title>Observability for JVM Frameworks with Grafana in Java and Kotlin</title><link>https://foojayio.github.io/website/today/observability-for-jvm-frameworks-with-grafana-in-java-and-kotlin/</link><pubDate>Wed, 30 Mar 2022 06:30:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/observability-for-jvm-frameworks-with-grafana-in-java-and-kotlin/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/observability-for-jvm-frameworks-with-grafana-in-java-and-kotlin/observ_img1-700x470.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Grafana dashboard for all running frameworks&lt;/p&gt;
&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In times of Cloud and distributed applications, it is becoming more and more important to be able to evaluate a functionality at runtime, an aspect which is referred to as &lt;a href="https://en.wikipedia.org/wiki/Observability" target="_blank" rel="noopener noreferrer"&gt;observability&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;A Cloud-based application is usually set up as a collection of different subsystems that may be located in one or more network zones or machines. These subsystems communicate with each other by passing messages (signals) and executing desired actions to each other. The whole collection then appears to the end user as a single coherent system.&lt;/p&gt;</description></item><item><title>Debugging Java Equals &amp; Hashcode Performance in Production</title><link>https://foojayio.github.io/website/today/debugging-java-equals-hashcode-performance-in-production/</link><pubDate>Tue, 29 Mar 2022 06:50:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/debugging-java-equals-hashcode-performance-in-production/</guid><description>&lt;p&gt;I wrote a lot about the performance metrics of the equals method and hash code in &lt;a href="https://talktotheduck.dev/hashcode-and-equals-debugging-performance" target="_blank" rel="noopener noreferrer"&gt;this article&lt;/a&gt;
. There are many nuances that can lead to performance problems in those methods. The problem is that some of those things can be well hidden.&lt;/p&gt;
&lt;p&gt;To summarize the core problem: the hashcode method is central to the Java Collections API. Specifically, with the performance of hash tables (specifically the Map interface hash table). The same is true with the equals method. If we have anything more complex than a string object or a primitive, the overhead can quickly grow.&lt;/p&gt;</description></item><item><title>5 Things You Probably Didn’t Know About Java Concurrency</title><link>https://foojayio.github.io/website/today/5-things-you-probably-didnt-know-about-java-concurrency/</link><pubDate>Fri, 25 Mar 2022 05:51:41 +0000</pubDate><guid>https://foojayio.github.io/website/today/5-things-you-probably-didnt-know-about-java-concurrency/</guid><description>&lt;p&gt;Threads are at the heart of the Java programming language. When we run a &amp;ldquo;Hello World&amp;rdquo; Java program, we run on the main thread. From there, we can create threads easily, as we need to compose our application code to be functional, responsive, and performant, all at the same time.&lt;/p&gt;
&lt;p&gt;Think about a web server: it simultaneously handles many thousands of requests at the same time. In Java, we achieve this using multiple threads. While threads are helpful, they are full of dread/thread to many developers.&lt;/p&gt;</description></item><item><title>All about Generics: Part 1</title><link>https://foojayio.github.io/website/today/all-about-generics-part-1/</link><pubDate>Sun, 20 Mar 2022 22:54:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/all-about-generics-part-1/</guid><description>&lt;p&gt;Generics are used to parameterize types. A piece of code can be written generically enough so that we can fit a variety of types in it. Being a strongly type-safe language, Java requires to specify types in all aspects of its code, methods, fields, interfaces, etc.&lt;/p&gt;
&lt;p&gt;However, generics is one of the tricky ways to make it possible to use type parameterization so that one particular portion or entirely of a class or their subclass can support a variety of types if an entity such as class, interface, or method that operates on a parameterized type is said to be a generic entity.&lt;/p&gt;</description></item><item><title>7 Reasons Why, After 26 Years, Java Still Makes Sense!</title><link>https://foojayio.github.io/website/today/7-reasons-why-after-26-years-java-still-makes-sense/</link><pubDate>Tue, 15 Mar 2022 08:02:48 +0000</pubDate><guid>https://foojayio.github.io/website/today/7-reasons-why-after-26-years-java-still-makes-sense/</guid><description>&lt;p&gt;Java has been and continues to be the most popular language over the last two decades. It has always been in the top 5 in the &lt;a href="https://www.tiobe.com/tiobe-index/" target="_blank" rel="noopener noreferrer"&gt;TIOBE index&lt;/a&gt;
 in terms of popularity. Besides popularity, Java is especially dominant in the enterprise world.&lt;/p&gt;
&lt;p&gt;However, in recent years, with the popularity of microservices and data science, other programming languages, such as Python, have gained in popularity. Some developers may view this as concerning news, as it may indicate the decline of Java, while others would argue differently.&lt;/p&gt;</description></item><item><title>Java Bytecode Simplified: Journey to the Wonderland (Part 1)</title><link>https://foojayio.github.io/website/today/java-bytecode-simplified-journey-to-the-wonderland-part-1/</link><pubDate>Tue, 08 Mar 2022 10:16:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-bytecode-simplified-journey-to-the-wonderland-part-1/</guid><description>&lt;p&gt;There are two ways to see a thing. One, see it as it appears to us; two, see it and appreciate it. For example, we get light when we switch on a lightbulb. We press the button and then get busy with our life. Pretty simple, but boring. On the other hand, if we know how the light gets energy from an electrical power grid far from our home with wires and while travelling through the wires and filament, the filament heats up and starts emitting photons, we get to see in the light; we can then appreciate the blessing.&lt;/p&gt;</description></item><item><title>Java Thread Programming (Part 14)</title><link>https://foojayio.github.io/website/today/java-thread-programming-part-14/</link><pubDate>Tue, 01 Mar 2022 12:03:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-thread-programming-part-14/</guid><description>&lt;p&gt;In our &lt;a href="https://foojayio.github.io/website/today/java-thread-programming-part-13/"&gt;previous article&lt;/a&gt;
, we discussed the thread pool&amp;rsquo;s sizing. We stipulated that if work is computational, we don&amp;rsquo;t need more threads than the available number of processors. We will discuss this idea a bit further in this article.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s think about an example:&lt;/p&gt;
&lt;p&gt;We all know how to compute the Fibonacci series. The simple code is given below-&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="generic"&gt;public static long fib(int n) {
 if (n &amp;lt; 2) {
 return n;
 } else {
 return fib(n - 2) + fib(n - 2);
 }
}&lt;/pre&gt;
&lt;p&gt;Over here, we have used recursion to solve the Fibonacci series. To find the Fibonacci number of n, we must know the previous two. Each of them again will require to calculate the previous two. The process will continue until it reaches to the bases case and then we have a result.&lt;/p&gt;</description></item><item><title>Project Panama for Newbies (Part 4)</title><link>https://foojayio.github.io/website/today/project-panama-for-newbies-part-4/</link><pubDate>Thu, 24 Feb 2022 08:34:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/project-panama-for-newbies-part-4/</guid><description>&lt;p&gt;&lt;strong&gt;Updated December 31, 2025:&lt;/strong&gt; This article now features Java 25 and the Foreign Function &amp;amp; Memory (FFM) API, which has been a standard feature since JDK 22.&lt;/p&gt;
&lt;p&gt;Welcome to Part 4 of Java&amp;rsquo;s Project Panama for newbies! If you&amp;rsquo;ve been following &lt;a href="https://foojayio.github.io/website/today/project-panama-for-newbies-part-1/"&gt;this&lt;/a&gt;
 &lt;a href="https://foojayio.github.io/website/today/project-panama-for-newbies-part-2/"&gt;series&lt;/a&gt;
 of &lt;a href="https://foojayio.github.io/website/today/project-panama-for-newbies-part-3/"&gt;posts&lt;/a&gt;
 on how to use Java&amp;rsquo;s Project Panama APIs you probably have noticed that all of the examples thus far demonstrate how Java code can execute C code by using the &lt;a href="https://github.com/openjdk/panama-foreign/blob/d8c0fe5918cb1c6c744eb26797ea4fa04142c237/doc/panama_ffi.md#c-linker" target="_blank" rel="noopener noreferrer"&gt;linker&lt;/a&gt;
&amp;rsquo;s &lt;code&gt;downCall()&lt;/code&gt; method.&lt;/p&gt;</description></item><item><title>System Logger</title><link>https://foojayio.github.io/website/today/system-logger/</link><pubDate>Fri, 18 Feb 2022 12:34:57 +0000</pubDate><guid>https://foojayio.github.io/website/today/system-logger/</guid><description>&lt;p&gt;December was not a good time for Java developers and even less for Ops. The former had to repackage their apps with a fixed Log4J&amp;rsquo;s version, and the latter had to redeploy them - several times. Yet, every cloud has a silver lining. In my case, I learned about &lt;code&gt;System.Logger&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/OndroMih/status/1469599938782932992" target="_blank" rel="noopener noreferrer"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;[&lt;/p&gt;
&lt;img fetchpriority="high" decoding="async" class="size-medium wp-image-52382 aligncenter" src="Screenshot-2022-02-12-at-16.53.31-700x451.png" alt="" width="700" height="451"&gt;
&lt;p&gt;](&lt;a href="https://twitter.com/OndroMih/status/1469599938782932992" target="_blank" rel="noopener noreferrer"&gt;https://twitter.com/OndroMih/status/1469599938782932992&lt;/a&gt;
)
In short, &lt;code&gt;System.Logger&lt;/code&gt; is a façade over your logging engine. Instead of using, say, SFL4J&amp;rsquo;s API and the wanted implementation, you&amp;rsquo;d use &lt;code&gt;System.Logger&lt;/code&gt; instead of SLF4J. It&amp;rsquo;s available since Java 9, and it&amp;rsquo;s a bummer that I learned about it only recently.&lt;/p&gt;</description></item><item><title>Java Thread Programming (Part 13)</title><link>https://foojayio.github.io/website/today/java-thread-programming-part-13/</link><pubDate>Tue, 08 Feb 2022 08:15:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-thread-programming-part-13/</guid><description>&lt;p&gt;&lt;a href="https://foojayio.github.io/website/today/java-thread-programming-part-12/"&gt;Our previous article&lt;/a&gt;
 discussed different ways to create a Java thread pool and put and execute result-bearing tasks to the Pool. This article will go a bit in-depth about how many worker threads we could put in a pool to get the best result.&lt;/p&gt;
&lt;p&gt;Using the Executors factory class, we can create our thread pool; however, all the factory methods internally create an instance of ThreadPoolExcutors. This class is the representation of ThreadPool that we use. We can directly create a pool invoking its constructor. The constructor takes 7 arguments:&lt;/p&gt;</description></item><item><title>Java Thread Programming (Part 12)</title><link>https://foojayio.github.io/website/today/java-thread-programming-part-12/</link><pubDate>Tue, 01 Feb 2022 16:02:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-thread-programming-part-12/</guid><description>&lt;p&gt;In our &lt;a href="https://foojayio.github.io/website/today/java-thread-programming-part-11/"&gt;previous article&lt;/a&gt;
, we introduced ThreadPool through the Executor Framework. This article will discuss the different ways we can create ThreadPool.&lt;/p&gt;
&lt;p&gt;The Executors is a factory class, and it has a few static methods ( factory method). Let&amp;rsquo;s look at them one by one-&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Executors.newFixedThreadPool(int nThreads):&lt;/strong&gt; - this method takes an argument, and with that, we can specify the number of threads we want to have. The threads it creates are called worker Threads. It doesn&amp;rsquo;t matter how many tasks we put into this ThreadPool; the number of thread will remain the same the whole lifetime of this ThreadPool. If a thread dies for some reason, it will create a new one to keep the number the same.&lt;/p&gt;</description></item><item><title>Java Thread Programming (Part 11)</title><link>https://foojayio.github.io/website/today/java-thread-programming-part-11/</link><pubDate>Wed, 26 Jan 2022 07:58:30 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-thread-programming-part-11/</guid><description>&lt;p&gt;In the &lt;a href="https://foojayio.github.io/website/today/java-thread-programming-part-2/" title="second article of this series"&gt;second article of this series&lt;/a&gt;
, we saw that we can create a functional web server application using Java threads. With that, we could receive multiple requests from many clients and serve them properly.&lt;/p&gt;
&lt;p&gt;However, there is a limitation. We cannot just receive an unbounded number of requests simultaneously. The constraint is not on the sockets. The modern OS can handle millions of open sockets at a time. That means, in theory, we should be able to serve that many requests at a time.&lt;/p&gt;</description></item><item><title>The State of Pattern Matching in Java 17</title><link>https://foojayio.github.io/website/today/the-state-of-pattern-matching-in-java-17/</link><pubDate>Mon, 03 Jan 2022 10:35:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-state-of-pattern-matching-in-java-17/</guid><description>&lt;p&gt;So what exactly is pattern matching?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;The act of checking a given sequence of tokens for the presence of the constituents of some pattern.&amp;rdquo; &amp;ndash; Wikipedia&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Or simply put, pattern matching is a language feature where you can test for a specific pattern on a character sequence or a data structure.&lt;/p&gt;
&lt;p&gt;Pattern matching can be classified into two types.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sequence patterns&lt;/strong&gt;: pattern matching on character sequence or strings. Also known as our beloved Regular Expressions 😉 &amp;mdash; I still wish I could write RegEx without cursing and looking up the syntax.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tree patterns&lt;/strong&gt;: testing for patterns on a data structure. This is what we are going to talk about today.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/M6xKDas.jpeg" alt="regex meme" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>Java Thread Programming (Part 10)</title><link>https://foojayio.github.io/website/today/java-thread-programming-part-10/</link><pubDate>Wed, 22 Dec 2021 09:23:41 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-thread-programming-part-10/</guid><description>&lt;p&gt;In this article, I will discuss &lt;code&gt;BlockingQueue&lt;/code&gt;, one of the essential concurrent collections available in the concurrent package in the JDK. In &lt;a href="https://foojayio.github.io/website/today/java-thread-programming-part-6/"&gt;one of our previous articles&lt;/a&gt;
, we discussed the Producer/Consumer pattern. We will implement the same pattern today using BlockingQueue.&lt;/p&gt;
&lt;p&gt;In that implementation, we used a buffer, and when Buffer is full, we put the producer thread in a waiting state. And if Buffer is empty, we put the consumer thread in a waiting state. To coordinate between threads, we had to use, wait(), notify() and notifyAll(), these low-level constructs. However, if we use BlockingQueue, we don&amp;rsquo;t have to use these low-level details. BlockingQueue was implemented with such details built in, so that we can just rely on it. It has two methods that are important in our discussion:&lt;/p&gt;</description></item><item><title>Equals and Hashcode Implementation Considerations</title><link>https://foojayio.github.io/website/today/equals-and-hashcode-implementation-considerations/</link><pubDate>Sun, 21 Nov 2021 11:55:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/equals-and-hashcode-implementation-considerations/</guid><description>&lt;p&gt;I always struggled with how to implement equals and hashcode, until I learned about the difference between entities and value objects.&lt;/p&gt;
&lt;h3 id="_why_implement_equals_and_hashcode"&gt;Why implement equals and hashcode?&lt;/h3&gt;
&lt;p&gt;All classes in Java inherit from &lt;code&gt;java.lang.Object&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html#equals%28java.lang.Object%29" target="_blank" rel="noopener noreferrer"&gt;equals()&lt;/a&gt;
 and &lt;a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html#hashCode%28%29" target="_blank" rel="noopener noreferrer"&gt;hashCode()&lt;/a&gt;
 methods are two important methods that you usually should override when defining your own classes.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;equals()&lt;/code&gt; is important for comparing 2 objects to check if they represent &lt;em&gt;the same thing&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;We will see in a bit what that means exactly for different types of objects.&lt;/p&gt;</description></item><item><title>Java Thread Programming (Part 6)</title><link>https://foojayio.github.io/website/today/java-thread-programming-part-6/</link><pubDate>Tue, 16 Nov 2021 15:02:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-thread-programming-part-6/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Have you ever wondered what is the purpose of the &amp;ldquo;wait()&amp;rdquo;, &amp;ldquo;notify()&amp;rdquo;, &amp;ldquo;notifyAll()&amp;rdquo; methods that come with each Java object? Well, this article will explain that!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/java-thread-programming-part-5/"&gt;the previous article&lt;/a&gt;
, we learned how to use shared variables in a multi-threaded context and ensure thread safety avoiding data race and race conditions. However, in programming, sometimes multiple threads require to coordinate with each other by sending signals. For example -&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For a thread, it&amp;rsquo;s not yet their turn to start work; rather it&amp;rsquo;s waiting for a signal to start.&lt;/li&gt;
&lt;li&gt;A thread is working, but to complete its work, it needs more data; it can send a signal to the Producer to produce more data.&lt;/li&gt;
&lt;li&gt;Another thread that are producing data can signal other thread that data is ready.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Basically, there are many similar cases when we need to coordinate among multiple threads. Let&amp;rsquo;s discuss this in this article.&lt;/p&gt;</description></item><item><title>Let’s Use Optional to Fix Method Contracts</title><link>https://foojayio.github.io/website/today/lets-use-optional-to-fix-method-contracts/</link><pubDate>Wed, 10 Nov 2021 11:56:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/lets-use-optional-to-fix-method-contracts/</guid><description>&lt;p&gt;A method is a contract: when we define one, we put thought into it. We specify parameters with their type and also a return type. When we invoke a method, we expect it to behave according to the contract. If it doesn&amp;rsquo;t, it&amp;rsquo;s a violation of the contract.&lt;/p&gt;
&lt;p&gt;We have been dealing with such violations all the time. We invoke a method with its proper arguments and we get a return. However, sometimes we end up getting a null, which is, in fact, a clear violation. We shouldn&amp;rsquo;t accept such a violation. If a method cannot return the value of the specified type, it should mention that in the method signature, the method may or may not be returning the value you are expecting. If we know it from the method signature, we then write our code accordingly.&lt;/p&gt;</description></item><item><title>Java Thread Programming (Part 5)</title><link>https://foojayio.github.io/website/today/java-thread-programming-part-5/</link><pubDate>Tue, 02 Nov 2021 08:29:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-thread-programming-part-5/</guid><description>&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/java-thread-programming-part-4/"&gt;our previous article&lt;/a&gt;
, we discussed the &amp;ldquo;data race&amp;rdquo; concept and how we can solve it using volatile keywords. However, this is not the only problem we face when dealing with code that runs in multi-threaded environments. In this article, we will discuss another situation called &amp;ldquo;race conditions&amp;rdquo; and how we can resolve it.&lt;/p&gt;
&lt;p&gt;By now, we know that threads share memory space so that multiple threads can read from and write to the same variable. Unfortunately, although this ability gives us faster memory access, it has an unpleasant side effect which we call &amp;ldquo;race condition,&amp;rdquo; and it creates data inconsistency in the program. To understand the problem, let&amp;rsquo;s see an example.&lt;/p&gt;</description></item><item><title>Java Thread Programming (Part 4)</title><link>https://foojayio.github.io/website/today/java-thread-programming-part-4/</link><pubDate>Tue, 26 Oct 2021 13:04:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-thread-programming-part-4/</guid><description>&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/java-thread-programming-part-3/"&gt;the previous article&lt;/a&gt;
, we discussed the visibility problem while working with multiple threads.&lt;/p&gt;
&lt;p&gt;We will discuss another similar situation in this article. However, we will use symbols and pseudocode to explain this.&lt;/p&gt;
&lt;h2 id="h2-0-symbols"&gt;Symbols&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s define the symbols first.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;L&lt;/code&gt; - Local variable, e.g., &lt;code&gt;L1&lt;/code&gt;, &lt;code&gt;L2&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;S&lt;/code&gt; - Shared variable, e.g., &lt;code&gt;S1&lt;/code&gt;, &lt;code&gt;S2&lt;/code&gt;, etc. These variables are visible among multiple threads. They can be static as well.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;S.X&lt;/code&gt; - here &lt;code&gt;X&lt;/code&gt; is a field of an object where &lt;code&gt;S&lt;/code&gt; is the reference of that Object, e.g., &lt;code&gt;S1.X&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Java Thread Programming (Part 3)</title><link>https://foojayio.github.io/website/today/java-thread-programming-part-3/</link><pubDate>Thu, 21 Oct 2021 13:20:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-thread-programming-part-3/</guid><description>&lt;p&gt;Continuing &lt;a href="https://foojayio.github.io/website/today/java-thread-programming-part-2/"&gt;from part 2&lt;/a&gt;
, let&amp;rsquo;s start this article with a bit of context first (&lt;em&gt;and if you don&amp;rsquo;t like reading text, you can skip this introduction, and go directly to the section below where I discuss pieces of code&lt;/em&gt;).&lt;/p&gt;
&lt;h2 id="h2-0-context"&gt;Context&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;When we start an application program, the operating system creates a process.&lt;/li&gt;
&lt;li&gt;Each process has a unique id (we call it PID) and a memory boundary.&lt;/li&gt;
&lt;li&gt;A process allocates its required memory from the main memory, and it manipulates data within a boundary.&lt;/li&gt;
&lt;li&gt;No other process can access the allocated memory that is already acquired by a process.&lt;/li&gt;
&lt;li&gt;It works like a sandbox, and in that way avoids processes stepping on one another&amp;rsquo;s foot.&lt;/li&gt;
&lt;li&gt;Ideally, we can have many small processes to run multiple things simultaneously on our computers and let the operating systems scheduler schedule them as it sees fit.&lt;/li&gt;
&lt;li&gt;In fact, this is how it was done before the development of threads. However, when we want to do large pieces of work, breaking them into smaller pieces, we need to accumulate them once they are finished.&lt;/li&gt;
&lt;li&gt;And not all tiny pieces can be independent, some of them must rely on each other, and thus we need to share information amongst them.&lt;/li&gt;
&lt;li&gt;To do that, we use inter-process communication. The problem with this idea is that having too many processes on a computer and then communicating with each other isn&amp;rsquo;t cheap. And precisely that is where the notion of threads comes into the picture.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The idea of the thread is that a process can have many tiny processes within itself. These small processes can share the memory space that a process acquires. These little processes are called a thread. So the bottom line is, threads are independent execution environments in the CPU and share the same memory space. That allows them faster memory access and better performance.&lt;/p&gt;</description></item><item><title>Java Thread Programming (Part 2)</title><link>https://foojayio.github.io/website/today/java-thread-programming-part-2/</link><pubDate>Tue, 12 Oct 2021 09:07:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-thread-programming-part-2/</guid><description>&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/java-thread-programming-part-1/"&gt;our earlier article&lt;/a&gt;
, we explained the background to threading and how to create and start a thread.&lt;/p&gt;
&lt;p&gt;In this article, let&amp;rsquo;s see an example where we can use Threads to our benefit.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s assume we are going to build a web server. For the sake of the example, let&amp;rsquo;s constrain ourselves to one single use case, which is that the web server will listen to any client, and if it receives a URL, it will return the top five most frequently used words in that website.&lt;/p&gt;</description></item><item><title>Java Thread Programming (Part 1)</title><link>https://foojayio.github.io/website/today/java-thread-programming-part-1/</link><pubDate>Thu, 07 Oct 2021 10:07:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-thread-programming-part-1/</guid><description>&lt;h2 id="h2-0-what-is-a-thread"&gt;What is a Thread?&lt;/h2&gt;
&lt;p&gt;We write code in a file line by line, and then it gets executed. To be able to execute a piece of code requires an execution environment. In Java, &lt;strong&gt;a thread is an execution environment&lt;/strong&gt;. If a program has only one execution environment, then we call this program a single-threaded program.&lt;/p&gt;
&lt;p&gt;Interestingly, in Java, we can create a lot of threads to run different parts of the code of a program executing independently. And when we have achieved that, we call it a multi-threaded program.&lt;/p&gt;</description></item><item><title>Reclaim 25% of Java Heap Memory &amp; Lower Your Cloud Bills</title><link>https://foojayio.github.io/website/today/compact-strings-reclaim-25-of-java-heap-memory-lower-your-cloud-bills/</link><pubDate>Fri, 24 Sep 2021 09:15:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/compact-strings-reclaim-25-of-java-heap-memory-lower-your-cloud-bills/</guid><description>&lt;p&gt;Did you know that you can save up to 25% of your heap memory and your Cloud bills without any effort? Well, it&amp;rsquo;s true. Many exciting features have been added to the latest releases of Java recently and I&amp;rsquo;m going to cover one that is often overlooked in this article.&lt;/p&gt;
&lt;p&gt;We all know that Strings are the most used Object in any Java application. In fact, they probably take up almost half of the heap size of any Java application. Before delving into this much further, let me answer your obvious question: what are Strings made of?&lt;/p&gt;</description></item><item><title>Demystifying Memory Management in Modern Programming Languages</title><link>https://foojayio.github.io/website/today/demystifying-memory-management-in-modern-programming-languages/</link><pubDate>Tue, 07 Sep 2021 08:13:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/demystifying-memory-management-in-modern-programming-languages/</guid><description>&lt;p&gt;&lt;img src="https://i.imgur.com/R0mdaId.png" alt="Cover" title="Cover" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;In this multi-part series, I aim to demystify the concepts behind memory management and take a deeper look at memory management in some of the modern programming languages.&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.&lt;/p&gt;
&lt;p&gt;Learning about memory management will also help us to write more performant code as the way we write code also has an impact on memory management regardless of the automatic memory management technique used by the language.&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>Introducing Teeing: A Hidden Gem in the Java API</title><link>https://foojayio.github.io/website/today/teeing-java-api/</link><pubDate>Wed, 12 May 2021 07:15:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/teeing-java-api/</guid><description>&lt;p&gt;Last week, I &lt;a href="https://blog.frankel.ch/real-world-stream-collector/" target="_blank" rel="noopener noreferrer"&gt;described a use-case&lt;/a&gt;
 for a custom Stream &lt;code&gt;Collector&lt;/code&gt;. I received a intriguing comment on Twitter:&lt;/p&gt;
&lt;img fetchpriority="high" decoding="async" class="aligncenter wp-image-44873 size-medium" src="Screenshot-2021-05-09-at-15.31.46-700x171.png" alt="" width="700" height="171"&gt;
&lt;br /&gt;
&lt;p&gt;Hats off to you, Miguel! Your comment revealed a method I didn&amp;rsquo;t know!&lt;/p&gt;
&lt;p&gt;So I decided to investigate what is the &lt;code&gt;teeing()&lt;/code&gt; method about.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Returns a Collector that is a composite of two downstream collectors. Every element passed to the resulting collector is processed by both downstream collectors, then their results are merged using the specified merge function into the final result.&lt;/p&gt;</description></item><item><title>Taking A Deep Dive Into Multi-Threading in Java</title><link>https://foojayio.github.io/website/today/deep-dive-into-multi-threading-in-java/</link><pubDate>Tue, 13 Apr 2021 07:21:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/deep-dive-into-multi-threading-in-java/</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;p&gt;Multi-threading represents a very intriguing topic, even after years of research and development for high quality, robust, and efficient software. With equal emphasis on hardware improvements and the software that runs on it &amp;ndash; we have newer paradigms for parallelism. The most important yet basic concepts are the ones which I present here. I then explain the intricacies of multi-threading in the Java programming language. Some of these are newer features and supported only from the Java Platform Standard Edition 5.0. Let us start with a quick overview and understanding of the core concepts.&lt;/p&gt;</description></item><item><title>Embracing JVM unified logging (JEP-158 / JEP-271)</title><link>https://foojayio.github.io/website/today/embracing-jvm-unified-logging/</link><pubDate>Wed, 10 Mar 2021 18:20:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/embracing-jvm-unified-logging/</guid><description>&lt;p&gt;In the previous &lt;a href="https://foojayio.github.io/website/today/introduction-to-jvm-unified-logging-jep-158-jep-271/"&gt;blog post&lt;/a&gt;
, I briefly introduced unified logging and a simple GC configuration. However for the savvy GC tuners, there are many more options. And there are other logging options that transitionned to unified logging infrastructure as well.&lt;/p&gt;
&lt;p&gt;I wasn&amp;rsquo;t satisfied with the official documentation and other blog posts as they usually present only a fragmented picture of the previous options. This led me to dig in.&lt;/p&gt;
&lt;h2 id="_migrating_the_gc_logging_continued"&gt;Migrating the GC logging (continued)&lt;/h2&gt;
&lt;p&gt;|&amp;mdash;&amp;mdash;|&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;ndash;|
| Note | These log are based on JDK11u. |&lt;/p&gt;</description></item><item><title>Modules, Modules, Everywhere, on Maven Central!</title><link>https://foojayio.github.io/website/today/modules-modules-everywhere/</link><pubDate>Wed, 24 Feb 2021 08:34:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/modules-modules-everywhere/</guid><description>&lt;h3 id="h3-0-project-sormuras-modules"&gt;Project 🧩 sormuras/modules&lt;/h3&gt;
&lt;p&gt;Since August 2018, I have been compiling an overview of Java modules uploaded to Maven Central at &lt;a href="https://github.com/sormuras/modules" target="_blank" rel="noopener noreferrer"&gt;https://github.com/sormuras/modules&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;This overview is generated by the &lt;a href="https://github.com/sormuras/modules/blob/main/src/Scanner.java" target="_blank" rel="noopener noreferrer"&gt;Scanner&lt;/a&gt;
 program and it is based on the results of the &lt;a href="https://github.com/sandermak/modulescanner" target="_blank" rel="noopener noreferrer"&gt;modulescanner&lt;/a&gt;
 that is run on &lt;a href="https://sonatype.com" target="_blank" rel="noopener noreferrer"&gt;Sonatype&lt;/a&gt;
s hardware on every uploaded JAR file and stored in an AWS S3 bucket, setup together with the &lt;a href="https://adoptopenjdk.net/" target="_blank" rel="noopener noreferrer"&gt;AdoptOpenJDK&lt;/a&gt;
 team at their &lt;a href="https://adoptopenjdk.slack.com/archives/CB7L6GDUK" target="_blank" rel="noopener noreferrer"&gt;#java9plusadoption&lt;/a&gt;
 Slack channel. Some of those uploaded JAR files are Java modules. They are the interesting subjects of this overview as they contain a &lt;code&gt;module-info.class&lt;/code&gt;, a compiled module descriptor with a stable name and an explicit API their author(s) comitted to.&lt;/p&gt;</description></item><item><title>Much Ado About Nothing (Also Known As "Null") In Java</title><link>https://foojayio.github.io/website/today/much-ado-about-nothing-in-java/</link><pubDate>Tue, 23 Feb 2021 15:19:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/much-ado-about-nothing-in-java/</guid><description>&lt;p&gt;Occasionally something in Java pops up that I thought I knew about, but it turns out I didn&amp;rsquo;t appreciate all the subtle details.&lt;/p&gt;
&lt;p&gt;This was recently the case for &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Before I started using Java, the main programming language I used was C. This was great for things like operating systems and device drivers because it uses &lt;em&gt;&lt;strong&gt;explicit&lt;/strong&gt;&lt;/em&gt; pointers. References to data are through a numerical address that can be manipulated if required. This was probably (for me at least) the hardest thing to master, especially when you try to figure out things like this:&lt;/p&gt;</description></item><item><title>Learning About Optional.stream() in OpenJDK and Java</title><link>https://foojayio.github.io/website/today/optional-stream/</link><pubDate>Mon, 22 Feb 2021 17:11:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/optional-stream/</guid><description>&lt;p&gt;This week, I learned about a nifty &amp;ldquo;new&amp;rdquo; feature of &lt;code&gt;Optional&lt;/code&gt; that I want to share in this post. It&amp;rsquo;s available since Java 9, so its novelty is relative.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with the following sequence to compute the total price of an order:&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="java"&gt;public BigDecimal getOrderPrice(Long orderId) {
 List&amp;lt;OrderLine&amp;gt; lines = orderRepository.findByOrderId(orderId);
 BigDecimal price = BigDecimal.ZERO; // 1
 for (OrderLine line : lines) {
 price = price.add(line.getPrice()); // 2
 }
 return price;
}&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Provide an accumulator variable for the price&lt;/li&gt;
&lt;li&gt;Add each line&amp;rsquo;s price to the total price&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Nowadays, it&amp;rsquo;s probably more adequate to use streams instead of iterations. The following snippet is the equivalent to the previous one:&lt;/p&gt;</description></item><item><title>Migrating Browser-Based Java Applets to IcedTea-Web using JNLP</title><link>https://foojayio.github.io/website/today/migrating-browser-based-java-applets-to-icedtea-web-using-jnlp/</link><pubDate>Tue, 02 Feb 2021 07:55:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/migrating-browser-based-java-applets-to-icedtea-web-using-jnlp/</guid><description>&lt;p&gt;&amp;ldquo;Does it run on JDK 11?&amp;rdquo; &amp;ndash; That&amp;rsquo;s an always interesting question!&lt;/p&gt;
&lt;p&gt;As a practical, more challenging example around this question, I used a 20 year old JAR, once created for a Java Applet to be run in the Java 1.1 Browser Plugin. Yes, that&amp;rsquo;s 1.1 not 11!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;To cut to the chase for those who fear this may be too long to read: yes it runs!&lt;/strong&gt; 🙂&lt;/p&gt;
&lt;p&gt;And to provide more detail&amp;mdash;it now runs outside of any Web Browser and without modifying its decades-old JAR. The Applet was once created and offered to browse through all raw color images uploaded by the Mars Pathfinder Lander which settled down on the planet on July 4th, 1997.&lt;/p&gt;</description></item><item><title>How to Create Self-Contained Executable JARs</title><link>https://foojayio.github.io/website/today/creating-self-contained-executable-jars/</link><pubDate>Mon, 01 Feb 2021 08:40:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/creating-self-contained-executable-jars/</guid><description>&lt;p&gt;When your application goes beyond a dozen of lines of code, you should probably split the code into multiple classes. At this point, the question is how to distribute them. In Java, the classical format is the Java ARchive, better known as the JAR. But real-world applications probably depend on other JARs.&lt;/p&gt;
&lt;p&gt;This article aims to describe ways to create self-contained executable JARs, also known as uber-JARs or fat JARs.&lt;/p&gt;</description></item><item><title>How to Avoid NullPointerException in Java Code</title><link>https://foojayio.github.io/website/today/avoiding-nullpointerexception/</link><pubDate>Tue, 22 Dec 2020 10:14:41 +0000</pubDate><guid>https://foojayio.github.io/website/today/avoiding-nullpointerexception/</guid><description>&lt;p&gt;The terrible &lt;code&gt;NullPointerException&lt;/code&gt; (NPE for short) is the most frequent Java exception occurring in production, according to &lt;a href="https://www.overops.com/blog/the-top-10-exceptions-types-in-production-java-applications-based-on-1b-events/" target="_blank" rel="noopener noreferrer"&gt;a 2016 study&lt;/a&gt;
. In this article we&amp;rsquo;ll explore the main techniques to fight it: the self-validating model and the &lt;code&gt;Optional&lt;/code&gt; wrapper.&lt;/p&gt;
&lt;h2 id="h2-0-self-validating-model"&gt;Self-Validating Model&lt;/h2&gt;
&lt;p&gt;Imagine a business rule: every Customer has to have a birth date set. There are a number of ways to implement this constraint: validating the user data on the create and update use-cases, enforcing it via &lt;code&gt;NOT NULL&lt;/code&gt; database constraint and/or implementing the null-check right in the constructor of the Customer entity. In this article we&amp;rsquo;ll explore the last one.&lt;/p&gt;</description></item><item><title>Seven Ways to Contribute to the OpenJDK</title><link>https://foojayio.github.io/website/today/7-ways-to-contribute-to-openjdk/</link><pubDate>Wed, 18 Nov 2020 08:49:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/7-ways-to-contribute-to-openjdk/</guid><description>&lt;p&gt;A great many developers today are employed working with OpenJDK. If OpenJDK is the background source for your livelihood, you might want to contribute to future development of the OpenJDK.&lt;/p&gt;
&lt;p&gt;There are many ways you can do this. In this article I outline 7 possibilities, ranging from minimal work (because you&amp;rsquo;re too busy to do much, but you&amp;rsquo;d like to do something) to intensive work (participating on OpenJDK development is everything you want to do, it&amp;rsquo;s more than a hobby, you want to contribute to the maximum extent possible).&lt;/p&gt;</description></item><item><title>OpenJDK, JDKs and Every Java Acronym in Between</title><link>https://foojayio.github.io/website/today/openjdk-jdks-and-every-java-acronym-in-between/</link><pubDate>Wed, 04 Nov 2020 09:57:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/openjdk-jdks-and-every-java-acronym-in-between/</guid><description>&lt;p&gt;The Java SE landscape is strewn with acronyms that it has picked up over the last 25 years. Sometimes those acronyms even mean multiple things. This post attempts to explain them all in terms of two main groupings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OpenJDK&lt;/li&gt;
&lt;li&gt;Java Development Kits (JDKs)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-0-what-is-openjdk"&gt;What is &amp;lsquo;OpenJDK&amp;rsquo;?&lt;/h2&gt;
&lt;p&gt;The phrase &lt;em&gt;OpenJDK&lt;/em&gt; is used to describe at least three fundamental things in the Java ecosystem.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;First use&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Firstly, there is a place called &lt;em&gt;OpenJDK&lt;/em&gt; which lives at &lt;a href="https://openjdk.java.net/" target="_blank" rel="noopener noreferrer"&gt;https://openjdk.java.net/&lt;/a&gt;
 also known to some as &lt;em&gt;The OpenJDK Project&lt;/em&gt; , which is a place to collaborate on an open-source implementation of the Java specifications from Oracle - &lt;a href="https://www.oracle.com/java/technologies/java-se-glance.html" target="_blank" rel="noopener noreferrer"&gt;https://www.oracle.com/java/technologies/java-se-glance.html&lt;/a&gt;
, which are released every 6 months. Sun Microsystems open-sourced the majority of Java in 2006 under the GNU General Public License (GNU GPL) version 2 with a linking exception. &lt;em&gt;OpenJDK&lt;/em&gt; serves as a continuation of that change. This is the use that I will refer to througout this blog. When I say &lt;em&gt;OpenJDK&lt;/em&gt; I mean the &lt;a href="https://openjdk.java.net/" target="_blank" rel="noopener noreferrer"&gt;https://openjdk.java.net/&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Running Single-File Java Source Code Without Compiling (Part 2)</title><link>https://foojayio.github.io/website/today/running-single-file-java-source-code-without-compiling-part-2/</link><pubDate>Thu, 10 Sep 2020 15:54:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/running-single-file-java-source-code-without-compiling-part-2/</guid><description>&lt;p&gt;&lt;a href="https://foojayio.github.io/website/blog/running-single-file-java-source-code-without-compiling-part-1/"&gt;Let&amp;rsquo;s continue from part 1 of this series&lt;/a&gt;
, by looking at JEP 330, Launch Single-File Source-Code Programs, which is one of the new features introduced in the OpenJDK 11 release. This feature allows you to execute a Java source code file directly using the &lt;code&gt;java&lt;/code&gt; interpreter. The source code is compiled in memory and then executed by the interpreter, without producing a .class file on disk.&lt;/p&gt;
&lt;p&gt;However, this feature is limited to code that resides in a single source file. You cannot add additional source files to be compiled in the same run.&lt;/p&gt;</description></item><item><title>Running Single-File Java Source Code Without Compiling (Part 1)</title><link>https://foojayio.github.io/website/today/running-single-file-java-source-code-without-compiling-part-1/</link><pubDate>Tue, 08 Sep 2020 08:15:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/running-single-file-java-source-code-without-compiling-part-1/</guid><description>&lt;p&gt;If you recall the old days, before OpenJDK 11, say you have a &lt;code&gt;HelloUniverse.java&lt;/code&gt; source file that contains a class definition and a static main method, which prints out as a single line of text to the terminal, like 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;public class HelloUniverse{
 public static void main(String[] args) { 
 System.out.println("Hello foojay!");
 }
}&lt;/pre&gt;
&lt;p&gt;Normally to run this class, first, you would need to compile it, using a Java compiler (&lt;code&gt;javac&lt;/code&gt;), which would result in a &lt;code&gt;HelloUniverse.class&lt;/code&gt; file:&lt;/p&gt;</description></item><item><title>Overview of JVM Vendors and Choosing the Right One</title><link>https://foojayio.github.io/website/today/fantastic-jvms-and-where-to-find-them/</link><pubDate>Wed, 22 Jul 2020 13:07:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/fantastic-jvms-and-where-to-find-them/</guid><description>&lt;p&gt;Since you&amp;rsquo;re reading this blog, chances are that you&amp;rsquo;re writing software which will eventually run on a JVM. Most of you are using the Java language. Many of you are using a variety of other languages that target the JVM, such as Scala, Kotlin, Clojure, Groovy, (J)Ruby etc. Eventually you&amp;rsquo;ll need to decide on which JDK/JRE to deploy your software on in production. This is much easier said than done. There are quite a few different vendors out there, providing support and taking responsibility for the binaries they produce. They can have different support lengths for specific versions, and whereas you can sometimes find a vendor providing extended support for a version that has been officially end-of-lifed at Oracle, you may not find builds with the latest fixes in them publicly available. You&amp;rsquo;ll need to get those directly from the vendor.&lt;/p&gt;</description></item><item><title>Highlights of Changes to the Core Java Platform</title><link>https://foojayio.github.io/website/today/highlights-of-changes-to-the-core-java-platform/</link><pubDate>Thu, 02 Jul 2020 14:12:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/highlights-of-changes-to-the-core-java-platform/</guid><description>&lt;p&gt;February 12th, 1996. This is a significant date for me personally since it was the day I started work at Sun Microsystems as a Solaris Systems Engineer. It was also two weeks and six days after the release of the Java Development Kit (JDK 1.0).&lt;/p&gt;
&lt;p&gt;Of course, the origins of Java go further back than this; James Gosling and others started work on a new programming language in 1991, and it was the May 23rd 1995 when Java was officially announced to the world.&lt;/p&gt;</description></item><item><title>How does Java handle different Images and ColorSpaces – Part 4</title><link>https://foojayio.github.io/website/today/how-does-java-handle-different-images-and-colorspaces-part-4/</link><pubDate>Tue, 23 Jun 2020 17:20:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-does-java-handle-different-images-and-colorspaces-part-4/</guid><description>&lt;p&gt;Unless you are creating all your images, by drawing then inside the code with the Graphics2D commands, you will need an image library to load images as BufferedImages. You will also need an Image library if you wish to save the results.&lt;/p&gt;
&lt;p&gt;ImageIO is part of Java, it is free and it supports a range of Image formats including GIF, JPEG, PNG, and TIF. Because it is expandable, there are additional libraries to extend it. We recommend you check out the excellent &lt;a href="https://github.com/haraldk/TwelveMonkeys" target="_blank" rel="noopener noreferrer"&gt;TwelveMonkeys image library&lt;/a&gt;
 which is free and Open Source.&lt;/p&gt;</description></item><item><title>How does Java handle different Images and ColorSpaces – Part 3</title><link>https://foojayio.github.io/website/today/how-does-java-handle-different-images-and-colorspaces-part-3-introducing-the-bufferedimage/</link><pubDate>Mon, 22 Jun 2020 17:16:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-does-java-handle-different-images-and-colorspaces-part-3-introducing-the-bufferedimage/</guid><description>&lt;p&gt;BufferedImage is one of the most useful Java abstractions. It hides all the complexity of different types of images whilst allowing access to the underlying data. Under the hood, a BufferedImage can be many types of image. This is the list of types visible in an IDE.&lt;br&gt;
&lt;img src="https://blog.idrsolutions.com/wp-content/uploads/2020/01/Screenshot-2020-01-20-at-15.22.53-284x300.png" alt="BufferedImage types" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;The differences between the types of BufferedImage are:-&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Range of Colours (Binary will give back and white only, RGB will provide 24-bit color)&lt;/li&gt;
&lt;li&gt;Opacity (only available in ARGB &amp;ndash; the A is an 8 bit Alpha channel).&lt;/li&gt;
&lt;li&gt;Amount of memory used (ARGB uses the most as 4 bytes per pixel).&lt;/li&gt;
&lt;li&gt;Size of the saved file.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A BufferedImage generally uses the RGB, Gray or Binary Color Spaces. Data can be in other formats, and the raw raster data can be loaded and accessed for CMYK and YCCK, but the Colors will not display correctly. BufferedImage provides lots of methods to access the raw image data, including the Raster, pixel and ColorModel used.&lt;/p&gt;</description></item><item><title>How does Java handle different Images and ColorSpaces – Part 2</title><link>https://foojayio.github.io/website/today/how-does-java-handle-different-images-and-colorspaces-part-2/</link><pubDate>Sun, 21 Jun 2020 17:11:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-does-java-handle-different-images-and-colorspaces-part-2/</guid><description>&lt;p&gt;There are lots of different ways of describing Color. As developers, we are most familiar with the RGB model, where every color is defined by mixing Red, Green and Blue together. In the print world, CMYK is very common, where colors or printed by literally mixing different amounts of Cyan, Magenta, Yellow and Key (black). You may also come across other ways of describing color such as DeviceN. There are also lots of different versions of RGB.&lt;/p&gt;</description></item><item><title>How does Java handle different Images and ColorSpaces – Part 1</title><link>https://foojayio.github.io/website/today/how-does-java-handle-different-images-and-colorspaces-part-1/</link><pubDate>Sat, 20 Jun 2020 17:03:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-does-java-handle-different-images-and-colorspaces-part-1/</guid><description>&lt;p&gt;One of the attractions of Java is the way it abstracts and simplifies many programming constructs. In place of Tiffs, PNGs, JPEGs and other Image formats, you get a simple BufferedImage object. ImageIO and other third-party libraries such as our own &lt;a href="https://www.idrsolutions.com/jdeli/" target="_blank" rel="noopener noreferrer"&gt;JDeli image library&lt;/a&gt;
 provide methods to read and write a BufferedImage.&lt;/p&gt;
&lt;p&gt;We have spent a lot of time working with different images formats in the process of writing the &lt;a href="https://www.idrsolutions.com/jdeli/" target="_blank" rel="noopener noreferrer"&gt;JDeli&lt;/a&gt;
 Image library as a &lt;a href="https://www.idrsolutions.com/jdeli/imageio-replacement/" target="_blank" rel="noopener noreferrer"&gt;replacement for ImageIO&lt;/a&gt;
 and the aim of this series is to share that knowledge to a wider audience.&lt;/p&gt;</description></item></channel></rss>