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

bot*_*bot 3 memory jvm docker

假设一个 docker 容器的 JVM 运行在一台具有 16G RAM、2 核 CPU 的服务器中,以下是容器的内存限制:

mem_limit: 14G
max_mem: 13G
threads: 1
max_pool_size: 20
Run Code Online (Sandbox Code Playgroud)

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

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

小智 5

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

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

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

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

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

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


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