<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Performance on foojay.io - Friends Of OpenJDK</title><link>https://foojay.io/today/category/performance/</link><description>Recent content in Performance on foojay.io - Friends Of OpenJDK</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 08 Sep 2026 08:38:34 +0000</lastBuildDate><atom:link href="https://foojay.io/today/category/performance/index.xml" rel="self" type="application/rss+xml"/><item><title>From OpenTelemetry to DuckDB</title><link>https://foojay.io/today/from-opentelemetry-to-duckdb/</link><pubDate>Tue, 08 Sep 2026 08:29:37 +0000</pubDate><guid>https://foojay.io/today/from-opentelemetry-to-duckdb/</guid><description>&lt;p&gt;Observability platforms generally expect you to do your analysis inside them, using their query language and their dashboards. That works for the questions you already know you have. It works less well for the ad-hoc ones: &lt;em&gt;&lt;strong&gt;a quick percentile&lt;/strong&gt;&lt;/em&gt; , &lt;em&gt;&lt;strong&gt;a pivot by status code&lt;/strong&gt;&lt;/em&gt; , or &amp;ldquo;&lt;em&gt;&lt;strong&gt;which service is actually eating the latency budget?&lt;/strong&gt;&lt;/em&gt;&amp;rdquo; once the data is in front of you.&lt;/p&gt;&#10;&lt;p&gt;This article describes a small pipeline for that kind of question. On one side is &lt;a href="https://duckdb.org" target="_blank" rel="noopener noreferrer"&gt;DuckDB&lt;/a&gt;, the in-process analytical database that reads CSV, JSON and Parquet directly. On the other is the &lt;a href="https://github.com/dash0hq/dash0-cli" target="_blank" rel="noopener noreferrer"&gt;Dash0 CLI&lt;/a&gt;, which pulls OpenTelemetry spans, logs, metrics and traces out of &lt;a href="https://www.dash0.com" target="_blank" rel="noopener noreferrer"&gt;Dash0&lt;/a&gt; and prints them as CSV or JSON.&lt;/p&gt;</description></item><item><title>Jakarta Faces, Java Web Framework, Stateless Edition: Marketplace AliFaces</title><link>https://foojay.io/today/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/</link><pubDate>Sat, 29 Aug 2026 19:22:52 +0000</pubDate><guid>https://foojay.io/today/jakarta-faces-java-web-framework-stateless-edition-marketplace-alifaces/</guid><description>&lt;h3 id="a-fully-stateless-jakarta-faces-marketplace-with-server-side-rendering--no-httpsession-no-saved-viewstate-no-sticky-sessions"&gt;A Fully Stateless Jakarta Faces Marketplace with Server-Side Rendering — No HttpSession, No Saved ViewState, No Sticky Sessions&lt;/h3&gt;&#10;&lt;p&gt;(see the poc on: &lt;a href="http://129.152.31.253:8080/alifaces" title="AliFaces POC Run On Oracle OCI" target="_blank" rel="noopener noreferrer"&gt;AliFaces POC Run On Oracle OCI(Nanos Unikernel)&lt;/a&gt;)&lt;/p&gt;&#10;&lt;p&gt;Jakarta Faces still carries a few persistent assumptions: it is stateful, it requires &lt;code&gt;HttpSession&lt;/code&gt;, it needs sticky sessions to scale horizontally, and its server-side rendering model belongs to an older generation of web applications.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;AliFaces&lt;/strong&gt; challenges those assumptions with running code — not a Hello World, but a marketplace-style application with catalog, search, filters, cart, checkout, orders, browsing history, themes, responsive layouts and a JSON API for mobile clients.&lt;/p&gt;</description></item><item><title>Running DuckDB's JDBC Driver in a GraalVM Native Image</title><link>https://foojay.io/today/running-duckdbs-jdbc-driver-in-a-graalvm-native-image/</link><pubDate>Sat, 29 Aug 2026 16:22:10 +0000</pubDate><guid>https://foojay.io/today/running-duckdbs-jdbc-driver-in-a-graalvm-native-image/</guid><description>&lt;p&gt;&lt;a href="https://duckdb.org/" target="_blank" rel="noopener noreferrer"&gt;DuckDB&lt;/a&gt; is an in-process analytical database. You add one JAR to a Java project and get a SQL engine that reads CSV, Parquet, and JSON files directly, with no server to run.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://www.graalvm.org/jdk25/reference-manual/native-image/" target="_blank" rel="noopener noreferrer"&gt;GraalVM Native Image&lt;/a&gt; compiles a Java program ahead of time into a standalone executable that starts in milliseconds and needs no JVM on the target machine.&lt;/p&gt;&#10;&lt;p&gt;Combining the two produces a data tool that is distributed as a single binary, like a Go or Rust program, while using Java libraries.&lt;/p&gt;</description></item><item><title>DuckDB in Spring Batch: Replace In-Memory Java Loops with One SQL Statement</title><link>https://foojay.io/today/duckdb-in-spring-batch-replace-in-memory-java-loops-with-one-sql-statement/</link><pubDate>Tue, 11 Aug 2026 13:34:43 +0000</pubDate><guid>https://foojay.io/today/duckdb-in-spring-batch-replace-in-memory-java-loops-with-one-sql-statement/</guid><description>&lt;p&gt;Spring Batch jobs usually follow the same pattern: an &lt;code&gt;ItemReader&lt;/code&gt; streams rows, an &lt;code&gt;ItemProcessor&lt;/code&gt; transforms each one, and an &lt;code&gt;ItemWriter&lt;/code&gt; writes them out, chunk by chunk. A chunk-oriented step wires those three pieces together:&lt;/p&gt;&#10;&lt;pre class="EnlighterJSRAW" data-enlighter-language="generic"&gt;new StepBuilder(&amp;#34;transform&amp;#34;, jobRepository)&#10; .&amp;lt;Order, Summary&amp;gt;chunk(1_000, transactionManager)&#10; .reader(reader) // stream rows&#10; .processor(processor) // transform each row&#10; .writer(writer) // write the chunk&#10; .build();&lt;/pre&gt;&lt;p&gt;&lt;em&gt;The chunk-oriented processing model (&lt;a href="https://docs.spring.io/spring-batch/reference/step/chunk-oriented-processing.html" target="_blank" rel="noopener noreferrer"&gt;Spring Batch reference&lt;/a&gt;).&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;That pattern works well for moving records between systems.&lt;/p&gt;</description></item><item><title>Embedding DuckDB in a Maven App (and Using It for Things That Aren't Databases)</title><link>https://foojay.io/today/embedding-duckdb-in-a-maven-app-and-using-it-for-things-that-arent-databases/</link><pubDate>Thu, 06 Aug 2026 08:46:28 +0000</pubDate><guid>https://foojay.io/today/embedding-duckdb-in-a-maven-app-and-using-it-for-things-that-arent-databases/</guid><description>&lt;p&gt;&lt;a href="https://duckdb.org/" target="_blank" rel="noopener noreferrer"&gt;DuckDB&lt;/a&gt; is described as &amp;ldquo;SQLite for analytics,&amp;rdquo; which is true: it&amp;rsquo;s an in-process database engine that runs inside your application, with no server to install or manage. What&amp;rsquo;s less obvious from that description is that &lt;strong&gt;you can get value out of it without ever creating a database at all&lt;/strong&gt;. Because it can query CSV, JSON, and Parquet files directly — local or over HTTP — it works perfectly well as an embedded data-crunching library that happens to speak SQL.&lt;/p&gt;</description></item><item><title>Idempotent Spring Boot: Safe REST with One Annotation</title><link>https://foojay.io/today/idempotent-spring-boot-starter/</link><pubDate>Tue, 04 Aug 2026 22:11:22 +0000</pubDate><guid>https://foojay.io/today/idempotent-spring-boot-starter/</guid><description>&lt;h2 id="idempotent-rest-endpoints-without-the-boilerplate"&gt;Idempotent REST Endpoints Without the Boilerplate&lt;/h2&gt;&#10;&lt;h2 id="stop-charging-your-users-twice-idempotent-rest-endpoints-with-one-annotation"&gt;Stop Charging Your Users Twice: Idempotent REST Endpoints with One Annotation&lt;/h2&gt;&#10;&lt;h2 id="the-problem-nobody-talks-about-until-production"&gt;The problem nobody talks about until production&lt;/h2&gt;&#10;&lt;p&gt;A user taps &amp;ldquo;Pay.&amp;rdquo; The request times out. Their app retries. Your server charges them twice.&lt;/p&gt;&#10;&lt;p&gt;You didn&amp;rsquo;t write a bug. The network did. But your users don&amp;rsquo;t care about that distinction.&lt;/p&gt;&#10;&lt;p&gt;The idempotency problem shows up in more places than payments. A load balancer replays a timed-out request. A mobile client double-taps a submit button. A Kubernetes pod retries after a restart. From the server&amp;rsquo;s perspective, all of these look identical: a second POST that arrives after the first one already executed.&lt;/p&gt;</description></item><item><title>Toward a Durable Spring PetClinic</title><link>https://foojay.io/today/toward-a-durable-spring-petclinic/</link><pubDate>Sun, 19 Jul 2026 18:06:06 +0000</pubDate><guid>https://foojay.io/today/toward-a-durable-spring-petclinic/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Durable Execution&lt;/strong&gt; is a way of running code so that its progress survives failure. A normal program keeps its state in memory: if the process crashes, the machine reboots, or a network call times out halfway through a multi-step operation, that state is gone and the work is left half-done.&lt;/p&gt;&#10;&lt;p&gt;Temporal, the Durable Execution platform, persists every step of a process to its &lt;strong&gt;Event History&lt;/strong&gt; — a durable, append-only log of Events — so that after any failure the work resumes exactly where it left off, as if the crash never happened.&lt;/p&gt;</description></item><item><title>BoxLang 1.15.0 Released: Blazing Fast Strings, Runtime Portability, and much more</title><link>https://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>Temporal Is to Your Code What a Database Is to Your Data</title><link>https://foojay.io/today/temporal-is-to-your-code-what-a-database-is-to-your-data/</link><pubDate>Sat, 11 Jul 2026 10:31:54 +0000</pubDate><guid>https://foojay.io/today/temporal-is-to-your-code-what-a-database-is-to-your-data/</guid><description>&lt;p&gt;&lt;strong&gt;Once upon a time, applications managed their own data files. Every program hand-rolled its own locking, its own crash recovery, its own consistency guarantees. Every program did it badly, in its own unique way.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Then the relational database arrived and made a deal with application developers: &lt;em&gt;&lt;strong&gt;you declare what you want, and I guarantee it survives&lt;/strong&gt;.&lt;/em&gt; Atomicity, durability, crash recovery: all of it moved out of application code and into a dedicated platform. Nobody writes their own file-based transaction log anymore.&lt;/p&gt;</description></item><item><title>"This Can't Possibly Work": What I Learned at a Temporal.io Workshop</title><link>https://foojay.io/today/this-cant-possibly-work-what-i-learned-at-a-temporal-io-workshop-on-durable-execution/</link><pubDate>Fri, 10 Jul 2026 08:41:22 +0000</pubDate><guid>https://foojay.io/today/this-cant-possibly-work-what-i-learned-at-a-temporal-io-workshop-on-durable-execution/</guid><description>&lt;p&gt;&lt;strong&gt;When developers first hear about &lt;a href="https://temporal.io/" target="_blank" rel="noopener noreferrer"&gt;Temporal&lt;/a&gt;, they tend to move through a predictable sequence of emotions. First comes disbelief — the claim that your application can crash mid-execution and simply pick up where it left off, variables intact, sounds like nonsense. Then comes irritation that anyone would even say such a thing is possible. Then they try it, discover it actually works, and get very excited. And finally they ask the only question that matters: &lt;em&gt;how?&lt;/em&gt;&lt;/strong&gt;&#10;&lt;img src="https://foojay.io/today/this-cant-possibly-work-what-i-learned-at-a-temporal-io-workshop-on-durable-execution/IMG_2977-1024x768.jpeg" alt="" width="1024" height="768" loading="lazy" decoding="async"&gt;&lt;/p&gt;</description></item><item><title>Nulling Out References Won't Help Your Garbage Collector</title><link>https://foojay.io/today/nulling-out-references-wont-help-your-garbage-collector/</link><pubDate>Thu, 09 Jul 2026 13:49:39 +0000</pubDate><guid>https://foojay.io/today/nulling-out-references-wont-help-your-garbage-collector/</guid><description>&lt;p&gt;One of the misconceptions that I continuously run into is that nulling out references in Java helps garbage collection.&lt;/p&gt;&#10;&lt;p&gt;This attitude is particularly prevalent from those developers used to C/C++ where &lt;code&gt;delete ptr&lt;/code&gt; becomes &lt;code&gt;ref = null&lt;/code&gt;. To be fair, it&amp;rsquo;s a reasonable thing to believe.&lt;/p&gt;&#10;&lt;p&gt;It&amp;rsquo;s also wrong, and the way it&amp;rsquo;s wrong tells you most of what&amp;rsquo;s worth knowing about how a tracing collector actually works.&lt;/p&gt;&#10;&lt;p&gt;That is, the vast majority of data allocated in a tracing garbage collected runtime becomes collectable as soon as a variable falls out of scope.&lt;/p&gt;</description></item><item><title>Jurassic JDK: Migrate or Extinct</title><link>https://foojay.io/today/jurassic-jdk-migrate-or-extinct/</link><pubDate>Fri, 26 Jun 2026 07:28:00 +0000</pubDate><guid>https://foojay.io/today/jurassic-jdk-migrate-or-extinct/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/jurassic-jdk-migrate-or-extinct/1_wul-KqE6vXk4ynnh_IljSQ-1-1024x562.webp" alt="" width="1024" height="562" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;65 million years ago, dinosaurs didn&amp;rsquo;t adapt. They&amp;rsquo;re gone. Your JDK 7 app is giving the same energy. 🫠&lt;/p&gt;&#10;&lt;p&gt;I spent a year and a half migrating more than 15 projects in production. Full time. Real teams, real deadlines, real 2am breakage. This is everything I wish someone had written before I started.&lt;/p&gt;&#10;&lt;h2 id="why-are-we-still-here-"&gt;Why Are We Still Here? 👀&lt;/h2&gt;&#10;&lt;p&gt;Walk into any company with a codebase older than 5 years and you&amp;rsquo;ll hear the same thing:&lt;/p&gt;</description></item><item><title>Quarkus Unpacked: Insights from the Foojay Podcast</title><link>https://foojay.io/today/quarkus-unpacked-insights-from-the-foojay-podcast/</link><pubDate>Tue, 23 Jun 2026 12:36:54 +0000</pubDate><guid>https://foojay.io/today/quarkus-unpacked-insights-from-the-foojay-podcast/</guid><description>&lt;figure class="alignleft is-resized"&gt;&#10; &lt;img src="https://foojay.io/today/quarkus-unpacked-insights-from-the-foojay-podcast/3-Quarkus-Unpacked-2-2.jpeg" alt="Quarkus: A Runtime and Framework for Cloud-Native Java" style="width:300px" loading="lazy" class="is-zoomable"&gt;&lt;/figure&gt;&#10;&#10;&lt;p&gt;I recently had the pleasure of joining the &lt;a href="https://www.youtube.com/watch?v=_nJCTTrnZkE" target="_blank" rel="noopener noreferrer"&gt;Foojay podcast&lt;/a&gt; to talk about Quarkus in depth. The conversation covered a lot of ground, from what makes Quarkus different to the practical trade-offs between JVM and native mode. This post captures the key questions and answers from that discussion, lightly edited for readability.&lt;/p&gt;&#10;&lt;p&gt;If you have been following this blog series, note that the third installment on building your own stack with Quarkus is coming next. Consider this a bonus entry that distills the podcast conversation into a format you can read, reference, and share.&lt;/p&gt;</description></item><item><title>Your TLS Stack Is Lying to You About Zero-Copy</title><link>https://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>BoxLang v1.13.0: Compatibility, Concurrency, and Formatter Maturity</title><link>https://foojay.io/today/boxlang-v1-13-0-compatibility-concurrency-and-formatter-maturity/</link><pubDate>Tue, 19 May 2026 12:11:19 +0000</pubDate><guid>https://foojay.io/today/boxlang-v1-13-0-compatibility-concurrency-and-formatter-maturity/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/boxlang-v1-13-0-compatibility-concurrency-and-formatter-maturity/boxlang-v1.13.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.13.0&lt;/strong&gt; is a stability-first release with deep compatibility work and runtime hardening. This build closes 48 issues, with the majority focused on CFML compatibility edge cases, concurrency correctness, formatting parity, and miniserver/runtime reliability under real production loads.&lt;/p&gt;&#10;&lt;p&gt;While this release is bug-fix heavy, it still introduces several meaningful features and quality-of-life improvements: character-aware trimming, class metadata lookup by absolute path, process environment control in SystemExecute(), SOAP headers, new query column rename capabilities, and safer miniserver routing/security defaults.&lt;/p&gt;</description></item><item><title>AWS Nitro and CPU Graviton Meets Unikernels</title><link>https://foojay.io/today/aws-nitro-and-cpu-graviton-meets-unikernels/</link><pubDate>Fri, 10 Apr 2026 16:26:25 +0000</pubDate><guid>https://foojay.io/today/aws-nitro-and-cpu-graviton-meets-unikernels/</guid><description>&lt;h2 id="aws-nitro-and-cpu-graviton-meets-unikernels-java-and-quarkus-on-arm64-aws-graviton-with-nanos-unikernel"&gt;AWS Nitro and CPU Graviton Meets Unikernels: Java and Quarkus on ARM64 AWS Graviton with Nanos Unikernel&lt;/h2&gt;&#10;&lt;p&gt;&lt;img src="https://foojay.io/today/aws-nitro-and-cpu-graviton-meets-unikernels/2c957ea8-2c6b-4caa-86f8-5adeb9e8bedc-619d4e1c.jpg" alt="image" width="1536" height="1024" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;h2 id="java-and-jakarta-ee-truly-meet-unikernels"&gt;Java and Jakarta EE Truly Meet Unikernels&lt;/h2&gt;&#10;&lt;p&gt;The key message of this article is simple and strong:&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;any Java or Jakarta EE application is already ready&lt;/strong&gt; to benefit from the advantages of unikernels.&lt;/p&gt;&#10;&lt;p&gt;Java and Jakarta EE, including modern frameworks such as Quarkus, can immediately take advantage of the unikernel model &lt;strong&gt;without waiting for new languages, new runtimes, or radical rewrites&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Thread Safe Native Memory in Java</title><link>https://foojay.io/today/java-native-memory-access-modes/</link><pubDate>Tue, 07 Apr 2026 10:00:43 +0000</pubDate><guid>https://foojay.io/today/java-native-memory-access-modes/</guid><description>&lt;h2 id="what-is-memory-order-and-why-does-it-matter-for-native-memory"&gt;What is Memory Order and Why Does It Matter for Native Memory?&lt;/h2&gt;&#10;&lt;p&gt;The Foreign Function and Memory (FFM) API is Java&amp;rsquo;s way of interacting with native code and memory. In the previous post, you learned how to do so using Java&amp;rsquo;s built-in &lt;code&gt;Arena&lt;/code&gt; types. The Arena provides temporal safety and bounds checks, but what about thread safety? MemorySegments created by &lt;code&gt;.ofShared()&lt;/code&gt;, &lt;code&gt;.auto()&lt;/code&gt;, and &lt;code&gt;.global()&lt;/code&gt; can be used by multiple threads at the same time. Using a VarHandle with just get/set can backfire if you don&amp;rsquo;t use something like locking. The downside is that locks are slow and heavy. So let us take a look at a more granular, hardware-aware approach: using VarHandle access modes.&lt;/p&gt;</description></item><item><title>TestBox 7: Real-Time Feedback, a Browser-Based IDE, and Modern Testing Workflows on the JVM</title><link>https://foojay.io/today/testbox-7-real-time-feedback-a-browser-based-ide-and-modern-testing-workflows-on-the-jvm/</link><pubDate>Tue, 24 Mar 2026 16:58:53 +0000</pubDate><guid>https://foojay.io/today/testbox-7-real-time-feedback-a-browser-based-ide-and-modern-testing-workflows-on-the-jvm/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/testbox-7-real-time-feedback-a-browser-based-ide-and-modern-testing-workflows-on-the-jvm/testbox-7-1-700x467.jpg" alt="" width="700" height="467" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;TestBox 7.x focuses on improving testing workflows for BoxLang and CFML applications. This release introduces improvements to the &lt;strong&gt;BoxLang CLI runner&lt;/strong&gt; , real-time &lt;strong&gt;streaming test execution via SSE&lt;/strong&gt; , &lt;strong&gt;dry run&lt;/strong&gt; capabilities, a browser-based &lt;strong&gt;TestBox RUN&lt;/strong&gt; interface, and several developer experience enhancements.&lt;/p&gt;&#10;&lt;p&gt;Check out the what&amp;rsquo;s new here: &lt;a href="https://testbox.ortusbooks.com/readme/release-history/whats-new-with-7.0.0" target="_blank" rel="noopener noreferrer"&gt;https://testbox.ortusbooks.com/readme/release-history/whats-new-with-7.0.0&lt;/a&gt;&lt;/p&gt;&#10;&lt;h4 id="testbox-run-a-browser-ide-for-your-tests"&gt;TestBox RUN: A Browser IDE for Your Tests&lt;/h4&gt;&#10;&lt;p&gt;&lt;img src="https://foojay.io/today/testbox-7-real-time-feedback-a-browser-based-ide-and-modern-testing-workflows-on-the-jvm/image-700x155.png" alt="" width="700" height="155" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;The centerpiece of TestBox 7 is &lt;strong&gt;TestBox RUN&lt;/strong&gt; : a self-hosted, single-page web app (&lt;code&gt;bx/tests/index.bxm&lt;/code&gt;) that you drop into any &lt;strong&gt;BoxLang&lt;/strong&gt; project and open in a browser. No build toolchain. No external service. Just BoxLang.&lt;/p&gt;</description></item><item><title>Native Memory in Java: Arenas, Malloc, and Pools</title><link>https://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>How is Leyden improving Java Performance? Part 3 of 3</title><link>https://foojay.io/today/how-is-leyden-improving-java-performance-part-3-of-3/</link><pubDate>Thu, 19 Mar 2026 12:10:22 +0000</pubDate><guid>https://foojay.io/today/how-is-leyden-improving-java-performance-part-3-of-3/</guid><description>&lt;p&gt;In part 1 of this series of 3 blog posts we introduced the specific performance challenges OpenJDK faces lowering application &amp;lsquo;startup&amp;rsquo;, &amp;lsquo;warmup&amp;rsquo; and &amp;lsquo;initial footprint&amp;rsquo; costs and provided an overview of what Leyden is doing to address those challenges.&lt;/p&gt;&#10;&lt;p&gt;Part 2 described how to use the new capabilities offered by Leyden and presented test results which show that very significant progress has already been made and is set to continue.&lt;/p&gt;</description></item><item><title>How is Leyden improving Java Performance? Part 2 of</title><link>https://foojay.io/today/how-is-leyden-improving-java-performance-part-2-of-3/</link><pubDate>Wed, 18 Mar 2026 12:05:34 +0000</pubDate><guid>https://foojay.io/today/how-is-leyden-improving-java-performance-part-2-of-3/</guid><description>&lt;p&gt;In part 1 of this series of 3 blog posts we introduced the specific performance challenges OpenJDK faces lowering application &amp;lsquo;startup&amp;rsquo;, &amp;lsquo;warmup&amp;rsquo; and &amp;lsquo;initial footprint&amp;rsquo; costs and provided an overview of what Leyden is doing to address those challenges.&lt;/p&gt;&#10;&lt;p&gt;Part 2 describes how to use the new AOT capabilities offered by Leyden and presents test results which show that very significant progress has already been made and is set to continue.&lt;/p&gt;</description></item><item><title>How is Leyden improving Java Performance? Part 1 of 3</title><link>https://foojay.io/today/how-is-leyden-improving-java-performance-part-1-of-3/</link><pubDate>Tue, 17 Mar 2026 12:00:45 +0000</pubDate><guid>https://foojay.io/today/how-is-leyden-improving-java-performance-part-1-of-3/</guid><description>&lt;p&gt;In this series of 3 blog posts we will explain how OpenJDK project Leyden is helping to improve a specific area of performance where Java has notably lagged behind other languages i.e. application &amp;lsquo;startup&amp;rsquo;, &amp;lsquo;warmup&amp;rsquo;, and &amp;lsquo;initial footprint&amp;rsquo;.&lt;/p&gt;&#10;&lt;p&gt;Part 1 explains what those terms mean and why Java faces challenges in matching the behaviour of other languages. It then provides an overview of what Leyden has done to improve startup and warmup in existing JDK releases and what is planned for upcoming releases.&lt;/p&gt;</description></item><item><title>BoxLang 1.11.0 Release</title><link>https://foojay.io/today/boxlang-1-11-0-release/</link><pubDate>Tue, 17 Mar 2026 09:40:04 +0000</pubDate><guid>https://foojay.io/today/boxlang-1-11-0-release/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/boxlang-1-11-0-release/boxlang-v1.11.0-700x467.jpg" alt="" width="700" height="467" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;We&amp;rsquo;re proud to announce &lt;strong&gt;BoxLang 1.11.0&lt;/strong&gt;, a highly focused performance and stability release that delivers measurable speed improvements across every BoxLang application, with zero code changes required. The team invested deeply in bytecode generation, class loading, lock management, and type casting to produce one of the most impactful runtime optimization releases to date. Alongside the performance wave, this release resolves critical concurrency bugs, hardens DateTime handling, and ships powerful new developer tooling.&lt;/p&gt;</description></item><item><title>I Benchmarked Java on Single-Board Computers: Orange Pi 5 Ultra and Raspberry Pi 5 Lead the Pack</title><link>https://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>JC-AI Newsletter #14</title><link>https://foojay.io/today/jc-ai-newsletter-14/</link><pubDate>Tue, 03 Mar 2026 15:11:53 +0000</pubDate><guid>https://foojay.io/today/jc-ai-newsletter-14/</guid><description>&lt;p&gt;&lt;strong&gt;Two&lt;/strong&gt; weeks have passed and a lot have been happening on the field of artificial-intelligence.&lt;/p&gt;&#10;&lt;p&gt;Two weeks have passed and a lot has been silently yet visibly happening in the field of artificial intelligence. This newsletter brings interesting developments, including Dario Amodei&amp;rsquo;s (Anthropic) view on the progress achieved in the LLM field and his response to the utilization of these models for specific kinds of military purposes, as well as OpenAI&amp;rsquo;s response to it. Aside from the fact that development may follow more sigmoids instead of exponential progress, it is important to have awareness of utilization across branches. Does prompting and clarifying the goal influence agent responses, and if so, how? How far are we from reliable robotics applications? How much bias is introduced when clinical data is being analyzed?&lt;/p&gt;</description></item><item><title>Runtime Code Analysis in the Age of Vibe Coding</title><link>https://foojay.io/today/runtime-code-analysis-in-the-age-of-vibe-coding/</link><pubDate>Tue, 17 Feb 2026 14:00:00 +0000</pubDate><guid>https://foojay.io/today/runtime-code-analysis-in-the-age-of-vibe-coding/</guid><description>&lt;p&gt;In the era of &lt;strong&gt;vibe coding&lt;/strong&gt;—where large amounts of code are introduced or refactored in short bursts, often with the help of LLMs—you need immediate feedback on how new logic actually executes. Not comprehensive analysis. Not nanosecond-precise timing. Just a quick confirmation that your loops aren&amp;rsquo;t spinning 10,000x more than they should.&lt;/p&gt;&#10;&lt;p&gt;However, traditional profilers can feel like overkill for quick validation. In addition, they present results at method/stack granularity and require context-switching to interpret. They also introduce overhead, ranging from negligible (e.g., JFR/sampling) to noticeable (call tracing/instrumentation). As a result, they are less convenient as always-on feedback during rapid iteration.&lt;/p&gt;</description></item><item><title>Unikernel: Profiling and Troubleshooting JVM on Nanos Unikernel</title><link>https://foojay.io/today/unikernel-profiling-and-troubleshooting-jvm-on-nanos-unikernel/</link><pubDate>Wed, 11 Feb 2026 13:50:41 +0000</pubDate><guid>https://foojay.io/today/unikernel-profiling-and-troubleshooting-jvm-on-nanos-unikernel/</guid><description>&lt;h3 id="profiling-a-java-application-running-inside-an-unikernel-with-jprofiler"&gt;Profiling a Java Application Running Inside an Unikernel with JProfiler&lt;/h3&gt;&#10;&lt;p&gt;Unikernels are often associated with minimalism and tight resource control.&lt;/p&gt;&#10;&lt;p&gt;But can we profile a Java application running inside a unikernel using a standard JVM profiler?&lt;/p&gt;&#10;&lt;p&gt;The answer is yes.&lt;/p&gt;&#10;&lt;p&gt;In this guide, we will walk step by step through profiling a Quarkus&lt;/p&gt;&#10;&lt;p&gt;application running inside a Nanos unikernel using &lt;strong&gt;JProfiler&lt;/strong&gt; and&lt;br&gt;&#10;&lt;strong&gt;IBM Semeru JRE 25 (OpenJ9)&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;No special hacks. Just standard JVM tooling.&lt;/p&gt;</description></item><item><title>Webinar: "Moving Applications From JDK 21 to JDK 25: What You Need to Know"</title><link>https://foojay.io/today/webinar-moving-applications-from-jdk-21-to-jdk-25-what-you-need-to-know/</link><pubDate>Mon, 26 Jan 2026 14:14:32 +0000</pubDate><guid>https://foojay.io/today/webinar-moving-applications-from-jdk-21-to-jdk-25-what-you-need-to-know/</guid><description>&lt;p&gt;JDK 25 has arrived as the latest long-term support (LTS) release for Java, bringing performance improvements and enhanced stability for modern applications. If your organization is running JDK 21, now is the time to start planning your migration path.&lt;/p&gt;&#10;&lt;h2 id="why-upgrade"&gt;Why Upgrade?&lt;/h2&gt;&#10;&lt;p&gt;Each new LTS release represents years of refinements, optimizations, and new capabilities. JDK 25 builds on the foundation of JDK 21 while delivering the reliability that enterprise applications demand. But understanding what&amp;rsquo;s changed—and what might break—is essential for a smooth transition.&lt;/p&gt;</description></item><item><title>Get high performance Java applications with IBM Semeru Runtimes</title><link>https://foojay.io/today/high-performance-java-semeru/</link><pubDate>Tue, 20 Jan 2026 13:53:00 +0000</pubDate><guid>https://foojay.io/today/high-performance-java-semeru/</guid><description>&lt;p&gt;Originally published at &lt;a href="https://developer.ibm.com/articles/j-java-performance/" title="developer.ibm.com" target="_blank" rel="noopener noreferrer"&gt;developer.ibm.com&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;By Vijay Sundaresan, Mark Stoodley, Marius Pirvu, Grace Robinson, Laura Cowen&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;Explore real‑world benchmarks, tuning options, and best‑practice strategies to optimize latency, throughput, and memory on modern hardware with Semeru Runtimes, an OpenJDK distribution.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;When running applications in the cloud, performance matters. An application that handles more requests with less CPU and memory is cheaper to run. Java and its associated frameworks are widely appreciated for stability, throughput performance, and portability but not typically recognized for starting quickly, ramping up quickly, or consuming resources frugally. These limitations can pose significant challenges, especially when migrating Java applications to the cloud or developing new cloud-native Java solutions where more resources immediately make deployments more expensive.&lt;/p&gt;</description></item><item><title>JC-AI Newsletter #12</title><link>https://foojay.io/today/jc-ai-newsletter-12/</link><pubDate>Wed, 14 Jan 2026 07:15:44 +0000</pubDate><guid>https://foojay.io/today/jc-ai-newsletter-12/</guid><description>&lt;p&gt;&lt;strong&gt;F&lt;/strong&gt; irst of all, &lt;strong&gt;Happy New Year 2026!&lt;/strong&gt; This year is designated in the Chinese Calendar as the Year of the Fire Horse (starting on February 17.). The year 2026 brings not only tremendous energy to AI development but also, in my humble opinion, many breakthroughs in the field.&lt;/p&gt;&#10;&lt;p&gt;Although there have been many small steps toward the field&amp;rsquo;s evolution, it often feels that development is stagnating, applying known or slightly tweaked strategies to non-deterministic problems while expecting deterministic results. This includes the often misleading benchmarking strategies (deterministic) performed on synthetic datasets.&lt;/p&gt;</description></item></channel></rss>