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

时间:2019-11-28 01:23:57

标签: docker memory jvm

让我们说,一个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. 线程如何影响内存限制?

2 个答案:

答案 0 :(得分:1)

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

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

3。它会在有无OOM错误日志消息的情况下重新启动吗?
它显示OOM错误。问题1,错误日志位于容器内,因此您需要登录到失效的容器中并查看日志。问题2,错误日志来自docker,docker日志必须显示它。 Docker日志还将显示您的容器日志。

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

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

6。线程如何影响内存限制?
线程是运行程序,它使用内存或磁盘中的资源。线程的数量之所以会阻塞内存,并不是因为它们的数量很大,而是因为内存中的本机数据在创建时会随身携带。


希望我回答了您的问题。

答案 1 :(得分:0)

看一下文档,似乎有一个memswap_limit选项,所以我确定可以安全地假定将使用swap。它可能会崩溃,因为jvm擅长于此,但我想它运行得很慢。

线程本身不会减慢速度,但是由于交换的原因,它会因读写速度慢而成为瓶颈。

您的max mem问题是一个很难回答的问题,而且一点也不弄乱。您可能会发现有人建议您留出10-20%的净空,但您应该真正尝试找到自己的最佳位置。

注意:对于单个容器,14gb的内存很大。如果可能,您应该考虑将工作负荷分配到多个容器中。 Docker run允许您使用--scale arg扩展容器,编排平台(如kubernetes)可以为您管理过程。