docker - 当运行 JVM 的 docker 容器达到内存限制时会发生什么?
问题描述
让我们说,一个 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,错误日志在容器内部,所以需要登录死容器查看日志。问题 2,错误日志来自 docker,docker logs 必须显示。Docker 日志也会显示您的容器日志。
4. 我们在哪里可以看到这些日志?
在上面的问题中回答
5. max_mem 之后我们应该为容器留多少内存?
为您的应用程序进行内存模型设计并添加缓冲区并据此限制您的容器。如果您的容器因 OOM 而不断崩溃,请确保修复您的应用程序代码
6.线程如何影响内存限制?
Thread 是一个运行器,它使用内存或磁盘中的资源。线程的数量阻塞内存不是因为它们的数量很大,而是因为它们在创建时携带的内存中的本机数据。
希望我已经回答了你的问题。
推荐阅读
- sql - CASE WHEN NOT 不会产生正确的结果?
- c# - 带有 ResponseHeadersRead 的 HttpClient 在没有 Fiddler 的情况下第二次 GetAsync 尝试失败(超时)(Http/Https 调试器)
- sql - SQL查询及疑难解答
- python - 停止 wxPython 循环
- r - Rmd 笔记本中节号后的尾随句点
- html - 访问@mixin 中的根变量
- json - 使用 T-SQL 从 Json 文件中检索结果而不是迭代多个子对象
- java - 当输入值都是整数时,为什么 int 会给我一个不同的值?
- dbeaver - 导出文件名
- c# - Visual Studio 不断尝试重新创建 sql 表而不是更新