- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在运行包含 JVM (java8u31) 的 Docker 容器。这些容器作为 pod 部署在 kubernetes 集群中。我经常遇到 pod 发生 OOM 的情况,并且 Kubernetes 会杀死 pod 并重新启动它。由于我是 Kubernetes 新手,因此在查找这些 OOM 的根本原因时遇到了问题。
这是 JVM 参数
-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -Xms700M -Xmx1000M -XX:MaxRAM=1536M -XX:MaxMetaspaceSize=250M
这些容器被部署为有状态集,以下是资源分配
resources:
requests:
memory: "1.5G"
cpu: 1
limits:
memory: "1.5G"
cpu: 1
因此分配给容器的总内存与 MaxRam 匹配
如果我使用 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/etc/opt/jmx/java_pid%p.hprof
这没有帮助,因为 Pod 被杀死并且一旦出现 OOM,就会重新创建并启动,因此 pod 中的所有内容都会丢失
获取线程或堆转储的唯一方法是通过 SSH 连接到 pod,但我也无法使用该方法,因为 pod 是在 OOM 后重新创建的,因此我无法获取 OOM 时的内存占用情况。我在 OOM 后使用 SSH,这没有多大帮助。
我还使用 VisualVM、jHat 分析了代码,但找不到大量内存占用,这可能导致 JVM 中运行的线程消耗过多内存或可能存在泄漏。
感谢任何帮助解决 Kubernetes 引发的 OOM。
最佳答案
当 pod 中的应用程序达到您通过 resources.limits.memory 或命名空间限制设置的内存限制时,Kubernetes 会重新启动 pod。
以下文章中介绍了限制资源的 Kubernetes 部分:
Java 应用程序消耗的内存不限于堆的大小,您可以通过指定选项来设置:
-Xmssize Specifies the initial heap size.
-Xmxsize Specifies the maximum heap size.
Java 应用程序需要一些额外的内存用于元空间、类空间、堆栈大小,并且 JVM 本身需要更多的内存来执行垃圾收集、JIT 优化、堆外分配、JNI 代码等任务。很难以合理的精度预测 JVM 的总内存使用情况,因此最好的方法是在实际部署中以正常负载进行测量。
我建议您将 Kubernetes pod 限制设置为双倍 Xmx
大小,检查是否不再出现 OOM,然后逐渐减少到开始出现 OOM 的程度。最终值应位于这些点之间的中间。
您可以从 Prometheus 等监控系统中的内存使用统计中获得更精确的值。
另一方面,您可以尝试通过指定可用选项的数量来限制 java 内存使用,如下所示:
-Xms<heap size>[g|m|k] -Xmx<heap size>[g|m|k]
-XX:MaxMetaspaceSize=<metaspace size>[g|m|k]
-Xmn<young size>[g|m|k]
-XX:SurvivorRatio=<ratio>
有关此内容的更多详细信息,请参阅以下文章:
限制 JVM 内存使用的第二种方法是根据 RAM(或 MaxRAM)的数量计算堆大小。 article 中对其工作原理有很好的解释。 :
The default sizes are based on the amount of memory on a machine, which can be set with the
-XX:MaxRAM=N
flag.Normally, that value is calculated by the JVM by inspecting the amount of memory on the machine.However, the JVM limitsMaxRAM
to1 GB
for the client compiler,4 GB
for 32-bit server compilers, and128 GB
for 64-bit compilers.The maximum heap size is one-quarter ofMaxRAM
.This is why the default heap size can vary: if the physical memory on a machine is less thanMaxRAM
, the default heap size is one-quarter of that.But even if hundreds of gigabytes of RAM are available, the most the JVM will use by default is32 GB
: one-quarter of128 GB
. The default maximum heap calculation is actually this:
Default Xmx = MaxRAM / MaxRAMFraction
Hence, the default maximum heap can also be set by adjusting the value of the -
XX:MaxRAMFraction=N
flag, which defaults to4
.Finally, just to keep things interesting, the-XX:ErgoHeapSizeLimit=N
flag can also be set to a maximum default value that the JVM should use.That value is0
by default (meaning to ignore it); otherwise, that limit is used if it is smaller thanMaxRAM / MaxRAMFraction
.
The initial heap size choice is similar, though it has fewer complications. The initial heap size value is determined like this:
Default Xms = MaxRAM / InitialRAMFraction
As can be concluded from the default minimum heap sizes, the default value of the
InitialRAMFraction
flag is64
.The one caveat here occurs if that value is less than5 MB
—or, strictly speaking, less than the values specified by-XX:OldSize=N
(which defaults to4 MB
) plus -XX:NewSize=N
(which defaults to1 MB
).In that case, the sum of the old and new sizes is used as the initial heap size.
本文为您提供了一个很好的起点,可以开始为面向 Web 的应用程序调整 JVM:
关于docker - Kubernetes 为运行 JVM 的 Pod 抛出 OOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52596383/
这里就涉及到一个问题,到底Kill掉谁呢?一般稍微了解一些Linux内核的同学第一反应是谁用的最多,就Kill掉谁。这当然是Linux内核首先考虑的一种重要因素,但是也不完全是这样的,我们查一些Li
这个问题在这里已经有了答案: Set a JVM to dump heap when OutOfMemoryError is thrown (2 个答案) 关闭 5 年前。 我是JAVA新手。我在用
我们正在使用 Fitnesse 对复杂的基于 Web 的应用程序进行验收测试。全套流程需要几个小时才能通过,因此我们使用多个流程。设置如下: maven fork Fitnesse 服务器进程 mav
我正在Tensorflow的LSTM-RNN上训练一些音乐数据,并且遇到了我不明白的一些GPU内存分配问题:当实际上似乎还有足够的VRAM可用时,我遇到了OOM。 一些背景: 我正在使用6GB的GTX
我正在使用 tf 运行 seq2seq 模型,当使用 tf.train.Saver 从检查点文件加载参数时,推理程序运行良好。但是在使用 freeze_graph.py(使用 tf.framework
我有一个问题需要用 JS 中的某种继承来解决。 我设置了一个小的 jsfiddle 来解释,看: V1 http://jsfiddle.net/FFTj4/5/ function Vehicule(n
这里是 JS 的新手,所以如果我遗漏了一些明显的东西,我深表歉意。尝试构建一个随机数生成器(它以嵌套方式工作,所以有点像随机数元组列表),但我收到此代码的 OOM 错误。 (比如,如果我尝试做类似 g
我有一个需要显示全屏图像的应用程序,我从可绘制文件夹中获取图像,它们大约为 150-250 kb,但它仍然崩溃并出现 OutOfMemory 错误。当然不是第一张图片,但每次用户启动应用程序时我都会加
我正在使用 spark 从 postgres 表中读取并将其作为 json 转储到 Google 云存储。该表很大,有数百个 GB。该代码相对简单(请参见下文)但因 OOM 而失败。似乎 spark
即使系统中有足够的内存并且正确提供了所有必需的内存设置,Tomcat 仍无法启动并出现 OOM。这种情况并没有持续发生,证明 tomact 配置没有问题。 15-Jan-2019 20:17:31.0
我在高负载多线程Java项目中遇到OOM异常问题。 我很感激你能给我任何帮助。 德莱尔斯: 项目是建立在Java+Mysql作为存储。 没有证据表明在应用程序崩溃时会使用额外的RAM(任何监控工具都不
我使用 Android P-OS。内核版本为msm-4.14 自启动以来,oom 被调用并终止进程。不过内存还是很丰富的。我的内存大小是8GByte,Swap是1GByte。我什至没有使用交换。 [
所有的一切, 我正在使用 openjdk 1.8.0_212-b04、Tomcat 8.0.21 和 Red Hat 6.4。 并且我已经调整了测试web应用程序,确保重新部署后不会有没有这样的消息:
所以我在 Crashlytics 中看到我们有很多崩溃是由位图的 OOM 引起的。似乎其中 60% 来自 6.0.1 上的 Galaxy S7 Edge 设备。我们拥有的是一个包含 2 个图像的着陆屏
最近我们在 Docker 容器中遇到了 Ruby 的问题。尽管负载非常低,但应用程序往往会消耗大量内存,并且在提到的一段时间后会出现 OOM。 经过一番调查,我们将问题缩小到单线 docker run
Snakemake 工作流可以在任何类型的失败后重新尝试每次重启,包括如果错误是内存不足(OOM),例如 def get_mem_mb(wildcards, attempt): return
我有一个有趣的问题。我想我发现了一个无限请求循环,它导致我的 istio-proxy 在特定情况下因 OOM 错误而崩溃。 当我直接从应用程序容器内部将请求本地提交到应用程序时,它似乎工作正常,并且在
我使用的是 ActiveMQ 5.2,我的应用程序需要大量主题,大约 500,000 个。当我运行我的应用程序时,仅创建大约 1000 个主题后,ActiveMQ 会抛出 OutOfMemoryExc
我在 k8s 运算符上部署了一个结构化流作业,它只是从 kafka 读取数据,反序列化,添加 2 列并将结果存储在数据湖中(尝试了 delta 和 parquet),几天后执行程序增加了内存,最终我得
我的Mac上的Minikube中有一个本地Kubernetes集群。我将Minio独立服务器部署为具有指定资源限制的单个容器。当我上载大于容器内存限制的文件时,容器因OOMKilled原因终止。在Ub
我是一名优秀的程序员,十分优秀!