{"id":232091,"date":"2025-05-20T07:00:13","date_gmt":"2025-05-20T14:00:13","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/java\/?p=232091"},"modified":"2025-05-21T15:47:37","modified_gmt":"2025-05-21T22:47:37","slug":"announcing-azure-command-launcher-for-java","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/java\/announcing-azure-command-launcher-for-java\/","title":{"rendered":"Announcing Azure Command Launcher for Java"},"content":{"rendered":"<h3>Optimizing JVM Configuration for Azure Deployments<\/h3>\n<p>Tuning the Java Virtual Machine (JVM) for cloud deployments is notoriously challenging. Over 30% of developers tend to deploy Java workloads with no JVM configuration at all, therefore relying on the default settings of the HotSpot JVM. The default settings in OpenJDK are intentionally conservative, designed to work across a wide range of environments and scenarios. However, these defaults often lead to suboptimal resource utilization in cloud-based deployments, where memory and CPU tend to be dedicated for application workloads (use of containers and VMs) but still require intelligent management to maximize efficiency and cost-effectiveness.<\/p>\n<p><img decoding=\"async\" class=\"aligncenter wp-image-232231 size-thumbnail\" src=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2025\/05\/tmp_dae532dc-b562-4726-a93a-85141b2a6230-150x150.png\" alt=\"Azure Command Launcher for Java\" width=\"150\" height=\"150\" srcset=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2025\/05\/tmp_dae532dc-b562-4726-a93a-85141b2a6230-150x150.png 150w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2025\/05\/tmp_dae532dc-b562-4726-a93a-85141b2a6230-300x300.png 300w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2025\/05\/tmp_dae532dc-b562-4726-a93a-85141b2a6230-768x768.png 768w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2025\/05\/tmp_dae532dc-b562-4726-a93a-85141b2a6230-24x24.png 24w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2025\/05\/tmp_dae532dc-b562-4726-a93a-85141b2a6230-48x48.png 48w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2025\/05\/tmp_dae532dc-b562-4726-a93a-85141b2a6230-96x96.png 96w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2025\/05\/tmp_dae532dc-b562-4726-a93a-85141b2a6230.png 1024w\" sizes=\"(max-width: 150px) 100vw, 150px\" \/><\/p>\n<p>To address this, we are excited to introduce <strong>jaz<\/strong>, a new JVM launcher optimized specifically for <strong>Azure<\/strong>. jaz provides better default ergonomics for Java applications running in <strong>containers and virtual machines<\/strong>, ensuring a more efficient use of resources right from the start, and leverages advanced JVM features automatically, such as <a href=\"https:\/\/dev.java\/learn\/jvm\/cds-appcds\/#appcds\">AppCDS<\/a> and in the future, <a href=\"https:\/\/openjdk.org\/projects\/leyden\/\">Project Leyden<\/a>.<\/p>\n<h2>Why jaz?<\/h2>\n<h3>Conservative Defaults Lead to Underutilization of Resources<\/h3>\n<p>When deploying Java applications to the cloud, developers often need to fine-tune JVM parameters such as <strong>heap size, garbage collection strategies, and other tuning configurations <\/strong>to achieve better resource utilization and potentially higher performance. The default OpenJDK settings, while safe, do not take full advantage of available resources in cloud environments, leading to unnecessary waste and increased operational costs.<\/p>\n<p>While advancements in <strong>dynamic heap sizing<\/strong> are underway by <strong>Oracle, Google, and Microsoft<\/strong>, they are still in development and will be available primarily in future major releases of OpenJDK. In the meantime, developers running applications on current and older JDK versions (such as OpenJDK 8, 11, 17, and 21) still need to optimize their configurations manually or rely on external tools like Paketo Buildpacks, which automate tuning but may not be suitable for all use cases.<\/p>\n<p>With jaz, we are providing a <strong>smarter starting point<\/strong> for Java applications on Azure, with default configurations designed for cloud environments. The jaz launcher helps by:<\/p>\n<ul>\n<li><strong>Optimizing resource utilization<\/strong>: By setting JVM parameters tailored for cloud deployments, jaz reduces wasted memory and CPU cycles.<\/li>\n<li><strong>Improve first-deploy performance<\/strong>: New applications often require trial and error to find the right JVM settings. jaz increases the likelihood of <strong>better performance on first deployment<\/strong>.<\/li>\n<li><strong>Enhance cost efficiency<\/strong>: By making better use of available resources, applications using jaz can <strong>reduce unnecessary cloud costs<\/strong>.<\/li>\n<\/ul>\n<p>This tool is ideal for developers who:<\/p>\n<ul>\n<li>Want better JVM defaults without diving deep into tuning guides<\/li>\n<li>Develop and deploy cloud native microservices with Spring Boot, Quarkus, or Micronaut<\/li>\n<li>Prefer container-based workflows such as Kubernetes and OpenShift<\/li>\n<li>Deploy Java workloads on Azure Container Apps, Azure Kubernetes Service, Azure Red Hat OpenShift, or Azure VMs<\/li>\n<\/ul>\n<h2>How jaz works?<\/h2>\n<p dir=\"auto\"><code>jaz<\/code>\u00a0sits between your container startup command and the JVM. It will:<\/p>\n<ol dir=\"auto\">\n<li>Detect the cloud environment (e.g., container limits, available memory)<\/li>\n<li>Analyzes the workload type and selects best-fit JVM options<\/li>\n<li>Launches the Java process with optimized flags, such as:<\/li>\n<\/ol>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul dir=\"auto\">\n<li>Heap sizing<\/li>\n<li>GC selection and tuning<\/li>\n<li>Logging and diagnostics settings as needed<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\">Example Usage<\/h3>\n<p>Instead of this:<\/p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\">\n<pre><code class=\"language-default\">$ JAVA_OPTS=\"-XX:... several JVM tuning flags\"\r\n$ java $JAVA_OPTS -jar myapp.jar\"<\/code><\/pre>\n<\/div>\n<p dir=\"auto\">Use:<\/p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\">\n<pre class=\"prettyprint language-default\"><code class=\"language-default\">$ jaz -jar myapp.jar<\/code><\/pre>\n<div class=\"zeroclipboard-container\">You will automatically benefit from:<\/div>\n<\/div>\n<ul dir=\"auto\">\n<li>Battle-tested defaults for cloud native and container workloads<\/li>\n<li>Reduced memory waste<\/li>\n<li>Better startup and warmup performance<\/li>\n<li>No manual tuning required<\/li>\n<\/ul>\n<h2 class=\"\" data-start=\"1793\" data-end=\"1831\">How to Access jaz (Private Preview)<\/h2>\n<p class=\"\" data-start=\"1833\" data-end=\"2001\">jaz is currently available through a <strong data-start=\"1870\" data-end=\"1889\">Private Preview<\/strong>. During this phase, we are working closely with selected customers to refine the experience and gather feedback.<\/p>\n<p class=\"\" data-start=\"2003\" data-end=\"2055\">To request access:<\/p>\n<p class=\"\" data-start=\"2057\" data-end=\"2128\">\ud83d\udc49 <strong data-start=\"2060\" data-end=\"2094\"><a class=\"\" href=\"https:\/\/aka.ms\/jaz-privatepreview\" rel=\"noopener\" data-start=\"2062\" data-end=\"2092\">Submit your interest here<\/a><\/strong><\/p>\n<p class=\"\" data-start=\"2130\" data-end=\"2197\">Participants in the Private Preview will receive access to jaz via easily installed <strong>standalone Linux packages <\/strong>for container images of the Microsoft Build of OpenJDK and Eclipse Temurin (for Java 8). Customers will have direct communication with our engineering and product teams to further enhance the tool to fit their needs. For a sneak peek, you can read the <a href=\"http:\/\/learn.microsoft.com\/java\/jaz\/overview\">documentation<\/a>.<\/p>\n<h2 class=\"\" data-start=\"2468\" data-end=\"2482\">Our Roadmap<\/h2>\n<p class=\"\" data-start=\"2484\" data-end=\"2697\">Our long-term vision for jaz includes <strong data-start=\"2522\" data-end=\"2552\">adaptive JVM configuration<\/strong> based on telemetry and usage patterns, helping developers achieve optimal performance across all Azure services.<\/p>\n<ul dir=\"auto\">\n<li>\u2699\ufe0f JVM Configuration Profiles<\/li>\n<li>\ud83d\udce6 AppCDS Support<\/li>\n<li>\ud83d\udce6 Leyden Support<\/li>\n<li>\ud83d\udd04 Continuous Tuning<\/li>\n<li>\ud83d\udcca Share telemetry through Prometheus<\/li>\n<\/ul>\n<p class=\"\" data-start=\"2484\" data-end=\"2697\">We\u2019re excited to work with the Java community to shape this tool. Your feedback will be critical in helping us deliver a smarter, cloud-native Java runtime experience on Azure.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Optimizing JVM Configuration for Azure Deployments Tuning the Java Virtual Machine (JVM) for cloud deployments is notoriously challenging. Over 30% of developers tend to deploy Java workloads with no JVM configuration at all, therefore relying on the default settings of the HotSpot JVM. The default settings in OpenJDK are intentionally conservative, designed to work across [&hellip;]<\/p>\n","protected":false},"author":8937,"featured_media":232231,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-232091","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java"],"acf":[],"blog_post_summary":"<p>Optimizing JVM Configuration for Azure Deployments Tuning the Java Virtual Machine (JVM) for cloud deployments is notoriously challenging. Over 30% of developers tend to deploy Java workloads with no JVM configuration at all, therefore relying on the default settings of the HotSpot JVM. The default settings in OpenJDK are intentionally conservative, designed to work across [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/posts\/232091","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/users\/8937"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/comments?post=232091"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/posts\/232091\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/media\/232231"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/media?parent=232091"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/categories?post=232091"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/tags?post=232091"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}