小编use*_*882的帖子

Kubernetes为运行JVM的Pod抛出OOM

我正在运行包含JVM(java8u31)的Docker容器。这些容器被部署为Kubernetes集群中的Pod。我经常得到Pod的OOM,而Kubernetes杀死Pod并重新启动它。我是Kubernetes的新手,在寻找这些OOM的根本原因时遇到了问题。

  1. 这是JVM参数

    -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -Xms700M -Xmx1000M  -XX:MaxRAM=1536M  -XX:MaxMetaspaceSize=250M 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 这些容器被部署为有状态集,以下是资源分配

    resources:
        requests:
            memory: "1.5G"
            cpu: 1
        limits:
            memory: "1.5G"
            cpu: 1
    
    Run Code Online (Sandbox Code Playgroud)

    因此分配给容器的总内存与MaxRam匹配

  3. 如果我使用-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/etc/opt/jmx/java_pid%p.hprof该方法无济于事,因为一旦有OOM,吊舱就会被杀死,重新创建并启动,因此吊舱中的所有物品都会丢失

    获取线程或HEAP转储的唯一方法是SSH到Pod中,这也是我无法接受的,因为Pod是在OOM之后重新创建的,所以在OOM时我没有占用内存。我在OOM之后进行SSH,这没有太大帮助。

  4. 我还使用visualVM,jHat对代码进行了概要分析,但是找不到大量的内存占用空间,这可能导致JVM中运行的线程消耗过多内存或可能导致泄漏的结论。

感谢您提供任何帮助来解决Kubernetes抛出的OOM。

jvm java-8 docker kubernetes

3
推荐指数
3
解决办法
2345
查看次数

标签 统计

docker ×1

java-8 ×1

jvm ×1

kubernetes ×1