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

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

最佳答案

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

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

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

<强>4。我们在哪里可以看到这些日志?
回答了上面的问题

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

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


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

关于docker - 当运行 JVM 的 docker 容器达到内存限制时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59080530/

相关文章:

memory - 如何对函数的内存使用情况进行基准测试?

java - 在 JNI 客户端应用程序中设置较小的 JVM 堆大小

docker - 对等节点状态命令在 super 账本结构网络中无法正常工作

curl - 无法从 docker 容器内访问 MacOSX 主机上的端口

docker - 动态将容器主机名解析为IP

c++ - 尝试破解 C++ 中的常量时的奇怪行为

visual-studio - 在 Visual Studio 中调试 docker-compose 项目时如何传递命令行?

memory - 限制 Racket 博士的内存

java - 没有垃圾回收的 JVM

browser - 当浏览器关闭时,小程序会发生什么?