首页 > 解决方案 > 当运行 JVM 的 docker 容器达到内存限制时会发生什么?

问题描述

让我们说,一个 docker 容器在一个 16G RAM、2 核 CPU 的服务器中运行 JVM,以下是容器的内存限制:

mem_limit: 14G
max_mem: 13G
threads: 1
max_pool_size: 20

max_mem是 JVM 使用的最大堆大小,mem_limit是容器使用的最大内存。我试图了解以下内容:

  1. 当 JVM 达到max_mem极限时会发生什么?
  2. 当容器到达它时会发生什么mem_limit
  3. 它是否会在有或没有 OOM 错误日志消息的情况下重新启动?我们在哪里可以看到这些日志?
  4. 之后我们应该为容器留多少内存max_mem
  5. 线程如何影响内存限制?

标签: dockermemoryjvm

解决方案


1.当JVM达到max_mem限制时会发生什么?
它必须崩溃。如果您有实时恢复或在 docker-swarm 或 kubernetes 上,它会迅速启动另一个容器。

2. 当容器达到 mem_limit 时会发生什么?
它必须报告并崩溃。答案与上述相同。

3. 它是否在有或没有 OOM 错误日志消息的情况下重新启动?
它给出了OOM错误。问题1,错误日志在容器内部,所以需要登录死容器查看日志。问题 2,错误日志来自 docker,docker logs 必须显示。Docker 日志也​​会显示您的容器日志。

4. 我们在哪里可以看到这些日志?
在上面的问题中回答

5. max_mem 之后我们应该为容器留多少内存?
为您的应用程序进行内存模型设计并添加缓冲区并据此限制您的容器。如果您的容器因 OOM 而不断崩溃,请确保修复您的应用程序代码

6.线程如何影响内存限制?
Thread 是一个运行器,它使用内存或磁盘中的资源。线程的数量阻塞内存不是因为它们的数量很大,而是因为它们在创建时携带的内存中的本机数据。


希望我已经回答了你的问题。


推荐阅读