You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JDK11在Kubernetes中JVM MaxRAM取值异常问题排查

Tomcat容器JDK11内存超限被驱逐问题(非堆内存+JVM未识别Pod内存限制)

环境配置

Pod资源限制配置:

containers:
  tomcat:
    resources:
      limits:
        cpu: 1000m
        memory: 2000Mi
      requests:
        cpu: 50m
        memory: 2000Mi

当前JVM配置

设置的JAVA_OPTS参数:

-XX:+UnlockExperimentalVMOptions -XX:+UseContainerSupport -XX:MaxRAMPercentage=50.0

问题现象

堆内存大小符合预期,但Pod因内存超限被驱逐,问题出在非堆内存分配上。执行以下命令排查JVM内存参数:

java -XX:+UnlockExperimentalVMOptions -XX:+UseContainerSupport -XX:MaxRAMPercentage=50.0 -XX:+PrintFlagsFinal -version | grep -Ei 'Heap|RAM|version'

输出结果如下:

bool AggressiveHeap                           = false                                     {product} {default}
    ccstr AllocateHeapAt                           =                                           {product} {default}
   size_t EpsilonMinHeapExpand                     = 134217728                            {experimental} {default}
   size_t EpsilonPrintHeapSteps                    = 20                                   {experimental} {default}
   size_t ErgoHeapSizeLimit                        = 0                                         {product} {default}
   size_t G1HeapRegionSize                         = 0                                         {product} {default}
    uintx G1HeapWastePercent                       = 5                                         {product} {default}
    uintx GCHeapFreeLimit                          = 2                                         {product} {default}
   size_t HeapBaseMinAddress                       = 2147483648                             {pd product} {default}
     bool HeapDumpAfterFullGC                      = false                                  {manageable} {default}
     bool HeapDumpBeforeFullGC                     = false                                  {manageable} {default}
     bool HeapDumpOnOutOfMemoryError               = false                                  {manageable} {default}
    ccstr HeapDumpPath                             =                                        {manageable} {default}
    uintx HeapFirstMaximumCompactionCount          = 3                                         {product} {default}
    uintx HeapMaximumCompactionInterval            = 20                                        {product} {default}
    uintx HeapSearchSteps                          = 3                                         {product} {default}
   size_t HeapSizePerGCThread                      = 43620760                                  {product} {default}
   size_t InitialHeapSize                          = 33554432                                  {product} {ergonomic}
    uintx InitialRAMFraction                       = 64                                        {product} {default}
   double InitialRAMPercentage                     = 1.562500                                  {product} {default}
    uintx InitiatingHeapOccupancyPercent           = 45                                        {product} {default}
   size_t LargePageHeapSizeThreshold               = 134217728                                 {product} {default}
    uintx MaxHeapFreeRatio                         = 70                                     {manageable} {default}
   size_t MaxHeapSize                              = 1048576000                                {product} {ergonomic}
 uint64_t MaxRAM                                   = 137438953472                           {pd product} {default}
    uintx MaxRAMFraction                           = 4                                         {product} {default}
   double MaxRAMPercentage                         = 50.000000                                 {product} {command line}
   size_t MinHeapDeltaBytes                        = 196608                                    {product} {ergonomic}
    uintx MinHeapFreeRatio                         = 40                                     {manageable} {default}
    uintx MinRAMFraction                           = 2                                         {product} {default}
   double MinRAMPercentage                         = 50.000000                                 {product} {default}
    uintx NonNMethodCodeHeapSize                   = 5825164                                {pd product} {ergonomic}
    uintx NonProfiledCodeHeapSize                  = 122916538                              {pd product} {ergonomic}
     bool PostLoopMultiversioning                  = false                             {C2 experimental} {default}
     bool PreserveFramePointer                     = false                                  {pd product} {default}
     bool PrintClassHistogram                      = false                                  {manageable} {default}
     bool PrintHeapAtSIGBREAK                      = true                                      {product} {default}
    uintx ProfiledCodeHeapSize                     = 122916538                              {pd product} {ergonomic}
   size_t ShenandoahSoftMaxHeapSize                = 0                                      {manageable} {default}
     bool ShrinkHeapInSteps                        = true                                      {product} {default}
openjdk version "11.0.16.1" 2022-08-12
OpenJDK Runtime Environment Temurin-11.0.16.1+1 (build 11.0.16.1+1)
OpenJDK 64-Bit Server VM Temurin-11.0.16.1+1 (build 11.0.16.1+1, mixed mode, sharing)

从输出可见MaxRAM为137438953472(约128GB),明显未读取到Pod设置的2000Mi内存限制。

需求

已知可以通过-XX:MaxRAM和-XX:MaxMetaspaceSize硬编码设置内存参数,但希望找到无需硬编码的解决方案,保留百分比配置堆内存的灵活性。已参考相关问题但未解决。

内容的提问来源于stack exchange,提问作者Christopher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 03:45:34