{"id":6128,"date":"2025-12-17T03:03:45","date_gmt":"2025-12-17T03:03:45","guid":{"rendered":"https:\/\/www.javaadvent.com\/?p=6128"},"modified":"2025-12-08T09:03:13","modified_gmt":"2025-12-08T09:03:13","slug":"run-java-aot-cache-optimizations","status":"publish","type":"post","link":"https:\/\/www.javaadvent.com\/2025\/12\/run-java-aot-cache-optimizations.html","title":{"rendered":"Run Into the New Year with Java\u2019s Ahead-of-Time Cache Features"},"content":{"rendered":"<p style=\"text-align: left\">As the year comes to a close, turn your focus to boosting your Java application performance by applying Ahead-of-Time (AOT) cache features in recent JDK releases. This article guides you through using AOT cache optimizations in your application, thereby minimizing startup time and achieving faster peak performance.<\/p>\n<h2>What is the Ahead-of-time cache in the jdk<\/h2>\n<p>JDK 24 introduced the Ahead-Of-Time (AOT) cache, a HotSpot JVM feature that stores classes after they are read, parsed, loaded, and linked. Creating an AOT cache is specific to an application, and you can reuse it in subsequent runs of that application to improve the time to the first functional unit of work (startup time).<\/p>\n<p>To generate an AOT cache, you need to perform two steps:<\/p>\n<ol>\n<li>Training by recording observations of the application in action. You can trigger a recording by setting an argument for the <code>-XX:AOTMode<\/code>\u00a0option and giving a destination for the configuration file via\u00a0<code>-XX:AOTConfiguration<\/code>:\n<pre>java -XX:AOTMode=record -XX:AOTConfiguration=app.aotconf \n     -cp app.jar com.example.App ...<\/pre>\n<p>This step aims to answer questions like &#8220;Which classes does the application load and initialize?&#8221;, &#8220;Which methods become hot?&#8221; and store the results in a configuration file (<code>app.aotconf<\/code>).<\/li>\n<li>Assembly that converts the observations from the configuration file into an AOT cache (<code>app.aot<\/code>).\n<pre>java -XX:AOTMode=create -XX:AOTConfiguration=app.aotconf \n     -XX:AOTCache=app.aot -cp app.jar<\/pre>\n<\/li>\n<\/ol>\n<p>To benefit from a better startup time, run the application by pointing the -XX:AOTCache flag to the resulting AOT cache.<\/p>\n<pre>java -XX:AOTCache=app.aot -cp app.jar com.example.App ...<\/pre>\n<p>The improved startup time is the result of shifting work, usually done just-in-time when the program runs, earlier to the second step, which creates the cache. Thereafter, the program starts up faster in the third phase because its classes are available from the cache immediately.<\/p>\n<p>The three-step workflow (train+assemble+run) became available starting with JDK 24, via\u00a0<a href=\"https:\/\/openjdk.org\/jeps\/483\">JEP 483: Ahead-of-Time Class Loading &amp; Linking<\/a>, the first feature merged from the research done by <a href=\"https:\/\/openjdk.org\/projects\/leyden\/\">Project Leyden<\/a>. A set of\u00a0<a href=\"https:\/\/github.com\/openjdk\/leyden\/blob\/634547513c2a2b707ae43a735dc24fd1977da2ae\/README.md#5-benchmarking\">benchmarks<\/a> prove the effectiveness of this feature and other Leyden performance-related ones, as displayed by <em>Figure 1<\/em>.<\/p>\n<div id=\"attachment_6191\" style=\"width: 2570px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk24.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-6191\" data-attachment-id=\"6191\" data-permalink=\"https:\/\/www.javaadvent.com\/2025\/12\/run-java-aot-cache-optimizations.html\/aot-cache-bench-jdk24\" data-orig-file=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk24.png?fit=2560%2C1440&amp;ssl=1\" data-orig-size=\"2560,1440\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"aot-cache-bench-jdk24\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk24.png?fit=300%2C169&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk24.png?fit=600%2C338&amp;ssl=1\" class=\"wp-image-6191 size-full\" src=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk24.png?resize=600%2C338&#038;ssl=1\" alt=\"Figure 1: AOT Cache Benchmarks as of JDK 24\" width=\"600\" height=\"338\" srcset=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk24.png?w=2560&amp;ssl=1 2560w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk24.png?resize=300%2C169&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk24.png?resize=1024%2C576&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk24.png?resize=768%2C432&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk24.png?resize=1536%2C864&amp;ssl=1 1536w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk24.png?resize=2048%2C1152&amp;ssl=1 2048w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk24.png?resize=1240%2C698&amp;ssl=1 1240w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk24.png?resize=508%2C286&amp;ssl=1 508w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk24.png?w=1800&amp;ssl=1 1800w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><p id=\"caption-attachment-6191\" class=\"wp-caption-text\">Figure 1: AOT Cache Benchmarks as of JDK 24<\/p><\/div>\n<p><span data-preserver-spaces=\"true\">In JDK 25, the changes in\u00a0<\/span><a class=\"editor-rtfLink\" href=\"https:\/\/openjdk.org\/jeps\/515\" target=\"_blank\" rel=\"noopener\"><span data-preserver-spaces=\"true\">JEP 515 &#8211; Ahead-of-Time Method Profiling<\/span><\/a><span data-preserver-spaces=\"true\"> enabled frequently executed method profiles to be part of the AOT cache. This addition improves application warm up by allowing the JIT to start generating native code immediately at application startup. The new AOT feature does not require you to add more constraints to your application execution; just use the existing AOT cache creation commands. Moreover,\u00a0<\/span><a class=\"editor-rtfLink\" href=\"https:\/\/github.com\/openjdk\/leyden\/blob\/634547513c2a2b707ae43a735dc24fd1977da2ae\/README.md\" target=\"_blank\" rel=\"noopener\"><span data-preserver-spaces=\"true\">benchmarks<\/span><\/a><span data-preserver-spaces=\"true\"> showed improved startup time too (<\/span><em><span data-preserver-spaces=\"true\">Figure 2<\/span><\/em><span data-preserver-spaces=\"true\">).<\/span><\/p>\n<div id=\"attachment_6192\" style=\"width: 2570px\" class=\"wp-caption aligncenter\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-6192\" data-attachment-id=\"6192\" data-permalink=\"https:\/\/www.javaadvent.com\/2025\/12\/run-java-aot-cache-optimizations.html\/aot-cache-bench-jdk25\" data-orig-file=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk25.png?fit=2560%2C1440&amp;ssl=1\" data-orig-size=\"2560,1440\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"aot-cache-bench-jdk25\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk25.png?fit=300%2C169&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk25.png?fit=600%2C338&amp;ssl=1\" class=\"wp-image-6192 size-full\" src=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk25.png?resize=600%2C338&#038;ssl=1\" alt=\"Figure 2: AOT Cache Benchmarks as of JDK 25\" width=\"600\" height=\"338\" srcset=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk25.png?w=2560&amp;ssl=1 2560w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk25.png?resize=300%2C169&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk25.png?resize=1024%2C576&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk25.png?resize=768%2C432&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk25.png?resize=1536%2C864&amp;ssl=1 1536w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk25.png?resize=2048%2C1152&amp;ssl=1 2048w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk25.png?resize=1240%2C698&amp;ssl=1 1240w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk25.png?resize=508%2C286&amp;ssl=1 508w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/aot-cache-bench-jdk25.png?w=1800&amp;ssl=1 1800w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><p id=\"caption-attachment-6192\" class=\"wp-caption-text\">Figure 2: AOT Cache Benchmarks as of JDK 25<\/p><\/div>\n<p>JDK 25 also simplified the process for generating an AOT cache by making it possible to do it in a single step, through setting the argument for\u00a0<code>-XX:AOTCacheOutput<\/code>\u00a0flag:<\/p>\n<pre># Training Run + Assembly Phase\njava -XX:AOTCacheOutput=app.aot \\\n     -cp app.jar com.example.App ...<\/pre>\n<p>Upon passing\u00a0<code>-XX:AOTCacheOutput=[cache<span class=\"token space\">\u00a0<\/span>location]<\/code>, the JVM creates the cache on its shutdown. <a href=\"https:\/\/openjdk.org\/jeps\/514\">JEP 514 &#8211; Ahead-of-Time Command-Line Ergonomics<\/a>\u00a0introduced the two-step process for creating and using the AOT cache.<\/p>\n<pre># Training Run + Assembly Phase\njava -XX:AOTCacheOutput=app.aot \\\n     -cp app.jar com.example.App ...\n\n# Deployment Run\njava -XX:AOTCache=app.aot -cp app.jar com.example.App ...<\/pre>\n<p>The two-step workflow may not work as expected in resource-constrained environments. The sub-invocation that creates the AOT cache uses its own Java heap with the same size as the heap used for the\u00a0<a href=\"https:\/\/openjdk.org\/projects\/leyden\/notes\/05-training-runs\">training run<\/a>. As a result, the memory needed to complete the one-step AOT cache generation is double the heap size specified on the command line. For example, if the one-step workflow\u00a0<code>java<span class=\"token space\">\u00a0<\/span>-XX:AOTCacheOutput=...<\/code>\u00a0is accompanied by\u00a0<code>-Xms2g<span class=\"token space\">\u00a0<\/span>-Xmx2g<\/code>, specifying a 2GB heap, then the environment needs 4GB to complete the workflow.<\/p>\n<p>A division of steps, as in a three-phase workflow, may be a better choice if you intend to deploy an application to small cloud tenancies. In such cases, you could run the training on a small instance while creating the AOT cache on a larger one. That way, the training run reflects the deployment environment, while the AOT cache creation can leverage the additional CPU cores and memory of the large instance.<\/p>\n<p>Regardless of which workflow you choose, let\u2019s take a closer look at AOT cache requirements and how to set it up to serve your application needs best.<\/p>\n<h2 id=\"how-to-craft-the-aot-cache-your-application-needs\">How to Craft the AOT Cache Your Application Needs<\/h2>\n<p>Training and production runs should produce consistent results, just faster in deployment runs. To achieve that, the assembly phase intermediates what happens between training and production runs (<em>Figure 3<\/em>).<\/p>\n<div id=\"attachment_6193\" style=\"width: 2176px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/train-assembly-run.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-6193\" data-attachment-id=\"6193\" data-permalink=\"https:\/\/www.javaadvent.com\/2025\/12\/run-java-aot-cache-optimizations.html\/train-assembly-run\" data-orig-file=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/train-assembly-run.png?fit=2166%2C907&amp;ssl=1\" data-orig-size=\"2166,907\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"train-assembly-run\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/train-assembly-run.png?fit=300%2C126&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/train-assembly-run.png?fit=600%2C251&amp;ssl=1\" class=\"wp-image-6193 size-full\" src=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/train-assembly-run.png?resize=600%2C251&#038;ssl=1\" alt=\"Figure 3: Training \/ Assembly \/ Deployment\" width=\"600\" height=\"251\" srcset=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/train-assembly-run.png?w=2166&amp;ssl=1 2166w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/train-assembly-run.png?resize=300%2C126&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/train-assembly-run.png?resize=1024%2C429&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/train-assembly-run.png?resize=768%2C322&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/train-assembly-run.png?resize=1536%2C643&amp;ssl=1 1536w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/train-assembly-run.png?resize=2048%2C858&amp;ssl=1 2048w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/train-assembly-run.png?resize=1240%2C519&amp;ssl=1 1240w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/train-assembly-run.png?resize=508%2C213&amp;ssl=1 508w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2025\/12\/train-assembly-run.png?w=1800&amp;ssl=1 1800w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><p id=\"caption-attachment-6193\" class=\"wp-caption-text\">Figure 3: Training \/ Assembly \/ Deployment<\/p><\/div>\n<p>For consistent training runs and the subsequent ones, make sure that:<\/p>\n<ul>\n<li>Your JARs preserve their timestamp across training runs.<\/li>\n<li>Your training runs and the production one use the same JDK release for the same hardware architecture and operating system.<\/li>\n<li>Provide the classpath for your application as a list of JARs, without any directories, wildcards or nested JARs.<\/li>\n<li>Production run classpath must be a superset of the training one.<\/li>\n<li>Do not use use JVMTI agents that call the\u00a0<code>AddToBootstrapClassLoaderSearch<\/code>and\u00a0<code>AddToSystemClassLoaderSearch<\/code>\u00a0APIs.<\/li>\n<\/ul>\n<p>To check if your JVM is correctly configured to use the AOT cache, you can add the option\u00a0<code>-XX:AOTMode=on<\/code>\u00a0to the command line:<\/p>\n<pre>java -XX:AOTCache=app.aot -XX:AOTMode=on \\\n     -cp app.jar com.example.App ...<\/pre>\n<p>The JVM will report an error if the AOT cache does not exist or if your setup disregards any of the above requirements. Furthermore, the features introduced in JDK 24 and 25 did not support the Z Garbage Collector (ZGC). Yet, this limitation no longer applies as of JDK 26, with the introduction of <a href=\"https:\/\/openjdk.org\/jeps\/516\">JEP 516: Ahead-of-Time Object Caching with Any GC<\/a>.<\/p>\n<p>To ensure the AOT cache works effectively in production, the training run and all following runs must be essentially identical. Training runs are a way of observing what an application is doing across different runs and are primarily two types:<\/p>\n<ul>\n<li>integration tests, which run at build time<\/li>\n<li>production workloads, which require training in production.<\/li>\n<\/ul>\n<p>Avoid loading unused classes during the training step and skip rich test frameworks to keep the AOT cache minimal. Mock external dependencies in training to load needed classes, but be aware that this may introduce extra cache entries.<\/p>\n<p>AOT cache effectiveness depends on how closely the training run matches production behavior. If you rebuild the application or upgrade its JDK, you must regenerate the AOT cache. Otherwise, you risk crashes or undefined behavior (methods missing from cache).<\/p>\n<p>In case you need to debug the performance of your application, run it with\u00a0<code>-Xlog:aot,class+path=info<\/code> to monitor what it loads from cache.<\/p>\n<h2 id=\"tips-for-efficient-training-runs\">Tips for Efficient Training Runs<\/h2>\n<p>There is a trade-off between performance and how easy it is to run the training. Using a production run for training is not always practical, especially for server applications, which can create log files, open network connections, access databases, etc. For such cases, it is better to make a synthetic training run that closely resembles actual production runs.<\/p>\n<p>Aligning the training run to load the same classes as production helps to achieve an optimized startup time. To determine which classes are loaded by your training run, you can append the <code>-verbose:class<\/code>\u00a0flag upon launching it. Or observe the loaded classes by enabling the\u00a0<code>jdk.ClassLoad<\/code>\u00a0JFR event and profiling your application with it:<\/p>\n<pre># configure the event\njfr configure jdk.ClassLoad#enabled=true\n\n# profile as soon as your application launches\njava -XX:StartFlightRecording:settings=custom.jfc,duration=60s,filename=\/tmp\/AOT.jfr\n\n# profile on a running application identified through llvmid\njcmd llvmid JFR.start settings=custom.jfc duration=60s filename=\/tmp\/AOT.jfr\n<\/pre>\n<p>On the recording file, you may check the loaded classes, but also which methods your application frequently uses by running the following <code>jfr<\/code> commands:<\/p>\n<pre># print jdk.ClassLoad events from a recording file\njfr print --events \"jdk.ClassLoad\" \/tmp\/AOT.jfr\n\n# view frequently executed methods\njfr view hot-methods \/tmp\/AOT.jfr\n<\/pre>\n<p>If you determine that there are methods frequently used but not detected by your training run, exercise them. You can work out the standard modes of your application using a temporary file directory, a local network configuration, and a mocked database, if needed.<br \/>\nAvoid loading unused classes during training and skip rich test frameworks to keep the AOT cache minimal. Instead, use smoke tests to cover typical startup paths; avoid extensive suites and stress\/regression tests.<\/p>\n<h2>Takeways<\/h2>\n<p>To conclude, crafting an AOT cache for better performance requires you to look over:<\/p>\n<ul>\n<li>Cache validity or staleness; if you rebuild the application or upgrade the JDK, you must regenerate the AOT cache.<\/li>\n<li>Portability, as the AOT cache is JVM and platform-specific.<\/li>\n<li>Startup path coverage; the training run must cover typical application startup paths. If your training run is shallow, you will not warm up enough, and the benefits of the cache will be limited.<\/li>\n<li>Operational setup as both the application JAR and the AOT cache must run with least privilege and according to immutable infrastructure practices.<\/li>\n<\/ul>\n<p>Application performance is an ongoing task because software evolves: new features are added, libraries change, workloads grow, and infrastructure shifts (e.g., to the cloud, container orchestration, etc.). Depending on those evolutions, your application performance goals evolve as well. Invest in training your application today and keep up with JDK releases to unlock available optimizations, as performance improves with each of them!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>As the year comes to a close, turn your focus to boosting your Java application performance by applying Ahead-of-Time (AOT) cache features in recent JDK releases. This article guides you through using AOT cache optimizations in your application, thereby minimizing startup time and achieving faster peak performance. What is the Ahead-of-time cache in the jdk [&hellip;]<\/p>\n","protected":false},"author":244,"featured_media":3220,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[765,4,42,397],"tags":[251,785,342,562],"coauthors":[667],"class_list":["post-6128","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-765","category-java-advent","category-openjdk","category-performance","tag-java","tag-jdk25","tag-performance","tag-project-leyden"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Run Into the New Year with Java\u2019s Ahead-of-Time Cache Features - JVM Advent<\/title>\n<meta name=\"description\" content=\"This article guides you through using AOT cache optimizations in your application, thereby minimizing startup time and achieving faster peak performance.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javaadvent.com\/2025\/12\/run-java-aot-cache-optimizations.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Run Into the New Year with Java\u2019s Ahead-of-Time Cache Features - JVM Advent\" \/>\n<meta property=\"og:description\" content=\"This article guides you through using AOT cache optimizations in your application, thereby minimizing startup time and achieving faster peak performance.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javaadvent.com\/2025\/12\/run-java-aot-cache-optimizations.html\" \/>\n<meta property=\"og:site_name\" content=\"JVM Advent\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Java-Advent-Calendar-229536173843473\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-17T03:03:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-17.png?fit=800%2C800&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"800\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Ana-Maria Mihalceanu\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@https:\/\/x.com\/ammbra1508\" \/>\n<meta name=\"twitter:site\" content=\"@javaadvent\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ana-Maria Mihalceanu\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2025\\\/12\\\/run-java-aot-cache-optimizations.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2025\\\/12\\\/run-java-aot-cache-optimizations.html\"},\"author\":{\"name\":\"Ana-Maria Mihalceanu\",\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/#\\\/schema\\\/person\\\/d3c24ff377b3453e51a3b6412262f578\"},\"headline\":\"Run Into the New Year with Java\u2019s Ahead-of-Time Cache Features\",\"datePublished\":\"2025-12-17T03:03:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2025\\\/12\\\/run-java-aot-cache-optimizations.html\"},\"wordCount\":1382,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2025\\\/12\\\/run-java-aot-cache-optimizations.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/www.javaadvent.com\\\/content\\\/uploads\\\/2021\\\/12\\\/Feature-Image-Day-17.png?fit=800%2C800&ssl=1\",\"keywords\":[\"java\",\"jdk25\",\"performance\",\"Project Leyden\"],\"articleSection\":[\"2025\",\"Java Advent\",\"openjdk\",\"Performance\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javaadvent.com\\\/2025\\\/12\\\/run-java-aot-cache-optimizations.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2025\\\/12\\\/run-java-aot-cache-optimizations.html\",\"url\":\"https:\\\/\\\/www.javaadvent.com\\\/2025\\\/12\\\/run-java-aot-cache-optimizations.html\",\"name\":\"Run Into the New Year with Java\u2019s Ahead-of-Time Cache Features - JVM Advent\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2025\\\/12\\\/run-java-aot-cache-optimizations.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2025\\\/12\\\/run-java-aot-cache-optimizations.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/www.javaadvent.com\\\/content\\\/uploads\\\/2021\\\/12\\\/Feature-Image-Day-17.png?fit=800%2C800&ssl=1\",\"datePublished\":\"2025-12-17T03:03:45+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/#\\\/schema\\\/person\\\/d3c24ff377b3453e51a3b6412262f578\"},\"description\":\"This article guides you through using AOT cache optimizations in your application, thereby minimizing startup time and achieving faster peak performance.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2025\\\/12\\\/run-java-aot-cache-optimizations.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javaadvent.com\\\/2025\\\/12\\\/run-java-aot-cache-optimizations.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2025\\\/12\\\/run-java-aot-cache-optimizations.html#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/www.javaadvent.com\\\/content\\\/uploads\\\/2021\\\/12\\\/Feature-Image-Day-17.png?fit=800%2C800&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/www.javaadvent.com\\\/content\\\/uploads\\\/2021\\\/12\\\/Feature-Image-Day-17.png?fit=800%2C800&ssl=1\",\"width\":800,\"height\":800},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2025\\\/12\\\/run-java-aot-cache-optimizations.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javaadvent.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Run Into the New Year with Java\u2019s Ahead-of-Time Cache Features\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javaadvent.com\\\/\",\"name\":\"JVM Advent\",\"description\":\"The JVM Programming Advent Calendar\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javaadvent.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/#\\\/schema\\\/person\\\/d3c24ff377b3453e51a3b6412262f578\",\"name\":\"Ana-Maria Mihalceanu\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/835516272d6944f712d86df825e06d1d3ed37868aa146240a8b1f57ba32ed936?s=96&d=retro&r=g5e0bd88f9014a70bc5328d4f121010d2\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/835516272d6944f712d86df825e06d1d3ed37868aa146240a8b1f57ba32ed936?s=96&d=retro&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/835516272d6944f712d86df825e06d1d3ed37868aa146240a8b1f57ba32ed936?s=96&d=retro&r=g\",\"caption\":\"Ana-Maria Mihalceanu\"},\"description\":\"Ana is a Java Champion Alumni, Developer Advocate, guest author of the book \\\"DevOps tools for Java Developers\\\", and a constant adopter of challenging technical scenarios involving Java-based frameworks and multiple cloud providers. She actively supports technical communities' growth through knowledge sharing and enjoys curating content for conferences as a program committee member. To learn more about\\\/from her, follow her on Twitter @ammbra1508 or on Mastodon @ammbra1508.mastodon.social.\",\"sameAs\":[\"https:\\\/\\\/x.com\\\/https:\\\/\\\/x.com\\\/ammbra1508\"],\"url\":\"https:\\\/\\\/www.javaadvent.com\\\/author\\\/ammihalceanu\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Run Into the New Year with Java\u2019s Ahead-of-Time Cache Features - JVM Advent","description":"This article guides you through using AOT cache optimizations in your application, thereby minimizing startup time and achieving faster peak performance.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javaadvent.com\/2025\/12\/run-java-aot-cache-optimizations.html","og_locale":"en_US","og_type":"article","og_title":"Run Into the New Year with Java\u2019s Ahead-of-Time Cache Features - JVM Advent","og_description":"This article guides you through using AOT cache optimizations in your application, thereby minimizing startup time and achieving faster peak performance.","og_url":"https:\/\/www.javaadvent.com\/2025\/12\/run-java-aot-cache-optimizations.html","og_site_name":"JVM Advent","article_publisher":"https:\/\/www.facebook.com\/Java-Advent-Calendar-229536173843473\/","article_published_time":"2025-12-17T03:03:45+00:00","og_image":[{"width":800,"height":800,"url":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-17.png?fit=800%2C800&ssl=1","type":"image\/png"}],"author":"Ana-Maria Mihalceanu","twitter_card":"summary_large_image","twitter_creator":"@https:\/\/x.com\/ammbra1508","twitter_site":"@javaadvent","twitter_misc":{"Written by":"Ana-Maria Mihalceanu","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javaadvent.com\/2025\/12\/run-java-aot-cache-optimizations.html#article","isPartOf":{"@id":"https:\/\/www.javaadvent.com\/2025\/12\/run-java-aot-cache-optimizations.html"},"author":{"name":"Ana-Maria Mihalceanu","@id":"https:\/\/www.javaadvent.com\/#\/schema\/person\/d3c24ff377b3453e51a3b6412262f578"},"headline":"Run Into the New Year with Java\u2019s Ahead-of-Time Cache Features","datePublished":"2025-12-17T03:03:45+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javaadvent.com\/2025\/12\/run-java-aot-cache-optimizations.html"},"wordCount":1382,"commentCount":0,"image":{"@id":"https:\/\/www.javaadvent.com\/2025\/12\/run-java-aot-cache-optimizations.html#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-17.png?fit=800%2C800&ssl=1","keywords":["java","jdk25","performance","Project Leyden"],"articleSection":["2025","Java Advent","openjdk","Performance"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javaadvent.com\/2025\/12\/run-java-aot-cache-optimizations.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javaadvent.com\/2025\/12\/run-java-aot-cache-optimizations.html","url":"https:\/\/www.javaadvent.com\/2025\/12\/run-java-aot-cache-optimizations.html","name":"Run Into the New Year with Java\u2019s Ahead-of-Time Cache Features - JVM Advent","isPartOf":{"@id":"https:\/\/www.javaadvent.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javaadvent.com\/2025\/12\/run-java-aot-cache-optimizations.html#primaryimage"},"image":{"@id":"https:\/\/www.javaadvent.com\/2025\/12\/run-java-aot-cache-optimizations.html#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-17.png?fit=800%2C800&ssl=1","datePublished":"2025-12-17T03:03:45+00:00","author":{"@id":"https:\/\/www.javaadvent.com\/#\/schema\/person\/d3c24ff377b3453e51a3b6412262f578"},"description":"This article guides you through using AOT cache optimizations in your application, thereby minimizing startup time and achieving faster peak performance.","breadcrumb":{"@id":"https:\/\/www.javaadvent.com\/2025\/12\/run-java-aot-cache-optimizations.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javaadvent.com\/2025\/12\/run-java-aot-cache-optimizations.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javaadvent.com\/2025\/12\/run-java-aot-cache-optimizations.html#primaryimage","url":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-17.png?fit=800%2C800&ssl=1","contentUrl":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-17.png?fit=800%2C800&ssl=1","width":800,"height":800},{"@type":"BreadcrumbList","@id":"https:\/\/www.javaadvent.com\/2025\/12\/run-java-aot-cache-optimizations.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javaadvent.com\/"},{"@type":"ListItem","position":2,"name":"Run Into the New Year with Java\u2019s Ahead-of-Time Cache Features"}]},{"@type":"WebSite","@id":"https:\/\/www.javaadvent.com\/#website","url":"https:\/\/www.javaadvent.com\/","name":"JVM Advent","description":"The JVM Programming Advent Calendar","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javaadvent.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.javaadvent.com\/#\/schema\/person\/d3c24ff377b3453e51a3b6412262f578","name":"Ana-Maria Mihalceanu","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/835516272d6944f712d86df825e06d1d3ed37868aa146240a8b1f57ba32ed936?s=96&d=retro&r=g5e0bd88f9014a70bc5328d4f121010d2","url":"https:\/\/secure.gravatar.com\/avatar\/835516272d6944f712d86df825e06d1d3ed37868aa146240a8b1f57ba32ed936?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/835516272d6944f712d86df825e06d1d3ed37868aa146240a8b1f57ba32ed936?s=96&d=retro&r=g","caption":"Ana-Maria Mihalceanu"},"description":"Ana is a Java Champion Alumni, Developer Advocate, guest author of the book \"DevOps tools for Java Developers\", and a constant adopter of challenging technical scenarios involving Java-based frameworks and multiple cloud providers. She actively supports technical communities' growth through knowledge sharing and enjoys curating content for conferences as a program committee member. To learn more about\/from her, follow her on Twitter @ammbra1508 or on Mastodon @ammbra1508.mastodon.social.","sameAs":["https:\/\/x.com\/https:\/\/x.com\/ammbra1508"],"url":"https:\/\/www.javaadvent.com\/author\/ammihalceanu"}]}},"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-17.png?fit=800%2C800&ssl=1","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":29,"url":"https:\/\/www.javaadvent.com\/2014\/12\/jdk-9-a-letter-to-santa.html","url_meta":{"origin":6128,"position":0},"title":"JDK 9 &#8211; a letter to Santa?!","author":"gpanther","date":"December 5, 2014","format":false,"excerpt":"As everybody knows, winter (especially the time before Christmas) is a proper time for dreaming and hoping a moment when dreams seem to be touchable. A moment when children and grown-ups write on paper or in their thoughts fictive or real letters to Santa Claus, hoping their dreams will become\u2026","rel":"","context":"In &quot;2014&quot;","block_context":{"text":"2014","link":"https:\/\/www.javaadvent.com\/category\/2014"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":5703,"url":"https:\/\/www.javaadvent.com\/2024\/12\/5-cool-applications-you-can-build-with-java-and-graalvm.html","url_meta":{"origin":6128,"position":1},"title":"5 cool applications you can build with Java and GraalVM","author":"Alina Yurenko","date":"December 17, 2024","format":false,"excerpt":"There are many cool apps you can build with Java, and GraalVM can make them even better \u2014 faster, smaller, more secure. In the recent years GraalVM and Native Image have gained significant traction in the Java ecosystem, so now building applications with it is easier than ever. There are\u2026","rel":"","context":"In &quot;2024&quot;","block_context":{"text":"2024","link":"https:\/\/www.javaadvent.com\/category\/2024"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-17.png?fit=800%2C800&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-17.png?fit=800%2C800&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-17.png?fit=800%2C800&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-17.png?fit=800%2C800&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":1013,"url":"https:\/\/www.javaadvent.com\/2017\/12\/learning-use-wholly-graalvm.html","url_meta":{"origin":6128,"position":2},"title":"Learning to use Wholly GraalVM!","author":"Mani Sarkar","date":"December 13, 2017","format":false,"excerpt":"Citation: credits to the feature image goes to Anne Davis\u00a0 and reused under a CC license, the original image can be found on this Flickr page. Introduction In the post Truffle served in a Holy Graal: Graal and Truffle for polyglot language interpretation on the JVM, we got a brief\u2026","rel":"","context":"In &quot;2017&quot;","block_context":{"text":"2017","link":"https:\/\/www.javaadvent.com\/category\/2017"},"img":{"alt_text":"I'm still learning by michelangelo","src":"https:\/\/neomatrix369.files.wordpress.com\/2017\/12\/im-still-learning-by-michelangelo.png?w=350&h=200&crop=1","width":350,"height":200,"srcset":"https:\/\/neomatrix369.files.wordpress.com\/2017\/12\/im-still-learning-by-michelangelo.png?w=350&h=200&crop=1 1x, https:\/\/neomatrix369.files.wordpress.com\/2017\/12\/im-still-learning-by-michelangelo.png?w=525&h=300&crop=1 1.5x, https:\/\/neomatrix369.files.wordpress.com\/2017\/12\/im-still-learning-by-michelangelo.png?w=700&h=400&crop=1 2x, https:\/\/neomatrix369.files.wordpress.com\/2017\/12\/im-still-learning-by-michelangelo.png?w=1050&h=600&crop=1 3x"},"classes":[]},{"id":75,"url":"https:\/\/www.javaadvent.com\/2012\/12\/functional-java-collections.html","url_meta":{"origin":6128,"position":3},"title":"Functional Java collections","author":"Mite Mitreski","date":"December 15, 2012","format":false,"excerpt":"There is a lot of functional hype these days so I would give a short overview on what is out there at least when it comes to collections in Java. Personally I like standard collections API but i some cases can be awkward and add additional verboseness. This should not\u2026","rel":"","context":"In &quot;2012&quot;","block_context":{"text":"2012","link":"https:\/\/www.javaadvent.com\/category\/2012"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":5228,"url":"https:\/\/www.javaadvent.com\/2024\/12\/java-integrity-by-default.html","url_meta":{"origin":6128,"position":4},"title":"Peaceful and Bright Future of Integrity by Default in Java","author":"Ana-Maria Mihalceanu","date":"December 2, 2024","format":false,"excerpt":"As Java continues to evolve, its commitment to stability and robustness grows stronger. Recent and upcoming JDK releases reflect this approach by gradually enhancing boundaries of unsafe APIs: restricting dynamic agent loading, deprecating potentially unsafe memory-access methods, and preparing for stricter Java Native Interface (JNI) usage. Introducing the Foreign Function\u2026","rel":"","context":"In &quot;java&quot;","block_context":{"text":"java","link":"https:\/\/www.javaadvent.com\/category\/java"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-2.png?fit=800%2C800&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-2.png?fit=800%2C800&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-2.png?fit=800%2C800&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-2.png?fit=800%2C800&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":1362,"url":"https:\/\/www.javaadvent.com\/2018\/12\/docker-and-the-jvm.html","url_meta":{"origin":6128,"position":5},"title":"Docker and the JVM","author":"Cesar Tron-Lozai","date":"December 7, 2018","format":false,"excerpt":"Even though Docker was a 2016 thing, it is still relevant today. It is the foundation of Kubernetes, the most popular Orchestration platform, that has become the go-to solution for cloud deployment. Docker is the defacto standard solution to containerise applications\/(micro)services. If you run Java application you need to beaware\u2026","rel":"","context":"In &quot;2018&quot;","block_context":{"text":"2018","link":"https:\/\/www.javaadvent.com\/category\/2018"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2018\/12\/image-300x161.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]}],"jetpack_likes_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/posts\/6128","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/users\/244"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/comments?post=6128"}],"version-history":[{"count":15,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/posts\/6128\/revisions"}],"predecessor-version":[{"id":6204,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/posts\/6128\/revisions\/6204"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/media\/3220"}],"wp:attachment":[{"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/media?parent=6128"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/categories?post=6128"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/tags?post=6128"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/coauthors?post=6128"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}