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
相关产品推荐
相关产品推荐

