当 docker 容器 运行 JVM 达到内存限制时会发生什么?

What happens when docker container running JVM reaches memory limit?

假设,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. 线程如何影响内存限制?

查看文档似乎有一个 memswap_limit 选项,所以我认为可以安全地假设将使用交换。它可能会崩溃,因为 jvm 擅长于此,但我想它只是 运行 慢。

线程本身不会减慢速度,但由于交换,它基本上会因 read/write 速度慢而成为瓶颈。

你的 max mem 问题是一个很难回答的问题,而不需要稍微弄乱它。您可能会发现有人建议 10-20% 的动态余量,但您真的应该尝试自己找到最佳位置。

注意:14gb ram 对于单个容器来说已经很多了。如果可能,您应该考虑在多个容器上分配工作负载。 Docker 运行 允许您使用 --scale arg 扩展容器,而 kubernetes 等编排平台可以为您管理流程。

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

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

3。它会在有或没有 OOM 错误日志消息的情况下重新启动吗?
它给出 OOM 错误。问题1,error log在容器里面,所以需要登录死容器看日志。问题2,错误日志来自docker,docker日志必须显示它。 Docker 日志也会显示您的容器日志。

4。我们在哪里可以看到这些日志?
已回答上述问题

5. max_mem之后我们应该为容器留多少内存?
为您的应用程序设计内存模型并添加缓冲区并根据此限制您的容器。如果您的容器因 OOM

而不断崩溃,请确保修复您的应用程序代码

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


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