Skip to main content
Redhat Developers  Logo
  • AI

    Get started with AI

    • Red Hat AI
      Accelerate the development and deployment of enterprise AI solutions.
    • AI learning hub
      Explore learning materials and tools, organized by task.
    • AI interactive demos
      Click through scenarios with Red Hat AI, including training LLMs and more.
    • AI/ML learning paths
      Expand your OpenShift AI knowledge using these learning resources.
    • AI quickstarts
      Focused AI use cases designed for fast deployment on Red Hat AI platforms.
    • No-cost AI training
      Foundational Red Hat AI training.

    Featured resources

    • OpenShift AI learning
    • Open source AI for developers
    • AI product application development
    • Open source-powered AI/ML for hybrid cloud
    • AI and Node.js cheat sheet

    Red Hat AI Factory with NVIDIA

    • Red Hat AI Factory with NVIDIA is a co-engineered, enterprise-grade AI solution for building, deploying, and managing AI at scale across hybrid cloud environments.
    • Explore the solution
  • Learn

    Self-guided

    • Documentation
      Find answers, get step-by-step guidance, and learn how to use Red Hat products.
    • Learning paths
      Explore curated walkthroughs for common development tasks.
    • Guided learning
      Receive custom learning paths powered by our AI assistant.
    • See all learning

    Hands-on

    • Developer Sandbox
      Spin up Red Hat's products and technologies without setup or configuration.
    • Interactive labs
      Learn by doing in these hands-on, browser-based experiences.
    • Interactive demos
      Click through product features in these guided tours.

    Browse by topic

    • AI/ML
    • Automation
    • Java
    • Kubernetes
    • Linux
    • See all topics

    Training & certifications

    • Courses and exams
    • Certifications
    • Skills assessments
    • Red Hat Academy
    • Learning subscription
    • Explore training
  • Build

    Get started

    • Red Hat build of Podman Desktop
      A downloadable, local development hub to experiment with our products and builds.
    • Developer Sandbox
      Spin up Red Hat's products and technologies without setup or configuration.

    Download products

    • Access product downloads to start building and testing right away.
    • Red Hat Enterprise Linux
    • Red Hat AI
    • Red Hat OpenShift
    • Red Hat Ansible Automation Platform
    • See all products

    Featured

    • Red Hat build of OpenJDK
    • Red Hat JBoss Enterprise Application Platform
    • Red Hat OpenShift Dev Spaces
    • Red Hat Developer Toolset

    References

    • E-books
    • Documentation
    • Cheat sheets
    • Architecture center
  • Community

    Get involved

    • Events
    • Live AI events
    • Red Hat Summit
    • Red Hat Accelerators
    • Community discussions

    Follow along

    • Articles & blogs
    • Developer newsletter
    • Videos
    • Github

    Get help

    • Customer service
    • Customer support
    • Regional contacts
    • Find a partner

    Join the Red Hat Developer program

    • Download Red Hat products and project builds, access support documentation, learning content, and more.
    • Explore the benefits

Troubleshoot application misbehavior after an OpenShift upgrade

June 18, 2026
Francisco De Melo Junior
Related topics:
ContainersJavaJava microservicesNode.jsRuntimes
Related products:
Red Hat build of OpenJDKRed Hat OpenShiftRed Hat support for Spring Boot

    This article explains how to diagnose and address application misbehavior after a Red Hat OpenShift upgrade.

    Container awareness is a primary focus, as it dictates how an application behaves within a container. I therefore consider this article a follow-up to How to use Java container awareness in OpenShift 4, serving as a second expansion package after How does cgroups v2 impact Java, .NET, and Node.js in OpenShift 4?.

    I discuss several points regarding this matter in the sections that follow. The topic is extensive so I will be as concise as possible. This article assumes you are already investigating unexpected application behavior. Therefore, it will not discuss other topics (in migration) such as how to do it, or how to prepare for doing so.

    Migration

    Upgrading your Red Hat OpenShift version should not require changes to your application, and most migrations are painless.

    This is generally true if your application is compatible with cgroups v1 or cgroups v2. In these cases, application behavior remains consistent across upgrades.

    However, some scenarios can lead to unexpected outcomes; these troublesome scenarios are discussed in the following sections.

    Troublesome scenarios

    After migrating to a new cluster, the application behaves differently than in the previous version.

    Application changes

    Although seemingly straightforward, this is a common source of problems, especially when image tags are modified. The tag might be incorrect or the image can be cached on the registry.

    Workload changes

    Workload patterns might change due to Ingress parameters or increased application access.

    This is easily verifiable using the metrics already embedded in Red Hat OpenShift 4, such as Prometheus and Grafana metrics for use and networking (packets) usage or exchange.

    Instrumentation

    Changes to instrumentation—such as a different image or a new sidecar configuration—can cause the application to consume more memory than expected. Even with an identical image, updated instrumentation settings might introduce unexpected overhead or cause the application to misbehave. Because these issues are case-specific, consult your tool vendor to evaluate how a cgroups version migration affects their software.

    Non-container-aware applications

    An application that is not container-aware looks at the host hardware sizing rather than the specific resource allocations of its pod foundation.

    JVM container awareness

    When optimizing heap configurations, awareness metrics depend on deployment states.

    If a JVM deployment cannot detect its container limits, the application becomes non-container-aware.

    The application typically behaves consistently if it fails to detect limits on either the source or target hosts, assuming both environments share identical CPU and memory resources. The following table summarizes these scenarios:

    Source host stateTarget host stateScenario description
    Container-awareNon-container-awareMost common scenario: The application detects limits on the source host but fails to detect them on the target host.
    Non-container-awareNon-container-awareUncommon scenario: The application must already be deployed as non-container-aware.
    Non-container-awareContainer-awareRare scenario: The application or its deployment script must dynamically detect host limits.

    Off-heap non-container-aware applications

    For instance, Netty (depending on the application and configuration) is not always container-aware and can scale according to the number of CPUs on the host. This means off-heap resource use inside the container aligns directly with the host's CPU metrics.

    Non-JVM component awareness

    Even if the JVM is container-aware, underlying runtime components might not be. For example, native libraries like jemalloc and glibc reside below the JVM level and do not inherently detect container constraints.

    When deployed in an OpenShift cluster with fewer resource restrictions on its nodes, the application scales based on the host resources instead of the container limits.

    cgroups version change

    This is a specific instance of the previous use case. An application deployed under cgroups v1 might successfully detect container limits, but fail to do so after migrating to cgroups v2.

    When an application is migrated to a different cgroups version, Java runtime environments might fail to detect container memory or CPU limits.

    Review the following criteria to identify and resolve these compatibility failures:

    • When it will fail: Deploying an application that is incompatible with cgroups v2 can cause unexpected behavior in Red Hat OpenShift 4.19.
    • How to fix it: Upgrade to a cgroups v2-compatible version of your runtime environment.
    • Workaround: If an upgrade is not possible, limit CPU and memory allocations manually to mitigate broader cluster issues.

    For instance, the removal of cgroups v1 in Red Hat OpenShift 4.19 could explain differences, especially if the application is not cgroups v2 compliant. In this case, the application will behave as non-container-aware.

    This is the core topic of the article How does cgroups v2 impact Java, .NET, and Node.js in OpenShift 4?

    Unbounded deployments

    Unbounded deployments also directly impact application migration.

    When deploying an application inside the Red Hat OpenShift host, you can set that application without limits, allowing it to use the full host for performance.

    This configuration is known as an unbounded application. This type of deployment allows the application to spike when workloads peak, taking advantage of over-provisioned OpenShift nodes.

    Java uses container limits rather than requests for resource calculations. For unbounded deployments, host-level specifications directly dictate runtime thread and memory footprint calculations.

    CPU impact

    Host CPU cores directly affect the application thread count and overall resource footprint, as many heap and off-heap components base their internal configurations on available CPU cores. For example, Netty scales its thread pool according to the host processor count. In an unbounded deployment, a high host CPU count creates an excessively large thread pool. This leads to CPU throttling as multiple threads compete for kernel time slices while garbage collection (GC) threads execute simultaneously.

    Memory impact

    The memory will be calculated from the host limits, which results in a larger footprint.

    Even at baseline idle states, resource consumption can be significantly higher than in strictly bounded environments.

    Given larger memory use, the GC will directly affect performance; for instance, using a memory-intensive collector like G1GC means memory use increases until Full GCs are required.

    Although the extent to which you should use unbounded applications is debatable, the problem of noisy neighbors and the normal OpenShift workload directly affects the application, even if the resource footprint varies.

    FAQ

    The following frequently asked questions can help you verify and address this problem:

    Q1. What is the first step to verify an issue after migration?

    A1. Verify the cgroups difference. This can be done proactively.

    Q2. What would be a possible troubleshooting flow?

    A2. Verify the cgroups difference, deploy and verify. Also benchmark to make sure the problem always happens. Intermittent issues can often be more challenging to resolve than persistent, predictable failures.

    Q3. Is having more or fewer GC cycles a sign of a problem?

    A3. Not necessarily. There are several underlying conditions that can impact, for example, unbounded deployments.

    Overview

    The following table maps common migration scenarios to their corresponding diagnostic actions and verification steps.

    Troubleshooting scenarioDiagnostic actionVerification step
    Application changeTrack the specific application change backward.Verify elements of application difference, such as the image SHA and image metadata.
    Workload changeTrack workload and application behaviors using instrumentation and data collection.Verify elements of workload difference, cluster metrics, and memory allocation.
    Instrumentation change or impactTrack the instrumentation overhead and disable the instrumentation or settings.Verify elements of workload difference not related to application memory use.
    Cgroups version changeEither the application or the container startup script lacks updates, or the application might not be compatible with cgroups v2.Verify the application's compatibility with cgroups v2.
    Unbounded deploymentUnbounded deployments face host configuration fluctuations, and noisy neighbor issues can affect resource distribution.Verify details on the OpenShift host.

    Additional resources

    The following articles cover similar themes and are complementary to this guide:

    • How does cgroups v2 impact Java, .NET, and Node.js in OpenShift 4?.
    • Cgroups v2 in OpenJDK container in Openshift 4
    • Verifying Cgroup v2 Support in OpenJDK Images
    • What Red Hat middleware software is cgroups v2 compatible?

    To learn more about Java container awareness and how it prevents heap decoupling, see How to use Java container awareness in OpenShift 4. For detailed release notes, review Severin Gehwolf's article on cgroups v2 support in OpenJDK 8u372.

    Data collection

    You can gather specific data points to troubleshoot these scenario-based issues. For instance, for Java 11 and later you can use the VM.info file to verify heap size, off-heap configurations, container size, and CPU details. If the runtime fails to detect cgroups limits, the file entries show this mismatch.

    Isolate resource constraints after your next upgrade

    When troubleshooting application disruptions after an OpenShift upgrade, check your cgroups compatibility first. Verifying whether your runtime components accurately detect container-level limits isolates the root cause of unexpected resource footprint spikes and streamlines your diagnostic path.

    Acknowledgments

    Thanks to Moises Lozano and Pamela Giz for their contributions to this work.

    Related Posts

    • How to use Java container awareness in OpenShift 4

    • Build lean Java containers with the new Red Hat Universal Base Images OpenJDK runtime images

    • How does cgroups v2 impact Java, .NET, and Node.js in OpenShift 4?

    • Troubleshooting with fault tree analysis and PIOSEE

    • The case for building enterprise agentic apps with Java instead of Python

    • OpenJDK 25 now available in Red Hat Enterprise Linux 10.1

    Recent Posts

    • Manage LLM evaluation workloads at scale with EvalHub and Kueue

    • Troubleshoot application misbehavior after an OpenShift upgrade

    • Preserve OpenShift Pipelines logs with OpenTelemetry

    • What's new in Red Hat build of Apache Camel 4.18

    • Automate application migration with MigIQ: From Spring Boot to Quarkus

    What’s up next?

    Enterprise Java Patterns ebook tile card

    Enterprise Java Design Patterns in the Cloud Native Era

    Markus Eisele
    Red Hat Developers logo LinkedIn YouTube Twitter Facebook

    Platforms

    • Red Hat AI
    • Red Hat Enterprise Linux
    • Red Hat OpenShift
    • Red Hat Ansible Automation Platform
    • See all products

    Build

    • Developer Sandbox
    • Developer tools
    • Interactive tutorials
    • API catalog

    Quicklinks

    • Learning resources
    • E-books
    • Cheat sheets
    • Blog
    • Events
    • Newsletter

    Communicate

    • About us
    • Contact sales
    • Find a partner
    • Report a website issue
    • Site status dashboard
    • Report a security problem

    RED HAT DEVELOPER

    Build here. Go anywhere.

    We serve the builders. The problem solvers who create careers with code.

    Join us if you’re a developer, software engineer, web designer, front-end designer, UX designer, computer scientist, architect, tester, product manager, project manager or team lead.

    Sign me up

    Red Hat legal and privacy links

    • About Red Hat
    • Jobs
    • Events
    • Locations
    • Contact Red Hat
    • Red Hat Blog
    • Inclusion at Red Hat
    • Cool Stuff Store
    • Red Hat Summit
    © 2026 Red Hat

    Red Hat legal and privacy links

    • Privacy statement
    • Terms of use
    • All policies and guidelines
    • Digital accessibility

    Chat Support

    Please log in with your Red Hat account to access chat support.