<?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://foojay.io/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>Mon, 21 Sep 2026 05:58:59 +0000</lastBuildDate><atom:link href="https://foojay.io/today/category/java-core/index.xml" rel="self" type="application/rss+xml"/><item><title>Hello Java 27! Have You Been Working Out?</title><link>https://foojay.io/today/hello-java-27-have-you-been-working-out/</link><pubDate>Tue, 15 Sep 2026 08:00:00 +0000</pubDate><guid>https://foojay.io/today/hello-java-27-have-you-been-working-out/</guid><description>&lt;p&gt;It&amp;rsquo;s been six months since we saw a new Java release, and this new edition seems to be ready to flex its muscles. With numerous improvements to performance and security, Java 27 is like that friend that you haven&amp;rsquo;t seen all summer, and when you finally see them again it&amp;rsquo;s clear that they spent a lot of time in the gym!&lt;/p&gt;&#10;&lt;p&gt;This post focuses on everything that has been added in this release, giving you a brief introduction to each of the features. Where applicable the differences with Java 26 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 #101: Java 27 in Practice: Smaller Heaps, Smarter Defaults, and Valhalla on the Horizon</title><link>https://foojay.io/today/foojay-podcast-101/</link><pubDate>Mon, 14 Sep 2026 06:11:42 +0000</pubDate><guid>https://foojay.io/today/foojay-podcast-101/</guid><description>&lt;p&gt;JDK 27 arrives on 15 September 2026, and it is a feature release rather than a Long-Term Support one. That distinction matters less than it sounds: as Simon Ritter points out, all OpenJDK releases are delivered the same way, and &amp;ldquo;long-term support&amp;rdquo; is a property of the binary distributions you install, not of the platform itself. What JDK 27 does have is two changes that switch on by default and cost you nothing but the upgrade. Compact object headers shrink the per-object header from 64 bits to 32, which the JEP measures at a 22% reduction in heap and 8% in CPU on SPECjbb2015 — and because it is internal to the JVM, a JAR you built years ago benefits without a single line changing. Alongside it, G1 becomes the default garbage collector everywhere, including the small, single-core machines that used to fall back to the serial collector.&lt;/p&gt;</description></item><item><title>One Base URL, Many Coding Agents: What an OpenAI-Compatible Gateway Looks Like From java.net.http</title><link>https://foojay.io/today/one-base-url-many-coding-agents-what-an-openai-compatible-gateway-looks-like-from-java-net-http/</link><pubDate>Wed, 09 Sep 2026 16:09:53 +0000</pubDate><guid>https://foojay.io/today/one-base-url-many-coding-agents-what-an-openai-compatible-gateway-looks-like-from-java-net-http/</guid><description>&lt;p&gt;Somewhere in every coding agent there is an HTTP client. Claude Code, Codex, Cursor, Cline, OpenCode: strip away the terminal UI or the editor pane and each of them serializes a conversation into JSON, POSTs it to a base URL with an API key in a header, and streams the answer back. The client owns the prompt assembly, the tool loop and the rendering; the model sits on the far side of that socket.&lt;/p&gt;</description></item><item><title>Masking a JVM thread dump without breaking the analysis</title><link>https://foojay.io/today/masking-a-jvm-thread-dump-without-breaking-the-analysis/</link><pubDate>Wed, 09 Sep 2026 07:32:00 +0000</pubDate><guid>https://foojay.io/today/masking-a-jvm-thread-dump-without-breaking-the-analysis/</guid><description>&lt;p&gt;A few weeks ago I posted on r/java about detecting virtual thread pinning from a plain thread dump. The technical discussion was fine. The comment that stuck with me had nothing to do with pinning: &amp;ldquo;the problem isn&amp;rsquo;t taking the dump, it&amp;rsquo;s that uploading a production dump to a third-party site is against policy&amp;rdquo;. Not a preference. Policy. And the person saying it was right.&lt;/p&gt;&#10;&lt;p&gt;I run ThreadMine, a hosted thread dump analyzer, so that comment describes my own product. This article is about what I built in response: a small open-source CLI that rewrites the dump on your machine before it goes anywhere, in a way that keeps the analysis working. It&amp;rsquo;s called &lt;code&gt;tm-anon&lt;/code&gt;, it&amp;rsquo;s MIT, and it works with any analyzer, mine included. The interesting part isn&amp;rsquo;t the tool, it&amp;rsquo;s the constraint: you can&amp;rsquo;t just strip everything, because the analyzer needs most of what&amp;rsquo;s in there.&lt;/p&gt;</description></item><item><title>Debugging Is Invariant Discovery: What One Kafka Session Taught Us About AI Agents</title><link>https://foojay.io/today/debugging-is-invariant-discovery-what-one-kafka-session-taught-us-about-ai-agents/</link><pubDate>Tue, 08 Sep 2026 14:14:36 +0000</pubDate><guid>https://foojay.io/today/debugging-is-invariant-discovery-what-one-kafka-session-taught-us-about-ai-agents/</guid><description>&lt;p&gt;Every Java team has a sentence like this one somewhere:&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Any operation on a TID must go through the single asynchronous path and must not let TMS and EMV drift apart.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;It is the kind of rule that is obvious once said and invisible until then. A terminal ID (TID) in a payments system, an asynchronous pipeline that updates two downstream systems, and the requirement that the two never disagree. Nothing in the type system enforces a rule like that, and no single class owns it. Rules of this kind live between consumers, services and stores.&lt;/p&gt;</description></item><item><title>Community Spotlight: BoxLang Express Brings Node-Style HTTP to the JVM</title><link>https://foojay.io/today/community-spotlight-boxlang-express-brings-node-style-http-to-the-jvm/</link><pubDate>Tue, 08 Sep 2026 11:25:18 +0000</pubDate><guid>https://foojay.io/today/community-spotlight-boxlang-express-brings-node-style-http-to-the-jvm/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/community-spotlight-boxlang-express-brings-node-style-http-to-the-jvm/boxlang-express-700x373.jpg" alt="" width="700" height="373" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;If you&amp;rsquo;ve spent years in Spring Boot, Micronaut, or Jakarta EE, &amp;ldquo;web framework&amp;rdquo; usually means a servlet container, an embedded Tomcat or Netty, a build step, and a fat jar before anything answers a request. What if you could skip all of that and still be on the JVM?&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;BoxLang Express&lt;/strong&gt; , a new community module built entirely by developer &lt;a href="https://kisdigital.com/posts/2026/08/introducing-boxexpress--express-js-ergonomics-for-boxlang" title="Robert Zehnder of KISDigital" target="_blank" rel="noopener noreferrer"&gt;Robert Zehnder of KISDigital&lt;/a&gt;, does exactly that. It&amp;rsquo;s built directly on &lt;code&gt;com.sun.net.httpserver.HttpServer&lt;/code&gt;, a class that&amp;rsquo;s been sitting in the JDK since Java 6, so there&amp;rsquo;s no embedded server to configure and nothing extra on the classpath for the HTTP layer itself. &lt;code&gt;boxlang server.bxs&lt;/code&gt; is the whole deployment story.&lt;/p&gt;</description></item><item><title>“Commit created” — but it isn’t: why the agent’s word needs external verification, and what the mistake costs</title><link>https://foojay.io/today/commit-created-no-no-no-what-the-the-agents-word-needs-external-verification-what-the-mistake-costs/</link><pubDate>Tue, 08 Sep 2026 08:54:03 +0000</pubDate><guid>https://foojay.io/today/commit-created-no-no-no-what-the-the-agents-word-needs-external-verification-what-the-mistake-costs/</guid><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;A detailed report reads like proof. The agent lists the files it touched, names the branch, quotes a commit hash, adds a test count and closes with &amp;ldquo;done&amp;rdquo;. The work has a shape. The shape looks right. You have six more tickets.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;The report is model output. The commit, if it exists, lives in .git. The file, if it exists, lives on disk. The build result lives in a process exit code and a run log. The chat window is none of those places, and it can only vouch for itself.&lt;/p&gt;</description></item><item><title>Did Your AI Agent Ever Run a Debugger? One JVM Bug, Two Agent Runs</title><link>https://foojay.io/today/did-your-ai-agent-run-the-debugger-one-jvm-bug-two-agent-runs/</link><pubDate>Thu, 03 Sep 2026 13:48:32 +0000</pubDate><guid>https://foojay.io/today/did-your-ai-agent-run-the-debugger-one-jvm-bug-two-agent-runs/</guid><description>&lt;p&gt;Java developers reach for the debugger without thinking about it. Set a breakpoint, run the failing test, look at the variables, then decide what to change.&lt;/p&gt;&#10;&lt;p&gt;Most AI coding agents I have watched skip that step. They read the stack trace, read the source, and propose a patch. The reasoning can look excellent and still be a guess about a program nobody ran.&lt;/p&gt;&#10;&lt;p&gt;I wanted to know what that guess costs. So I took one real JVM bug, one model, one prompt, and ran it twice with two debugging workflows. Here is what the two transcripts show.&lt;/p&gt;</description></item><item><title>BoxLang 1.16.0 Released!</title><link>https://foojay.io/today/boxlang-1-16-0-released/</link><pubDate>Tue, 25 Aug 2026 13:57:47 +0000</pubDate><guid>https://foojay.io/today/boxlang-1-16-0-released/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/boxlang-1-16-0-released/boxlang-v1.16.0-700x467.jpg" alt="" width="700" height="467" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;BoxLang 1.16.0 is here, closing &lt;strong&gt;50 issues&lt;/strong&gt; across new features, improvements, and bug fixes. The theme running through this release is control: control over how HTTP clients are created and reused, control over what happens when a request fails, control over how much data a response is allowed to buffer, control over when Java classpaths reload, and tighter alignment with CFML behavior in the edge cases when doing migrations.&lt;/p&gt;</description></item><item><title>Offline Crypto Address Validation in Java</title><link>https://foojay.io/today/offline-crypto-address-validation-in-java/</link><pubDate>Sat, 22 Aug 2026 08:43:04 +0000</pubDate><guid>https://foojay.io/today/offline-crypto-address-validation-in-java/</guid><description>&lt;p&gt;Backend validation often starts with simple questions.&lt;/p&gt;&#10;&lt;p&gt;Is the input empty? Does it have the expected shape? Can it be parsed? Does it belong to the selected domain?&lt;/p&gt;&#10;&lt;p&gt;Crypto wallet addresses are no different, except the formats vary across chains and simple regular expressions are rarely enough.&lt;/p&gt;&#10;&lt;p&gt;If a Java backend accepts crypto withdrawal addresses, address-book entries, CSV imports, support-tool input, or transaction preflight requests, it should reject clearly invalid addresses before calling RPC nodes, explorers, exchange APIs, or internal money-movement systems.&lt;/p&gt;</description></item><item><title>New Between-Quarters Security Updates for Java: What CSPUs Mean for Your Release Pipeline</title><link>https://foojay.io/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://foojay.io/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;&#10;&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://foojay.io/today/azul-zulu-july-2026-quarterly-update-released/</link><pubDate>Thu, 23 Jul 2026 12:35:26 +0000</pubDate><guid>https://foojay.io/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;&#10;&lt;h2 id="the-quarterly-update-cycle"&gt;The Quarterly Update Cycle&lt;/h2&gt;&#10;&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://foojay.io/today/virtual-thread-pinning-field-guide/</link><pubDate>Thu, 16 Jul 2026 07:43:16 +0000</pubDate><guid>https://foojay.io/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://foojay.io/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://foojay.io/today/boxlang-1-15-0-released-blazing-fast-strings-runtime-portability-and-much-more/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/boxlang-1-15-0-released-blazing-fast-strings-runtime-portability-and-much-more/boxlang-v1.15.0-700x467.jpg" alt="" width="700" height="467" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&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;&#10;&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://foojay.io/today/endive-1-0-wasm/</link><pubDate>Mon, 29 Jun 2026 00:11:00 +0000</pubDate><guid>https://foojay.io/today/endive-1-0-wasm/</guid><description>&lt;p&gt;A few weeks ago, we wrote about &lt;a href="https://foojay.io/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;&#10;&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;&#10;&lt;h2 id="what-shipped"&gt;What Shipped&lt;/h2&gt;&#10;&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://foojay.io/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://foojay.io/today/boxlang-1-14-0-boxset-is-here-boxlangs-new-first-class-set-type/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/boxlang-1-14-0-boxset-is-here-boxlangs-new-first-class-set-type/BoxLang-release-1.14.0-1-700x394.jpg" alt="" width="700" height="394" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&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;&#10;&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://foojay.io/today/boxlang-1-14-0-introducing-inner-classes/</link><pubDate>Thu, 11 Jun 2026 10:29:32 +0000</pubDate><guid>https://foojay.io/today/boxlang-1-14-0-introducing-inner-classes/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/boxlang-1-14-0-introducing-inner-classes/BoxLang-release-1.14.0-700x394.jpg" alt="" width="700" height="394" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&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://foojay.io/today/your-tls-stack-is-lying-about-zero-copy/</link><pubDate>Wed, 10 Jun 2026 12:00:28 +0000</pubDate><guid>https://foojay.io/today/your-tls-stack-is-lying-about-zero-copy/</guid><description>&lt;h2 id="the-no-waste-compute-constraint"&gt;The &amp;ldquo;No Waste Compute&amp;rdquo; Constraint&lt;/h2&gt;&#10;&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;&#10;&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://foojay.io/today/foojay-podcast-95/</link><pubDate>Mon, 11 May 2026 09:57:00 +0000</pubDate><guid>https://foojay.io/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;&#10;&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 — 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://foojay.io/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://foojay.io/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;&#10;&lt;ul&gt;&#10;&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;&#10;&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;&#10;&lt;/ul&gt;&#10;&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.&#10;&lt;img src="https://foojay.io/today/using-the-azul-zulu-docker-official-images-from-simple-pull-to-lean-container/azul-docker-official-1024x576.avif" alt="" loading="lazy" decoding="async"&gt;&lt;/p&gt;</description></item><item><title>UCanAccess: The Modern Pure-Java Bridge to Microsoft Access</title><link>https://foojay.io/today/ucanaccess-java-ms-access-jdbc-guide/</link><pubDate>Wed, 06 May 2026 08:44:00 +0000</pubDate><guid>https://foojay.io/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;&#10;&lt;figure class="aligncenter size-full is-resized"&gt;&#10; &lt;img src="https://foojay.io/today/ucanaccess-java-ms-access-jdbc-guide/ucanaccess-logo.svg" alt="UCanAccess Logo" style="width:320px" loading="lazy" class="is-zoomable"&gt;&lt;/figure&gt;&#10;&#10;&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 — 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://foojay.io/today/foojay-podcast-94/</link><pubDate>Mon, 04 May 2026 06:26:00 +0000</pubDate><guid>https://foojay.io/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;&#10;&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://foojay.io/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://foojay.io/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;&#10;&lt;ul&gt;&#10;&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;&#10;&lt;/ul&gt;&#10;&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;&#10;&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://foojay.io/today/java-for-scripting/</link><pubDate>Mon, 23 Mar 2026 10:00:19 +0000</pubDate><guid>https://foojay.io/today/java-for-scripting/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/java-for-scripting/java-script-cover-700x467.jpg" alt="" width="700" height="467" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;h2 id="the-scripting-dilemma"&gt;The Scripting Dilemma&lt;/h2&gt;&#10;&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;&#10;&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;&#10;&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://foojay.io/today/java-native-memory-allocation-ffm-api/</link><pubDate>Fri, 20 Mar 2026 10:20:04 +0000</pubDate><guid>https://foojay.io/today/java-native-memory-allocation-ffm-api/</guid><description>&lt;h2 id="what-is-the-memory-api"&gt;What is the Memory API&lt;/h2&gt;&#10;&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://foojay.io/today/foojay-podcast-92/</link><pubDate>Mon, 16 Mar 2026 06:58:00 +0000</pubDate><guid>https://foojay.io/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;&#10;&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://foojay.io/today/java-benchmarks-on-single-board-computers/</link><pubDate>Wed, 04 Mar 2026 06:52:00 +0000</pubDate><guid>https://foojay.io/today/java-benchmarks-on-single-board-computers/</guid><description>&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;&#10;&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;&#10;&#9;&#9;&#9;&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;&#10;&#9;&#9;&lt;/div&gt;&#10;&#10;&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://foojay.io/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://foojay.io/today/gotta-code-em-all-how-java-evolved-beyond-verbosity-celebrating-30-years-of-pokemon/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/gotta-code-em-all-how-java-evolved-beyond-verbosity-celebrating-30-years-of-pokemon/pokemon01-1024x640.jpg" alt="" width="1024" height="640" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;Happy 30th Anniversary to &lt;strong&gt;Pokémon&lt;/strong&gt;! 🎉&lt;/p&gt;&#10;&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;&#10;&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>JVM timing options</title><link>https://foojay.io/today/jvm-timing-options/</link><pubDate>Mon, 23 Feb 2026 16:45:39 +0000</pubDate><guid>https://foojay.io/today/jvm-timing-options/</guid><description>&lt;p&gt;For as long as I have been coding in Java, we have had requirements to measure the execution time of blocks of code. While the current good practice is to use OpenTelemetry&amp;rsquo;s traces, not every company has reached this stage yet. Plus, some of the alternatives are OpenTelemetry-compatible. Let&amp;rsquo;s see them in order.&lt;/p&gt;&#10;&lt;h2 id="the-basic-option"&gt;The basic option&lt;/h2&gt;&#10;&lt;p&gt;The basic option is what we have been doing for ages, and what the other options rely on anyway. It&amp;rsquo;s based on the following API: &lt;a href="https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#currentTimeMillis" target="_blank" rel="noopener noreferrer"&gt;System.currentTimeMillis()&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>A Visual Diff of Java’s Evolution: Inside java.evolved</title><link>https://foojay.io/today/a-visual-diff-of-javas-evolution-inside-java-evolved/</link><pubDate>Fri, 20 Feb 2026 17:48:21 +0000</pubDate><guid>https://foojay.io/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;&#10;&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.&#10;&lt;img src="https://foojay.io/today/a-visual-diff-of-javas-evolution-inside-java-evolved/Screenshot-2026-02-20-at-6.28.07-AM-700x446.png" alt="" width="700" height="446" loading="lazy" decoding="async"&gt;&lt;/p&gt;</description></item></channel></rss>