比方说,一个 docker 容器在一个 16G RAM、2 核 CPU 的服务器中运行 JVM,以下是容器的内存限制:
mem_limit: 14G
max_mem: 13G
threads: 1
max_pool_size: 20
max_mem
是 JVM 使用的最大堆大小,mem_limit
是容器使用的最大内存。我试图了解以下内容:
- 当 JVM 达到
max_mem
限制时会发生什么? - 当容器达到
mem_limit
时会发生什么? - 它会在有或没有 OOM 错误日志消息的情况下重新启动吗?我们在哪里可以看到这些日志?
- 在
max_mem
之后我们应该为容器留多少内存? - 线程如何影响内存限制?
最佳答案
<强>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/