{"id":93313,"date":"2026-05-20T20:02:54","date_gmt":"2026-05-20T20:02:54","guid":{"rendered":"https:\/\/www.azul.com\/?post_type=article&#038;p=93313"},"modified":"2026-05-20T20:02:58","modified_gmt":"2026-05-20T20:02:58","slug":"warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify","status":"publish","type":"article","link":"https:\/\/www.azul.com\/zh-hans\/articles\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\/","title":{"rendered":"Warm Up Fast, Run Lean: Vertical Scaling for Java on Kubernetes with Azul Prime and\u00a0Kedify"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Autoscaling on Kubernetes has evolved significantly, but many production systems still rely on reactive scaling based on CPU and memory&nbsp;utilization. The issue is that resource metrics often&nbsp;lag behind&nbsp;real demand. By the time the CPU rises, users may already be experiencing unacceptable latency.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For most real services, horizontal scaling should be driven by proactive workload signals such as request rate, concurrency, or queue depth, rather than raw CPU alone. To learn more about this, see&nbsp;<a href=\"https:\/\/kedify.io\/resources\/blog\/autoscaling-delay-resource-based-hpa-vs-proactive-metrics\" target=\"_blank\" rel=\"noreferrer noopener\">this&nbsp;post<\/a>&nbsp;on autoscaling&nbsp;delay&nbsp;and proactive metrics.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vertical scaling is not a replacement for horizontal scaling. It is a complement. Horizontal scaling determines how many replicas you need. Vertical scaling\u00a0determines\u00a0how much CPU and memory each replica should have at\u00a0different phases\u00a0of its lifecycle.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In this post, we focus on a common vertical scaling challenge:&nbsp;<strong>Java warm-up<\/strong>.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"84\" class=\"wp-image-93362\" style=\"width: 150px;\" src=\"https:\/\/azul.imgix.net\/wp-content\/uploads\/Image-1-V2-scaled.png?auto=format&crop=faces,entropy&fit=max&q=80&w=739&s=9c9aec3269847bb00fdce6bae81d528a\" alt=\"\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-why-jvm-warmup-and-steady-state-should-not-share-the-same-resource-profile\"><a name=\"whyjvmwarmupandsteadystateshouldnotsharethesameresourceprofile\"><\/a>Why JVM Warmup and Steady State Should Not Share the Same Resource Profile<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">One of the key concepts of a JVM, so called Just-In-Time (JIT) compilation, is the ability to continuously optimize the source code based on the actual data being processed and code paths being executed. The benefit of this approach, compared to static code compilation in programming languages like C\/C++, is that it\u00a0ultimately yields\u00a0higher peak performance, or from the opposite angle, needs\u00a0less\u00a0resources to handle the same load.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Due to the JIT compilation, Java Virtual Machines, and thus Java applications, do not have a single stable resource footprint during the whole lifecycle of the application. In simple terms, the application starts \u201cslow\u201d,&nbsp;then is continuously optimized by the JIT compiler until it reaches the \u201csteady state\u201d where the application is running in fully optimized machine code, showing the best possible throughput and latency. The part of getting to \u201csteady state\u201d is referred to as&nbsp;<strong>warm-up<\/strong>&nbsp;and the fundamental trade-off is that the JIT compiler consumes (one time,&nbsp;typically) extra CPU to perform the optimizations.&nbsp;<\/p>\n\n\n\n<h6 class=\"wp-block-heading\" id=\"h-diagram-nbsp-1-relationship-nbsp-between-application-lifecycle-cpu-spend-by-the-jit-compiler-nbsp-and-performance\"><strong>Diagram&nbsp;#1: Relationship&nbsp;between application lifecycle, CPU spend by the JIT compiler,&nbsp;and performance<\/strong><\/h6>\n\n\n\n<p class=\"wp-block-paragraph\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"84\" class=\"wp-image-93368\" style=\"width: 150px;\" src=\"https:\/\/azul.imgix.net\/wp-content\/uploads\/Image-2-1-scaled.png?auto=format&crop=faces,entropy&fit=max&q=80&w=739&s=3894c42765e21a1cc44c4d8df8c979a5\" alt=\"\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Warm-up happens every time the application is newly started. In the modern Kubernetes world, this is more than common&nbsp;\u2013&nbsp;horizontal autoscaling, spawning new instances and stopping the unnecessary ones dynamically based on load, has become the new standard of running things cost efficiently.&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you size a Kubernetes&nbsp;<a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/pods\/\" target=\"_blank\" rel=\"noreferrer noopener\">pod<\/a>&nbsp;only for steady state usage, warm-up takes longer. The service may begin receiving traffic while still cold (code is not fully optimized yet) and, even worse, the service is competing for CPU with the JIT compiler. Together, this often leads to unstable latency and poor early performance.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On the other hand,&nbsp;allocating&nbsp;enough CPU permanently to comfortably handle the warm-up phase wastes cluster capacity.&nbsp;It\u2019s&nbsp;common that the container&nbsp;utilizes&nbsp;almost all&nbsp;of the available CPU just in the first few minutes (during warm-up), but when&nbsp;steady&nbsp;state is reached, the traffic can be easily handled with,&nbsp;e.g.,&nbsp;50% of the available CPU. In summary, this leads to overprovisioning and in the end,&nbsp;waste&nbsp;of money.&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The right model is simple and intuitive:&nbsp;<strong>allocate&nbsp;more CPU during warm-up, then reduce the allocation once the JVM is fully optimized<\/strong>.&nbsp;&nbsp;<\/p>\n\n\n\n<h6 class=\"wp-block-heading\" id=\"h-diagram-2-warm-up-phase-vs-steady-state\"><strong>Diagram #2: Warm-up phase vs steady state<\/strong><\/h6>\n\n\n\n<p class=\"wp-block-paragraph\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"84\" class=\"wp-image-93374\" style=\"width: 150px;\" src=\"https:\/\/azul.imgix.net\/wp-content\/uploads\/Image-3-1-scaled.png?auto=format&crop=faces,entropy&fit=max&q=80&w=739&s=d624f67d80430309f25ce340c3f5151f\" alt=\"\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Azul Zing, the JVM at the heart of Azul Prime, is the first JVM on the market to integrate directly with&nbsp;Kedify, making this kind of lifecycle-aware right-sizing seamless and trivial to use.&nbsp;<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-style-default is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>What is Azul Prime?<\/strong>&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Azul Prime is a high-performance JVM platform and a drop-in replacement for OpenJDK&nbsp;HotSpot: same&nbsp;APIs, same TCK compliance, no application changes. Three orthogonal performance technologies set it apart:&nbsp;&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>LLVM-based Falcon JIT compiler produces more aggressively optimized machine code than&nbsp;HotSpot\u2019s&nbsp;C2;&nbsp;&nbsp;<\/li>\n\n\n\n<li>ReadyNow&nbsp;addresses the warm-up problem by persisting JIT profile data between runs, so applications start&nbsp;optimized&nbsp;rather than learning from scratch each time.&nbsp;&nbsp;<\/li>\n\n\n\n<li>C4 (Continuously Concurrent Compacting Collector) is a truly&nbsp;pauseless&nbsp;garbage collector that scales to multi-terabyte heaps without stop-the-world pauses; and&nbsp;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Combined with the optional Optimizer Hub service (Cloud Native Compiler offloads JIT compilation to a dedicated service;&nbsp;ReadyNow&nbsp;Orchestrator manages profiles across an entire JVM fleet), Azul Prime targets two complementary goals: better, more predictable performance for latency-sensitive Java workloads (financial trading, e-commerce, real-time analytics, Kafka pipelines) and meaningful infrastructure savings on Java workloads more generally, since the same load runs on materially fewer cores.&nbsp;<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-podresourceprofiles-vertical-scaling-without-restarts\"><a name=\"podresouceprofilesverticalscalingwithoutrestarts\"><\/a>PodResourceProfiles: Vertical Scaling Without Restarts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Kubernetes introduced&nbsp;<a href=\"https:\/\/kubernetes.io\/blog\/2023\/05\/12\/in-place-pod-resize-alpha\/\" target=\"_blank\" rel=\"noreferrer noopener\">In Place Pod Resource Resize<\/a>&nbsp;in v1.27, enabled by default since v1.33. This allows CPU and memory requests and limits to be updated for a running container without restarting the pod.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kedify&nbsp;<a href=\"https:\/\/docs.kedify.io\/features\/pod-resource-profiles\/\" target=\"_blank\" rel=\"noreferrer noopener\">PodResourceProfiles<\/a>&nbsp;(PRPs) build on top of this capability.&nbsp;<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>What is&nbsp;Kedify?<\/strong>&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kedify&nbsp;is an enterprise autoscaling platform built on KEDA, designed to make Kubernetes scaling predictable, efficient, and&nbsp;production-ready.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Key capabilities include:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Proactive and predictive autoscaling<\/strong>&nbsp;based on real workload signals (HTTP\/gRPC, queues, custom metrics), not lagging CPU&nbsp;<\/li>\n\n\n\n<li><strong>Multi-cluster autoscaling and scheduling<\/strong>, managing workloads across clusters from a single control plane&nbsp;<\/li>\n\n\n\n<li><strong>Dynamic&nbsp;right-sizing<\/strong>, combining real-time vertical autoscaling with lifecycle-aware resource adjustments&nbsp;<\/li>\n\n\n\n<li><strong>Advanced workload support<\/strong>, including HTTP scale-to-zero and GPU\/LLM inference scaling&nbsp;<\/li>\n\n\n\n<li><strong>Enterprise-ready control and visibility<\/strong>, including multi-tenant KEDA management, FinOps insights, and seamless integration with existing observability stacks&nbsp;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Built by the creators of KEDA,&nbsp;Kedify&nbsp;helps teams improve performance and reliability while reducing infrastructure costs by&nbsp;<strong>30\u201340%<\/strong>&nbsp;through smarter scaling.&nbsp;<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">A&nbsp;PodResourceProfile&nbsp;lets you define a future resource adjustment triggered by workload lifecycle events, such as when a container becomes ready.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This unlocks a lifecycle-aware vertical scaling pattern:&nbsp;allocate&nbsp;extra CPU only during warm-up, then automatically shrink back once the JVM is&nbsp;optimized. This is vertical autoscaling driven by workload lifecycle, not static&nbsp;requests&nbsp;or manual tuning.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Note: While warm-up resizing is a common use case, PRPs can also be triggered by other lifecycle or <a href=\"https:\/\/kedify.io\/resources\/blog\/shrink-pods-when-traffic-sleeps\" target=\"_blank\" rel=\"noreferrer noopener\">demand signals<\/a>, enabling vertical scale-up&nbsp;even when horizontal scaling is con=strained or replica count cannot increase. If we want to achieve fast vertical scaling based on the actual usage and not predefined triggers, we can&nbsp;leverage&nbsp;<a href=\"https:\/\/kedify.io\/resources\/blog\/pod-resource-autoscaler-fast-vertical-scaling\" target=\"_blank\" rel=\"noreferrer noopener\">PodResourceAutoscalers<\/a>&nbsp;and even combine them with PRPs.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-measuring-jvm-warm-up-using-azul-prime-jmx-metrics\"><a name=\"measuringjvmwarmupusingazulprimejmxmetrics\"><\/a>Measuring JVM Warm-up Using Azul Prime JMX Metrics<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To resize resources correctly, we need a real signal that warm-up is complete.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Azul Prime exposes compilation activity through JMX (<a href=\"https:\/\/docs.azul.com\/prime\/ZingMXBeans_javadoc\/com\/azul\/zing\/management\/CompilationMXBean.html#getTotalOutstandingCompiles()\" target=\"_blank\" rel=\"noreferrer noopener\">docs<\/a>):&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Bean:&nbsp;com.azul.zing:type=Compilation&nbsp;\nAttribute:&nbsp;TotalOutstandingCompiles&nbsp;<\/code><\/pre>\n\n\n\n\n\n\n\n<p class=\"wp-block-paragraph\">This metric&nbsp;represents&nbsp;the depth of the compilation&nbsp;queue,&nbsp;in other words how much work is left to be&nbsp;optimized. Early in&nbsp;startup&nbsp;it is high. As the JVM finishes&nbsp;optimizing, the&nbsp;compilation&nbsp;queue depth drops and keeps low.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We use this metric as a readiness gate.&nbsp;<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-code-snippet-jmx-based-warm-up-probe-nbsp\"><strong>Code Snippet: JMX Based Warm-up Probe<\/strong>&nbsp;<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Below is the core logic of the readiness probe:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>bean&nbsp;=&nbsp;\"com.azul.zing:type=Compilation\"&nbsp;\nattribute&nbsp;=&nbsp;\"TotalOutstandingCompiles\"&nbsp;\n\nvalue&nbsp;=&nbsp;conn.query(&#91;JMXQuery(bean,&nbsp;attribute=attribute)])&#91;0].value&nbsp;\n\nif&nbsp;value&nbsp;&lt;&nbsp;threshold:&nbsp;\n conn.invoke_operation(bean,&nbsp;\"finishWarm-up\",&nbsp;&#91;])&nbsp;\n sys.exit(0)&nbsp;\nelse:&nbsp;\n sys.exit(2)&nbsp;<\/code><\/pre>\n\n\n\n\n\n\n\n\n\n<p class=\"wp-block-paragraph\">During warm-up, output looks like this:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>786&nbsp;\nTotalOutstandingCompiles&nbsp;still&nbsp;above&nbsp;threshold:&nbsp;786&nbsp;&gt;=&nbsp;500&nbsp;<\/code><\/pre>\n\n\n\n\n\n<p class=\"wp-block-paragraph\">Only when the queue depth falls (and stays) below the&nbsp;threshold&nbsp;Kubernetes considers the pod ready. This avoids routing traffic to a JVM that is technically running but not yet&nbsp;optimized.&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can notice an&nbsp;additional&nbsp;small but important detail &#8211; calling a method \u201cfinishWarm-up\u201d through JMX. This is another part of the unique tight integration specific to Azul Zing JVM.&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When a JVM is started (HotSpot&nbsp;included), it sizes its internal thread pools (e.g.&nbsp;for JIT compiler, garbage collector etc.) according to the available CPU and this sizing is done at startup of the JVM. But&nbsp;that\u2019s&nbsp;no longer suitable for this case of vertical (down)scaling. If we reduced the available CPU post warm-up, but kept the original amount of&nbsp;e.g.&nbsp;compiler threads, a sudden spike in JIT activity (commonly caused by&nbsp;e.g.&nbsp;workload type shift) could cause the JVM to consume an inadequate amount of CPU,&nbsp;again affecting the application latency.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">By calling Zing\u2019s \u201cfinishWarm-up\u201d method,&nbsp;Kedify&nbsp;is effectively signaling \u201clet\u2019s scale down\u201d,&nbsp;making the JVM to properly adjust the internal thread counts.&nbsp;<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-demo-workload-forcing-heavy-warm-up-nbsp\"><strong>Demo Workload: Forcing Heavy Warm-up<\/strong>&nbsp;<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">To&nbsp;demonstrate&nbsp;the effect clearly, we used the&nbsp;<a href=\"https:\/\/renaissance.dev\/\" target=\"_blank\" rel=\"noreferrer noopener\">Renaissance<\/a>&nbsp;benchmarking suite from MIT, specifically the finagle-http benchmark.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This workload generates significant JIT activity by running many small HTTP requests against a Finagle server. It creates exactly the kind of warm-up pressure seen in real JVM services.&nbsp;<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-step-1-start-with-elevated-cpu-nbsp\"><strong>Step 1: Start With Elevated CPU<\/strong>&nbsp;<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">We deploy the workload with a high&nbsp;initial&nbsp;CPU allocation:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>resources:&nbsp;\n requests:&nbsp;\n cpu:&nbsp;10&nbsp;\n limits:&nbsp;\n cpu:&nbsp;10&nbsp;<\/code><\/pre>\n\n\n\n\n\n<p class=\"wp-block-paragraph\">This ensures the JVM has enough&nbsp;compute&nbsp;to get through the compilations quickly.&nbsp;&nbsp;<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-step-2-delay-readiness-until-warm-up-completes-nbsp\"><strong>Step 2: Delay Readiness Until Warm-up Completes<\/strong>&nbsp;<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">We add a readiness (or it could be a startup probe) that queries the&nbsp;compilation&nbsp;queue depth through JMX. While the queue is still above the threshold, readiness fails and Kubernetes will not route traffic to the pod.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Once compilation activity settles, readiness succeeds and the pod becomes eligible for traffic.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It is important to note that probes only control traffic and restart behavior. Startup probes can delay restarts, but&nbsp;PodResourceProfiles&nbsp;are what&nbsp;actually resize&nbsp;CPU requests and limits in place once warm-up is finished.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Note: In the real world, the vast majority of JIT compilations\u00a0is\u00a0actually triggered once the load is being handled. So how can you finish warm-up before the readiness probe succeeds? First, the vertical scaling (and calling \u201cfinishWarm-up\u201d) is not tied to a readiness\u00a0probe,\u00a0it\u2019s\u00a0like this for the purpose of the demo. Therefore, you can succeed in a readiness probe, handle traffic for some time with extended\u00a0resources\u00a0and scale down later. While this approach already provides value (getting through warm-up\u00a0faster and having additional resources for the JIT compilation, minimizing the impact on application latency), it can be done even better.\u00a0<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With Azul Zing JVM\u2019s\u00a0ReadyNow\u00a0technology (<a href=\"https:\/\/docs.azul.com\/prime\/Use-ReadyNow\" target=\"_blank\" rel=\"noreferrer noopener\">docs<\/a>), you can take this a step further. ReadyNow persists the compiler profile from previous\u00a0runs of the application, so a freshly started JVM\u00a0doesn\u2019t\u00a0have to discover its hot code paths from\u00a0scratch,\u00a0it can pre-compile the methods it knows will be needed, before the first request even arrives. Combined with\u00a0ReadyNow\u00a0Orchestrator, which collects and distributes optimization profiles across an entire fleet of JVMs, you can realistically reach near-steady-state performance during the warm-up window itself. By the time the readiness probe succeeds and traffic arrives, the JVM is genuinely ready to handle it at full speed, no early latency tax.\u00a0<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-step-3-shrink-cpu-automatically-nbsp-with-nbsp-podresourceprofiles-nbsp\"><strong>Step 3: Shrink CPU Automatically&nbsp;with&nbsp;PodResourceProfiles<\/strong>&nbsp;<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Once readiness succeeds,&nbsp;Kedify&nbsp;applies a&nbsp;PodResourceProfile:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color has-link-color wp-elements-1\"><code>apiVersion:&nbsp;keda.kedify.io\/v1alpha1\nkind:&nbsp;PodResourceProfile&nbsp;\nmetadata:&nbsp;\n name:&nbsp;heavy-workload&nbsp;\nspec:&nbsp;\n target:&nbsp;\n kind:&nbsp;deployment&nbsp;\n name:&nbsp;heavy-workload&nbsp;\n containerName:&nbsp;main&nbsp;\n trigger:&nbsp;\n after:&nbsp;containerReady&nbsp;\n delay:&nbsp;0s&nbsp;\n newResources:&nbsp;\n requests:&nbsp;\n cpu:&nbsp;\"4\"&nbsp;\n limits:&nbsp;\n cpu:&nbsp;\"4\"&nbsp;<\/code><\/pre>\n\n\n\n\n\n<p class=\"wp-block-paragraph\">This transitions the pod from warm-up sizing to steady state sizing, without&nbsp;restart.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can&nbsp;observe&nbsp;the change live:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl&nbsp;get&nbsp;po&nbsp;-lapp=heavy-workload&nbsp;\\&nbsp;\n -ojsonpath=\"{.items&#91;*].spec.containers&#91;?(.name=='main')].resources}\"&nbsp;|&nbsp;jq&nbsp;<\/code><\/pre>\n\n\n\n\n\n<h6 class=\"wp-block-heading\" id=\"h-diagram-3-resource-transition-timeline-nbsp\"><strong>Diagram #3: Resource transition timeline<\/strong>&nbsp;<\/h6>\n\n\n\n<p class=\"wp-block-paragraph\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"84\" class=\"wp-image-93380\" style=\"width: 150px;\" src=\"https:\/\/azul.imgix.net\/wp-content\/uploads\/Image-4-2-scaled.png?auto=format&crop=faces,entropy&fit=max&q=80&w=739&s=07e91025e7e8553103fdb5a66db5fd4e\" alt=\"\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-metrics-what-this-achieves\"><a name=\"metricswhatthisachieves\"><\/a>Metrics: What This Achieves<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">PodResourceProfiles&nbsp;let&nbsp;you treat JVM warm-up as a short lifecycle phase that deserves temporary compute, and then automatically return to a lean steady state footprint.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With Azul Prime, compilation activity creates an early CPU burst. PRPs make that burst explicit:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Extra CPU is available only while the JVM is still compiling&nbsp;<\/li>\n\n\n\n<li>Readiness stays failing until warm-up is truly complete&nbsp;<\/li>\n\n\n\n<li>Resources shrink&nbsp;immediately&nbsp;once the pod is safe to serve traffic&nbsp;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Warm-up duration is workload dependent, but PRPs ensure you do not pay for warm-up CPU forever. Once optimization finishes, allocation returns to the steady state footprint automatically.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The&nbsp;outcome is straightforward:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Faster warm-up, so new replicas become useful sooner during rollouts or scale-out&nbsp;<\/li>\n\n\n\n<li>Better steady state&nbsp;efficiency, because&nbsp;CPU is not reserved permanently&nbsp;<\/li>\n\n\n\n<li>More reliable traffic&nbsp;gating, because&nbsp;pods only enter rotation once truly optimized&nbsp;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">A typical transition looks like:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Warm-up allocation: 10 CPU cores&nbsp;<\/li>\n\n\n\n<li>Steady state allocation: 4 CPU cores&nbsp;<\/li>\n\n\n\n<li>Capacity reclaimed after warm-up: ~60%&nbsp;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The exact numbers depend on workload behavior, but the operational pattern is consistent: fast warm-up, readiness-gated traffic, and lean steady state sizing.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-how-vertical-and-horizontal-scaling-work-together\"><a name=\"howverticalandhorizontalscalingworktogether\"><\/a>How Vertical and Horizontal Scaling Work Together<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">PodResourceProfiles&nbsp;solve the per container sizing problem, while horizontal autoscaling solves the replica count problem. They work best together.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Horizontal scaling adds new replicas early based on proactive demand signals such as request rate or message queue depth. This ensures capacity is created before CPU saturation becomes visible.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Each new Java pod still needs to warm up.&nbsp;PodResourceProfiles&nbsp;apply vertical resizing to every newly created pod, giving it elevated CPU during JVM compilation and optimization. Once the pod is truly ready, resources are automatically reduced to the steady state footprint.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In practice, the flow looks like this:&nbsp;<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Scale out horizontally based on workload metrics (requests per second, message queue depth).<\/li>\n\n\n\n<li>Apply PRP vertical CPU boost during warm-up for each new pod.<\/li>\n\n\n\n<li>Shrink resources after warm-up to avoid long lived overprovisioning&nbsp;.<\/li>\n\n\n\n<li>Run the real workload efficiently across multiple optimized replicas.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"84\" class=\"wp-image-93386\" style=\"width: 150px;\" src=\"https:\/\/azul.imgix.net\/wp-content\/uploads\/Image-5-1-scaled.png?auto=format&crop=faces,entropy&fit=max&q=80&w=739&s=5202a8c01a0ddbd87a0da47a64ef6a14\" alt=\"\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-try-it-yourself\"><a name=\"tryityourself\"><\/a>Try It Yourself<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To experiment with this approach:&nbsp;<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.azul.com\/prime-trial\/\" target=\"_blank\" rel=\"noreferrer noopener\">Get Azul Prime<\/a>.&nbsp;&nbsp;<\/li>\n\n\n\n<li>Enable In Place Pod Resource Resize (default in Kubernetes v1.33+).&nbsp;<\/li>\n\n\n\n<li><a href=\"https:\/\/docs.kedify.io\/installation\" target=\"_blank\" rel=\"noreferrer noopener\">Install<\/a>&nbsp;Kedify&nbsp;on your Kubernetes cluster.&nbsp;<\/li>\n\n\n\n<li>Deploy a workload with a warm-up aware readiness or startup probe.&nbsp;<\/li>\n\n\n\n<li>Apply a&nbsp;PodResourceProfile&nbsp;to shrink resources after warm-up.&nbsp;<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">This gives you a declarative way to treat warm-up as a&nbsp;first class&nbsp;lifecycle phase rather than a permanent sizing decision.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-closing-thoughts\"><a name=\"closingthoughts\"><\/a>Closing Thoughts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Java warm-up is a distinct phase with distinct CPU requirements. Treating pod resources as static forces teams into a tradeoff between overprovisioning and degraded early performance.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With Azul Zing exposing JIT compilation progress,&nbsp;enabling reacting to changed resources and&nbsp;Kedify&nbsp;PodResourceProfiles&nbsp;enabling in place vertical scaling, Kubernetes can&nbsp;allocate&nbsp;extra CPU during warm-up and release it once the pod is truly ready. The result is faster startup, more stable latency, and better cluster efficiency in&nbsp;steady&nbsp;state.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you run JVM services on Kubernetes, this is a pattern worth trying on a workload with noticeable warm-up behavior. Reach out to the&nbsp;Kedify&nbsp;team if you want&nbsp;help&nbsp;benchmarking or applying&nbsp;PodResourceProfiles&nbsp;in production.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Warm&nbsp;up fast. Serve traffic only when ready. Run lean afterward.<\/strong>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Learn how to accelerate Java warm-up on Kubernetes with Azul Prime &#038; Kedify.<\/p>\n","protected":false},"author":178,"featured_media":93356,"template":"","resource_categories":[774],"industry":[],"product":[280],"role":[43,44,57,61,62,64,69,282,710],"resource_topic":[273,775,776,777],"class_list":["post-93313","article","type-article","status-publish","has-post-thumbnail","hentry","resource_categories-java-warmup","product-prime","role-developer","role-cio-it","role-architect","role-cto","role-devops","role-head-of-engineering","role-vp-engineering","role-it-decision-maker","role-devops-operations","resource_topic-performance","resource_topic-java-warmup","resource_topic-kubernetes","resource_topic-kedify"],"acf":{"article_smart_summary":"<p><b><span data-contrast=\"auto\">In this post you will learn:<\/span><\/b><span data-ccp-props=\"{&quot;335559738&quot;:200,&quot;335559739&quot;:60}\">\u00a0<\/span><\/p>\n<ul>\n<li aria-setsize=\"-1\" data-leveltext=\"\u2022\" data-font=\"\" data-listid=\"8\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\u2022&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}\" data-aria-posinset=\"1\" data-aria-level=\"1\"><em>Why JVM warmup and steady state\u00a0require\u00a0different CPU resource profiles\u00a0<\/em><\/li>\n<li aria-setsize=\"-1\" data-leveltext=\"\u2022\" data-font=\"\" data-listid=\"8\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\u2022&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}\" data-aria-posinset=\"1\" data-aria-level=\"1\"><em>How\u00a0to\u00a0provide a precise warmup-completion signal\u00a0with\u00a0Azul\u00a0Prime\u00a0<\/em><\/li>\n<li aria-setsize=\"-1\" data-leveltext=\"\u2022\" data-font=\"\" data-listid=\"8\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\u2022&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}\" data-aria-posinset=\"1\" data-aria-level=\"1\"><em>How\u00a0Kedify\u2018s\u00a0PodResourceProfiles\u00a0enable in-place vertical scaling without pod restarts\u00a0<\/em><\/li>\n<li aria-setsize=\"-1\" data-leveltext=\"\u2022\" data-font=\"\" data-listid=\"8\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\u2022&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}\" data-aria-posinset=\"1\" data-aria-level=\"1\"><em>How to combine\u00a0Azul\u00a0Prime\u2018s\u00a0ReadyNow\u00a0technology with lifecycle-triggered resource resizing\u00a0<\/em><\/li>\n<li aria-setsize=\"-1\" data-leveltext=\"\u2022\" data-font=\"\" data-listid=\"8\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\u2022&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}\" data-aria-posinset=\"1\" data-aria-level=\"1\"><em>How vertical and horizontal autoscaling complement each other for Java workloads on Kubernetes\u00a0and\u00a0how\u00a0that\u2018s\u00a0seamlessly\u00a0enabled\u00a0with\u00a0Kedify\u00a0<\/em><\/li>\n<li aria-setsize=\"-1\" data-leveltext=\"\u2022\" data-font=\"\" data-listid=\"8\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\u2022&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}\" data-aria-posinset=\"1\" data-aria-level=\"1\"><em>And finally,\u00a0how\u00a0all of\u00a0the above results in lower infrastructure cost while having consistent performance during\u00a0scaling.\u00a0<\/em><\/li>\n<\/ul>\n","article_sidebar_nav_items":[{"link":{"title":"Why JVM Warmup and Steady State Should Not Share the Same Resource Profile","url":"#whyjvmwarmupandsteadystateshouldnotsharethesameresourceprofile","target":""}},{"link":{"title":"PodResourceProfiles: Vertical Scaling Without Restarts","url":"#podresouceprofilesverticalscalingwithoutrestarts","target":""}},{"link":{"title":"Measuring JVM Warm-up Using Azul Prime JMX Metrics","url":"#measuringjvmwarmupusingazulprimejmxmetrics","target":""}},{"link":{"title":"Metrics: What This Achieves","url":"#metricswhatthisachieves","target":""}},{"link":{"title":"How Vertical and Horizontal Scaling Work Together","url":"#howverticalandhorizontalscalingworktogether","target":""}},{"link":{"title":"Try It Yourself","url":"#tryityourself","target":""}},{"link":{"title":"Closing Thoughts","url":"#closingthoughts","target":""}}],"article_cta":{"link":{"type":"url","value":"https:\/\/www.azul.com\/products\/prime\/","url":"https:\/\/www.azul.com\/products\/prime\/","name":"https:\/\/www.azul.com\/products\/prime\/","title":"Learn More","target":""},"appearance":"solid","color":"","show_arrow":false}},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.7 (Yoast SEO v28.7) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Warm Up Fast, Run Lean: Vertical Scaling for Java on Kubernetes with Azul Prime and\u00a0Kedify - Azul | Better Java Performance, Superior Java Support<\/title>\n<meta name=\"description\" content=\"Learn how Azul Prime and Kedify enable lifecycle-aware vertical scaling for Java on Kubernetes, cutting infrastructure costs during JVM warmup and steady state.\" \/>\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.azul.com\/articles\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Warm Up Fast, Run Lean: Vertical Scaling for Java on Kubernetes with Azul Prime and\u00a0Kedify\" \/>\n<meta property=\"og:description\" content=\"Learn how Azul Prime and Kedify enable lifecycle-aware vertical scaling for Java on Kubernetes, cutting infrastructure costs during JVM warmup and steady state.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.azul.com\/articles\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\/\" \/>\n<meta property=\"og:site_name\" content=\"Azul | Better Java Performance, Superior Java Support\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/AzulSystemsInc\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-20T20:02:58+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.azul.com\/wp-content\/uploads\/Vertical-Scaling-for-Java_Banner-scaled.png?wsr\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1440\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@azulsystems\" \/>\n<meta name=\"twitter:label1\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data1\" content=\"10\u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"TechArticle\",\"@id\":\"https:\\\/\\\/www.azul.com\\\/articles\\\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.azul.com\\\/articles\\\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\\\/\"},\"author\":{\"name\":\"Jiri Holusa &amp; Zbynek Roubalik\",\"@id\":\"https:\\\/\\\/www.azul.com\\\/#\\\/schema\\\/person\\\/60ab441723331f2ccf76298dc78d8744\"},\"headline\":\"Warm Up Fast, Run Lean: Vertical Scaling for Java on Kubernetes with Azul Prime and\u00a0Kedify\",\"datePublished\":\"2026-05-20T20:02:54+00:00\",\"dateModified\":\"2026-05-20T20:02:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.azul.com\\\/articles\\\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\\\/\"},\"wordCount\":2474,\"publisher\":{\"@id\":\"https:\\\/\\\/www.azul.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.azul.com\\\/articles\\\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.azul.com\\\/wp-content\\\/uploads\\\/Vertical-Scaling-for-Java_Banner-scaled.png?wsr\",\"inLanguage\":\"zh-CN\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.azul.com\\\/articles\\\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\\\/\",\"url\":\"https:\\\/\\\/www.azul.com\\\/articles\\\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\\\/\",\"name\":\"Warm Up Fast, Run Lean: Vertical Scaling for Java on Kubernetes with Azul Prime and\u00a0Kedify - Azul | Better Java Performance, Superior Java Support\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.azul.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.azul.com\\\/articles\\\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.azul.com\\\/articles\\\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.azul.com\\\/wp-content\\\/uploads\\\/Vertical-Scaling-for-Java_Banner-scaled.png?wsr\",\"datePublished\":\"2026-05-20T20:02:54+00:00\",\"dateModified\":\"2026-05-20T20:02:58+00:00\",\"description\":\"Learn how Azul Prime and Kedify enable lifecycle-aware vertical scaling for Java on Kubernetes, cutting infrastructure costs during JVM warmup and steady state.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.azul.com\\\/articles\\\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\\\/#breadcrumb\"},\"inLanguage\":\"zh-CN\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.azul.com\\\/articles\\\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-CN\",\"@id\":\"https:\\\/\\\/www.azul.com\\\/articles\\\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.azul.com\\\/wp-content\\\/uploads\\\/Vertical-Scaling-for-Java_Banner-scaled.png?wsr\",\"contentUrl\":\"https:\\\/\\\/www.azul.com\\\/wp-content\\\/uploads\\\/Vertical-Scaling-for-Java_Banner-scaled.png?wsr\",\"width\":2560,\"height\":1440},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.azul.com\\\/articles\\\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.azul.com\\\/zh-hans\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Warm Up Fast, Run Lean: Vertical Scaling for Java on Kubernetes with Azul Prime and\u00a0Kedify\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.azul.com\\\/#website\",\"url\":\"https:\\\/\\\/www.azul.com\\\/\",\"name\":\"Azul | Better Java Performance, Superior Java Support\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.azul.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.azul.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"zh-CN\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.azul.com\\\/#organization\",\"name\":\"Azul\",\"alternateName\":\"Azul Systems\",\"url\":\"https:\\\/\\\/www.azul.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-CN\",\"@id\":\"https:\\\/\\\/www.azul.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.azul.com\\\/wp-content\\\/uploads\\\/2021\\\/01\\\/logo.svg?wsr\",\"contentUrl\":\"https:\\\/\\\/www.azul.com\\\/wp-content\\\/uploads\\\/2021\\\/01\\\/logo.svg?wsr\",\"width\":112,\"height\":48,\"caption\":\"Azul\"},\"image\":{\"@id\":\"https:\\\/\\\/www.azul.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/AzulSystemsInc\",\"https:\\\/\\\/x.com\\\/azulsystems\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCSoJZa--HhjV9iXtbHUmm8A\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/azul-systems\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.azul.com\\\/#\\\/schema\\\/person\\\/60ab441723331f2ccf76298dc78d8744\",\"name\":\"Jiri Holusa &amp; Zbynek Roubalik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-CN\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/03a0b94666f3c31248f49e0a9d8625f2fb78dd0015d3a678c8b36ef9192e51bf?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/03a0b94666f3c31248f49e0a9d8625f2fb78dd0015d3a678c8b36ef9192e51bf?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/03a0b94666f3c31248f49e0a9d8625f2fb78dd0015d3a678c8b36ef9192e51bf?s=96&d=mm&r=g\",\"caption\":\"Jiri Holusa &amp; Zbynek Roubalik\"},\"sameAs\":[\"https:\\\/\\\/kedify.io\\\/\"],\"url\":\"https:\\\/\\\/www.azul.com\\\/zh-hans\\\/blog\\\/author\\\/zbynek-roubalik\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Warm Up Fast, Run Lean: Vertical Scaling for Java on Kubernetes with Azul Prime and\u00a0Kedify - Azul | Better Java Performance, Superior Java Support","description":"Learn how Azul Prime and Kedify enable lifecycle-aware vertical scaling for Java on Kubernetes, cutting infrastructure costs during JVM warmup and steady state.","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.azul.com\/articles\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\/","og_locale":"zh_CN","og_type":"article","og_title":"Warm Up Fast, Run Lean: Vertical Scaling for Java on Kubernetes with Azul Prime and\u00a0Kedify","og_description":"Learn how Azul Prime and Kedify enable lifecycle-aware vertical scaling for Java on Kubernetes, cutting infrastructure costs during JVM warmup and steady state.","og_url":"https:\/\/www.azul.com\/articles\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\/","og_site_name":"Azul | Better Java Performance, Superior Java Support","article_publisher":"https:\/\/www.facebook.com\/AzulSystemsInc","article_modified_time":"2026-05-20T20:02:58+00:00","og_image":[{"width":2560,"height":1440,"url":"https:\/\/www.azul.com\/wp-content\/uploads\/Vertical-Scaling-for-Java_Banner-scaled.png?wsr","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_site":"@azulsystems","twitter_misc":{"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"10\u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/www.azul.com\/articles\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\/#article","isPartOf":{"@id":"https:\/\/www.azul.com\/articles\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\/"},"author":{"name":"Jiri Holusa &amp; Zbynek Roubalik","@id":"https:\/\/www.azul.com\/#\/schema\/person\/60ab441723331f2ccf76298dc78d8744"},"headline":"Warm Up Fast, Run Lean: Vertical Scaling for Java on Kubernetes with Azul Prime and\u00a0Kedify","datePublished":"2026-05-20T20:02:54+00:00","dateModified":"2026-05-20T20:02:58+00:00","mainEntityOfPage":{"@id":"https:\/\/www.azul.com\/articles\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\/"},"wordCount":2474,"publisher":{"@id":"https:\/\/www.azul.com\/#organization"},"image":{"@id":"https:\/\/www.azul.com\/articles\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\/#primaryimage"},"thumbnailUrl":"https:\/\/www.azul.com\/wp-content\/uploads\/Vertical-Scaling-for-Java_Banner-scaled.png?wsr","inLanguage":"zh-CN"},{"@type":"WebPage","@id":"https:\/\/www.azul.com\/articles\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\/","url":"https:\/\/www.azul.com\/articles\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\/","name":"Warm Up Fast, Run Lean: Vertical Scaling for Java on Kubernetes with Azul Prime and\u00a0Kedify - Azul | Better Java Performance, Superior Java Support","isPartOf":{"@id":"https:\/\/www.azul.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.azul.com\/articles\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\/#primaryimage"},"image":{"@id":"https:\/\/www.azul.com\/articles\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\/#primaryimage"},"thumbnailUrl":"https:\/\/www.azul.com\/wp-content\/uploads\/Vertical-Scaling-for-Java_Banner-scaled.png?wsr","datePublished":"2026-05-20T20:02:54+00:00","dateModified":"2026-05-20T20:02:58+00:00","description":"Learn how Azul Prime and Kedify enable lifecycle-aware vertical scaling for Java on Kubernetes, cutting infrastructure costs during JVM warmup and steady state.","breadcrumb":{"@id":"https:\/\/www.azul.com\/articles\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\/#breadcrumb"},"inLanguage":"zh-CN","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.azul.com\/articles\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\/"]}]},{"@type":"ImageObject","inLanguage":"zh-CN","@id":"https:\/\/www.azul.com\/articles\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\/#primaryimage","url":"https:\/\/www.azul.com\/wp-content\/uploads\/Vertical-Scaling-for-Java_Banner-scaled.png?wsr","contentUrl":"https:\/\/www.azul.com\/wp-content\/uploads\/Vertical-Scaling-for-Java_Banner-scaled.png?wsr","width":2560,"height":1440},{"@type":"BreadcrumbList","@id":"https:\/\/www.azul.com\/articles\/warm-up-fast-run-lean-vertical-scaling-for-java-on-kubernetes-with-azul-prime-and-kedify\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.azul.com\/zh-hans\/"},{"@type":"ListItem","position":2,"name":"Warm Up Fast, Run Lean: Vertical Scaling for Java on Kubernetes with Azul Prime and\u00a0Kedify"}]},{"@type":"WebSite","@id":"https:\/\/www.azul.com\/#website","url":"https:\/\/www.azul.com\/","name":"Azul | Better Java Performance, Superior Java Support","description":"","publisher":{"@id":"https:\/\/www.azul.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.azul.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"zh-CN"},{"@type":"Organization","@id":"https:\/\/www.azul.com\/#organization","name":"Azul","alternateName":"Azul Systems","url":"https:\/\/www.azul.com\/","logo":{"@type":"ImageObject","inLanguage":"zh-CN","@id":"https:\/\/www.azul.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.azul.com\/wp-content\/uploads\/2021\/01\/logo.svg?wsr","contentUrl":"https:\/\/www.azul.com\/wp-content\/uploads\/2021\/01\/logo.svg?wsr","width":112,"height":48,"caption":"Azul"},"image":{"@id":"https:\/\/www.azul.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/AzulSystemsInc","https:\/\/x.com\/azulsystems","https:\/\/www.youtube.com\/channel\/UCSoJZa--HhjV9iXtbHUmm8A","https:\/\/www.linkedin.com\/company\/azul-systems"]},{"@type":"Person","@id":"https:\/\/www.azul.com\/#\/schema\/person\/60ab441723331f2ccf76298dc78d8744","name":"Jiri Holusa &amp; Zbynek Roubalik","image":{"@type":"ImageObject","inLanguage":"zh-CN","@id":"https:\/\/secure.gravatar.com\/avatar\/03a0b94666f3c31248f49e0a9d8625f2fb78dd0015d3a678c8b36ef9192e51bf?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/03a0b94666f3c31248f49e0a9d8625f2fb78dd0015d3a678c8b36ef9192e51bf?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/03a0b94666f3c31248f49e0a9d8625f2fb78dd0015d3a678c8b36ef9192e51bf?s=96&d=mm&r=g","caption":"Jiri Holusa &amp; Zbynek Roubalik"},"sameAs":["https:\/\/kedify.io\/"],"url":"https:\/\/www.azul.com\/zh-hans\/blog\/author\/zbynek-roubalik\/"}]}},"_links":{"self":[{"href":"https:\/\/www.azul.com\/zh-hans\/wp-json\/wp\/v2\/article\/93313","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.azul.com\/zh-hans\/wp-json\/wp\/v2\/article"}],"about":[{"href":"https:\/\/www.azul.com\/zh-hans\/wp-json\/wp\/v2\/types\/article"}],"author":[{"embeddable":true,"href":"https:\/\/www.azul.com\/zh-hans\/wp-json\/wp\/v2\/users\/178"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.azul.com\/zh-hans\/wp-json\/wp\/v2\/media\/93356"}],"wp:attachment":[{"href":"https:\/\/www.azul.com\/zh-hans\/wp-json\/wp\/v2\/media?parent=93313"}],"wp:term":[{"taxonomy":"resource_categories","embeddable":true,"href":"https:\/\/www.azul.com\/zh-hans\/wp-json\/wp\/v2\/resource_categories?post=93313"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.azul.com\/zh-hans\/wp-json\/wp\/v2\/industry?post=93313"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.azul.com\/zh-hans\/wp-json\/wp\/v2\/product?post=93313"},{"taxonomy":"role","embeddable":true,"href":"https:\/\/www.azul.com\/zh-hans\/wp-json\/wp\/v2\/role?post=93313"},{"taxonomy":"resource_topic","embeddable":true,"href":"https:\/\/www.azul.com\/zh-hans\/wp-json\/wp\/v2\/resource_topic?post=93313"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}