Sign in

Ingo Kegel

@ingokegel.bsky.social
85 followers 86 following 572 posts

Building JProfiler & install4j at ej-technologies. Java expert since the early days. Deep dives into profiling, performance, and build tools.

PostsRepliesMedia
Ingo Kegel @ingokegel.bsky.social · 15/10/2026
The SBT integration for install4j has been updated to support install4j 13. Thanks Jarek! github.com/jpsacha/sbt... It's great to get these valuable contributions from the community.
github.com
sbt-install4j v.1.6.0 · jpsacha sbt-install4j · Discussion #27
New: Support latest install4j v.13 (Issue #21) Changes: Requires sbt 1.9 or newer, for older sbt 1.x use version 1.5.0 Published through the Sonatype Central Portal, in Maven-compatible plugin layo...
000 0
Ingo Kegel @ingokegel.bsky.social · 13/10/2026
Check out jvmguard at github.com/jvmguard/jv... and give it a star if you find it interesting.
github.com
GitHub - jvmguard/jvmguard: Automatic production profiling for JVMs
Automatic production profiling for JVMs. Contribute to jvmguard/jvmguard development by creating an account on GitHub.
000 0
Ingo Kegel @ingokegel.bsky.social · 13/10/2026
On the flip side, jvmguard now emits OTel log records into your application's OTel pipeline when a capture is taken. These are potentially expensive operations, like taking a heap dump, so they are important events in an APM context.
100 0
Ingo Kegel @ingokegel.bsky.social · 13/10/2026
The jvmguard annotations are still the more powerful option. jvmguard annotations were designed for an automatic production profiler: composable "Part" naming with parameter getter chains, instance classes and abbreviated package names, plus control over inheritance and nesting.
100 0
Ingo Kegel @ingokegel.bsky.social · 13/10/2026
Annotations are matched by name, so this works even without an OTel agent. A preconfigured OTel transaction definition in the recording settings names transactions after the span name, and you can filter by span name or class, adjust the naming, or discard chatty annotations.
120 0
Ingo Kegel @ingokegel.bsky.social · 13/10/2026
jvmguard 0.3 is out with OpenTelemetry support. Methods annotated with "WithSpan" or "Observed" now automatically become transactions in jvmguard, and you can use them to trigger deep profiling captures (heap dumps, JFR snapshots, JProfiler snapshots) for anomalous situations.
100 0
Ingo Kegel @ingokegel.bsky.social · 22/09/2026
We regenerate the cache for each new application build in install4j. Dynamically loaded plugins should not feature heavily in the startup for most well-designed apps.
000 0
Ingo Kegel @ingokegel.bsky.social · 22/09/2026
Hey, I used your app as an example in my latest blog post: bsky.app/profile/ingo...
110 0
Ingo Kegel @ingokegel.bsky.social · 22/09/2026
The full blog post of the comparison with more juicy details is available at www.ej-technologies.com/blog/2026/0... You can try it out with install4j yourself at www.ej-technologies.com/install4j No registration required.
ej-technologies.com
HotSpot Strikes Back: Is JEP 544 The End Of The GraalVM Startup Monopoly?
Exciting times for the HotSpot JVM: was just proposed for Java 28. This promises to give the HotSpot AOT cache a startup performance that will rival GraalVM, without any of its hardships. But training the AOT cache is different from pre-compilation with GraalVM, so how do they really compare?JEP 544: Ahead-of-Time Code Compilation
120 0
Ingo Kegel @ingokegel.bsky.social · 22/09/2026
Caches are automatically regenerated after application updates and Java runtime changes and they are deleted when the application is uninstalled. And ending training programmatically is possible since Java 25.0.4 with the HotSpotAOTCacheMXBean.
100 0
Ingo Kegel @ingokegel.bsky.social · 22/09/2026
But how do we use this AOT cache in practice? It needs to be trained on the machine of the end-user with different VM parameters for training and cache use. Enter install4j: Its AOT cache feature in 13.1 does that automatically for you.
100 0
Ingo Kegel @ingokegel.bsky.social · 22/09/2026
For a workload that the GraalVM executable takes 50 ms to complete, the JVM now clocks in at 130 ms. For larger apps, where initial workloads become more important than just bringing up the JVM, the AOT Cache catches up GraalVM even more.
100 0
Ingo Kegel @ingokegel.bsky.social · 22/09/2026
I've decided to look at the numbers for a common use case for GraalVM which is its best-case scenario against the JVM: a small command line utility. Here GraalVM is still far ahead, but the distance has shrunk considerably.
100 0
Ingo Kegel @ingokegel.bsky.social · 22/09/2026
While this is already a remarkable improvement, JEP 544 will also store compiled code in the cache. And now we are getting into territory where this can be compared to a native image, such as the one produced by GraalVM.
100 0
Ingo Kegel @ingokegel.bsky.social · 22/09/2026
The AOT cache is fully usable in Java 25 and stores the linked state of classes and archived heap objects after a training run. We use this for the install4j IDE that loads 10K classes at startup and it reduces startup time from 3s to ~1.5s on my MacBook.
200 0
Ingo Kegel @ingokegel.bsky.social · 22/09/2026
A quick summary of what JEP 544 and Project Leyden are: Reducing the startup time of the JVM has been a focus for 20 years now. In 2022 a major effort was started to tackle this shortcoming of the JVM once and for all: Project Leyden with the AOT cache at the heart of it.
100 0
Ingo Kegel @ingokegel.bsky.social · 22/09/2026
JEP 544 was just proposed for Java 28. Is Project Leyden on the home stretch to end the GraalVM startup time monopoly? Only one way to find out, by comparing them.
130 0
Ingo Kegel @ingokegel.bsky.social · 10/09/2026
For more on this topic, read my blog post at www.ej-technologies.com/blog/2026/0... Try out install4j for free, no registration required: www.ej-technologies.com/install4j/d...
ej-technologies.com
SBOMs Become Mandatory in 15 Months. Yours Is Probably Wrong.
On December 11, 2027, the SBOM obligations of the EU Cyber Resilience Act start applying. This means that you will soon need an SBOM if you want to ship software in the EU. It's not just the EU, but a global trend of enforcing supply-chain security with this declarative approach: The US has required SBOMs for federal software vendors since 2021, and CISA/NSA/FBI published updated SBOM minimum elements in July of this year.Getting an SBOM correct is not easy, and it becomes even harder when you ship installers for your software. What should you do now? Let's take a look.
000 0
Ingo Kegel @ingokegel.bsky.social · 10/09/2026
So the only tool that can do this is your installer builder itself. Since version 13.1, install4j can write runtime SBOMs next to the created media files or augment SBOMs inside your media files. In that way, you can ship a fully correct SBOM together with your software.
100 0
Ingo Kegel @ingokegel.bsky.social · 10/09/2026
If you ship your software with an installer, the installer adds runtime components which can include embedded libraries. Who adds this to your SBOM? You cannot do this beforehand because shrinking, signing, and packing are byte-transforming operations that change the hashes.
100 0
Ingo Kegel @ingokegel.bsky.social · 10/09/2026
Due to the huge number of involved components, an SBOM can only be produced by a tool. That tool is typically running as a plugin in your build system However, this often misses packaging steps that come after that, the so-called "last assembler" problem.
100 0
Ingo Kegel @ingokegel.bsky.social · 10/09/2026
For users, having an SBOM lets them instantly check whether they are affected by newly disclosed vulnerabilities. In light of the ever-increasing number of malicious packages and cyber-attacks, this is more important than ever. So this kind of regulation is not a bad thing.
100 0
Ingo Kegel @ingokegel.bsky.social · 10/09/2026
📢 SBOMs become mandatory in 15 months. December 11, 2027, is the deadline for the SBOM obligations of the EU Cyber Resilience Act. If you already have one, chances are high that it is incorrect. Why?
100 0
Ingo Kegel @ingokegel.bsky.social · 07/09/2026
Read my blog post at www.ej-technologies.com/blog/2026/0... for the complete analysis and the details of the fix.
ej-technologies.com
How I Made Apache Fory JSON 4.5× Faster
Recently, I have been comparing , and for binary payloads, I have become a big fan of Apache Fory which promises to be "blazingly-fast" on its , and it really is. In the comparisons, I have differentiated between JSON and binary payloads. Jackson was the king of JSON serialization (also for Kotlin), while .Java serialization frameworksweb siteApache Fory dominated for binary payloadsIn the recent 1.7.0 release of Apache Fory, JSON support was added as the main new feature. So naturally, I was very curious and added Fory JSON to my . When I saw the numbers for my payload, I couldn't believe them: Fory was actually . Something was wrong here, and I decided to get to the bottom of it.serialization demo2.8 times slower than Jackson
000 0
Ingo Kegel @ingokegel.bsky.social · 07/09/2026
Thanks to the Apache Fory team who reviewed and merged this in less than 24 hours and released the fixed 1.7.1 shortly after: github.com/apache/fory...
github.com
Release v1.7.1 · apache/fory
Highlights support writing long values as strings for java json serialization encode byte arrays as base64 JSON strings by default for java json serialization Features feat(xlang): expand field ...
100 0
Ingo Kegel @ingokegel.bsky.social · 07/09/2026
Fixing this was more involved, but I managed to convert the heavy branching to a single scan with a 128-entry table for ASCII characters. Finally, the hot spot shrank by a factor of 6 and Fory came to shine again and is now 1.6x faster than Jackson on my realistic payloads.
100 0
Ingo Kegel @ingokegel.bsky.social · 07/09/2026
However, times did not come down a lot. The next profiling run with JProfiler showed that the base64 decoder was exceptionally slow, taking a whopping 85% of the entire run.
100 0
Ingo Kegel @ingokegel.bsky.social · 07/09/2026
When digging into the source code, I saw that there existed an annotation to serialize as the (correct) base64 format, so I flipped it to make the base64 codec the default.
100 0
Ingo Kegel @ingokegel.bsky.social · 07/09/2026
Interestingly, the problem had a double layer: Apache Fory serialized byte arrays as decimal arrays, which is slower and at odds with RFC 7493 (the I-JSON RFC). Profiling indeed showed that this took up most of the time for my payloads.
100 0
Ingo Kegel @ingokegel.bsky.social · 07/09/2026
Apache Fory - the binary JVM serialization champion - released a JSON format in 1.7.0. But my benchmark was 2.8x slower than Jackson. This could not be right. So I started to investigate and finally made it 4.5 times faster.
100 0
Ingo Kegel @ingokegel.bsky.social · 01/09/2026
"skills increase the token count by design" not really. Skills are loaded on demand and the skill data is an information package that the agent searches with its usual tools. I developed the one I linked to, and I do measure token consumption with and without - the effect is drastic.
100 0
Ingo Kegel @ingokegel.bsky.social · 01/09/2026
It's unefficient for an agent. A skill is essentially good docs for an agent and it can dramatically reduce token usage. Like this one www.ej-technologies.com/install4j/wh... it works wonders.
ej-technologies.com
ej-technologies - What's new in install4j
Read about the new features of install4j
100 0
Reposted by Ingo Kegel
Adam Bien @adambien.blog · 29/08/2026
Three decades of public Java specs went onto the open web, and Common Crawl scraped all of it. That, plus explicit types and a fast compiler, is why LLMs write Java well 👉 adambien.blog/roller/java_... #LLM #java #airhacks
adambien.blog
adam bien's blog
153 0
Ingo Kegel @ingokegel.bsky.social · 31/08/2026
Agreed, but they can also swing the other way and try to decompile everything instead of consulting the docs first, which is expensive.
100 0
Ingo Kegel @ingokegel.bsky.social · 31/08/2026
Read my blog post at www.ej-technologies.com/blog/2026/0... for the complete analysis of what causes these differences.
ej-technologies.com
Java vs. Kotlin: Who Can (De)serialize Faster?
In the , I profiled Java serialization frameworks and found that Apache Fory beats Java serialization and other contenders by a huge margin. This generated some interest in the question, how the Kotlin frameworks compare. The Kotlin ecosystem has its own serialization libraries, most notably , the official JetBrains library with compile-time code generation, and with its KSP-based adapter generation. Surely generated code beats the reflection-heavy Java options like ?previous postkotlinx.serializationMoshiJacksonTo find out, I extended the with an equivalent Kotlin data model and profiled round trips with JProfiler. The answer is that the language of your model classes does not matter a lot. However, there are some really surprising finds.comparison project
000 0
Ingo Kegel @ingokegel.bsky.social · 31/08/2026
This carries over to the binary format serializers, where Jackson CBOR outruns both kotlinx.serialization CBOR and kotlinx.serialization ProtoBuf. However, as in the Java serialization comparison, the distant winner is again Apache Fory.
100 0
Ingo Kegel @ingokegel.bsky.social · 31/08/2026
The important distinction that I found while profiling is that kotlinx.serialization builds an abstract, format-neutral serializer while Fory builds a format-specific serializer. Generating the wire format directly makes all the difference.
100 0
Ingo Kegel @ingokegel.bsky.social · 31/08/2026
When comparing JSON serialization, the winner is - surprisingly - Jackson. Jackson uses reflection-based data binding while kotlinx.serialization does compile-time code generation. How can that be?
100 0
Ingo Kegel @ingokegel.bsky.social · 31/08/2026
However, some of the established Java frameworks can do Kotlin, too! Like Jackson, which has a special Kotlin module, or Fory, which does not really care whether the classes are compiled by Java or Kotlin.
100 0
Ingo Kegel @ingokegel.bsky.social · 31/08/2026
In the Kotlin world, the first serialization framework that comes to mind is kotlinx.serialization with its full Multi-Platform support, followed by Moshi with its KSP-based architecture.
100 0
Ingo Kegel @ingokegel.bsky.social · 31/08/2026
Java vs. Kotlin: Who can (de)serialize faster? When I published my Java serialization framework shootout, one of the questions asked was "What about Kotlin?" So here we go.
100 0
Ingo Kegel @ingokegel.bsky.social · 25/08/2026
In Kotlin, I use kotlinx.io.Buffer
kotlinx.io
010 0
Ingo Kegel @ingokegel.bsky.social · 25/08/2026
With Kotlin, Compose Multiplatform would be the hot option, but in Java? JavaFX has its drawbacks too. Also agents are super-comfortable writing Swing apps (no recent API drift 😀)
000 0
Ingo Kegel @ingokegel.bsky.social · 23/08/2026
What I like most with these CSS approaches is that you can have the CSS close to the components instead of in a different file that you cannot easily discover.
121 0
Ingo Kegel @ingokegel.bsky.social · 23/08/2026
Yes indeed! I just checked it: github.com/ej-technolog... It reduces the gap to Fory from 3.4x to 2.2x. Probably varies for other types of workloads.
github.com
010 0
Ingo Kegel @ingokegel.bsky.social · 22/08/2026
outstanding! love the informational details like upcoming releases, projects and jeps.
010 0
Ingo Kegel @ingokegel.bsky.social · 22/08/2026
I think that having large curated ignore lists for packages is not a good idea in the first place.
000 0
Ingo Kegel @ingokegel.bsky.social · 22/08/2026
I blogged about it: www.ej-technologies.com/blog/2026/08...
ej-technologies.com
Why Is Apache Fory So Fast? Profiling 5 Java Serialization Frameworks
It's no secret that the JDK architects seriously dislike Java serialization. It's a security nightmare, considerably complicates every new language feature, and on top of that it's very slow. That's w...
110 0
Ingo Kegel @ingokegel.bsky.social · 22/08/2026
Can't do the dump in-process in the fork on the JVM, and also memory is a problem for that technique. On the JVM, we're waiting for wiki.openjdk.org/spaces/crac/...
wiki.openjdk.org
Main - CRaC - OpenJDK Wiki
Minor changes (build failures fixes, typos, ...) can be pushed directly. Pull Request is a recommended way since it will check the build succeeds.
010 0
Ingo Kegel @ingokegel.bsky.social · 21/08/2026
If you are running JVMs in production and occasionally need profiling data to solve problems, or if you are running self-healing agent loops that require this kind of access, check out jvmguard (and give it a star please, it's brand new) github.com/jvmguard/jv...
github.com
GitHub - jvmguard/jvmguard: Automatic production profiling for JVMs
Automatic production profiling for JVMs. Contribute to jvmguard/jvmguard development by creating an account on GitHub.
000 0