假设一个 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是容器使用的最大内存。我试图理解以下事情:
max_mem?mem_limit?max_mem?小智 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. 线程如何影响内存限制?
线程是一个运行者,它使用内存或磁盘中的资源。线程数量阻塞内存并不是因为它们的数量很大,而是因为它们在创建时携带了内存中的本机数据。
希望我已经回答了你的问题。