我正在启动一个 Java
应用程序,如下所示
JAVA_OPTS=-Xmx7g -Xms512m -Xss1m -XX:+UseCompressedOops -XX:-OmitStackTraceInFastThrow
我为此使用的 Pod 具有
resources:
limits:
cpu: 4096m
memory: 9Gi
requests:
cpu: 1024m
memory: 512Mi
但是,我偶尔看到 pod 被杀死
"Memory cgroup out of memory: Kill process 3284727 (java) score 1982 or sacrifice child
Killed process 3284727 (java) total-vm:15318320kB, anon-rss:9380388kB, file-rss:20180kB, shmem-rss:0kB"
为什么会发生这种情况?
既然我设置了Xmx=7G
,为什么内存使用量超过了9G
最佳答案
使用-Xmx
,您只需指定 Java 堆大小 - JVM 使用许多其他内存(例如堆栈、JVM 的 native 内存、直接缓冲区等)。
根据我们的经验,JVM 总使用量的正确大小是堆大小的 1.5 到 2 倍,但这在很大程度上取决于您的用例(例如,某些使用直接缓冲区的应用程序可能仅使用 1GB 堆就有 32GB RAM) .
因此,在更多限制下运行您的应用,检查实际使用情况,然后将 + 5% 定义为容器限制。
您还应该使用 -Xms512m
将您的请求调整为至少 1Gi
。
关于java - Pod OOM - Xmx 未被尊重,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57991719/