java - Pod OOM - Xmx 未被尊重

标签 java kubernetes memory

我正在启动一个 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/

相关文章:

json - Airflow DAG 序列化 : TypeError: Object of type 'V1Pod' is not JSON serializable

kubernetes - 需要建议如何使Spinnaker与AWS ECR配合使用?

kubernetes - 如何在 Kubernetes 中重新附加已发布的 PersistentVolume

ios - 应用程序因内存压力而终止

java - DefaultTableModel 上的 "Super"和 "this"

java - 什么是 transient 和 volatile 修饰符?

java - 处理-覆盖音频

c - 是什么导致Linux内核中的缓冲区膨胀?

java - 对象数组与索引列表+数组

java - 在java测试中没有收到错误