我正在运行包含JVM(java8u31)的Docker容器。这些容器被部署为Kubernetes集群中的Pod。我经常得到Pod的OOM,而Kubernetes杀死Pod并重新启动它。我是Kubernetes的新手,在寻找这些OOM的根本原因时遇到了问题。
这是JVM参数
-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -Xms700M -Xmx1000M -XX:MaxRAM=1536M -XX:MaxMetaspaceSize=250M
Run Code Online (Sandbox Code Playgroud)这些容器被部署为有状态集,以下是资源分配
resources:
requests:
memory: "1.5G"
cpu: 1
limits:
memory: "1.5G"
cpu: 1
Run Code Online (Sandbox Code Playgroud)
因此分配给容器的总内存与MaxRam匹配
如果我使用-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/etc/opt/jmx/java_pid%p.hprof该方法无济于事,因为一旦有OOM,吊舱就会被杀死,重新创建并启动,因此吊舱中的所有物品都会丢失
获取线程或HEAP转储的唯一方法是SSH到Pod中,这也是我无法接受的,因为Pod是在OOM之后重新创建的,所以在OOM时我没有占用内存。我在OOM之后进行SSH,这没有太大帮助。
我还使用visualVM,jHat对代码进行了概要分析,但是找不到大量的内存占用空间,这可能导致JVM中运行的线程消耗过多内存或可能导致泄漏的结论。
感谢您提供任何帮助来解决Kubernetes抛出的OOM。