As everyone here knows, I worked for months to make Nucleus handle GraalVM native compilation in a stable and production-ready way, because I own a large application in Israel with thousands of users, and I was receiving daily complaints about the app's startup time. My app integrates a search engine and uses Lucene, performing an enormous amount of computation with every search. It's true that I saw a noticeable difference in search latency—about 2x—which is why I decided to get rid of Liberica NIK and support Oracle Enterprise Edition's GraalVM native compilation with PGO. I must say that all of this is very stable today, and the performance is impressive. As I mentioned, I went from almost daily complaints to total silence (I also had many bugs related to AWT, but that's not why I'm talking today), just feature requests overall, and nothing related to the framework itself.
Now, during my recent testing—keeping in mind that I test almost exclusively on Windows since it accounts for 95% of my users—I tried replacing G1 with Serial GC and saved 100 MB of RAM on a Hello World! I tried combining this with the AOT cache (Project Leyden), but on JDK 25 it simply crashes, on JDK 26 the app uses 2 GB of RAM, and on the JDK 27 EA build, without ProGuard, everything works. I get a cold boot of 1.5 seconds and total RAM usage lower than Native Image as a whole. Task Manager displays 50 MB more, but it only measures private memory, not total memory. In total, the app uses 20 MB less, and takes only 500 ms longer to start than with Native Image.
I imagine this will improve even further once ProGuard supports JDK 27, not to mention that Leyden is still in its infancy. In fact, all this to say that Native Image might just be a temporary solution. @Alexander Maryanovsky If you can verify it, Serial GC seems much better suited for desktop than G1, especially if you manage to get it working normally with Leyden without RAM usage blowing up.