在虚拟化技术中,容器并不像虚拟机一样加载、引导操作系统内核,而是使用命名空间
namespace
隔离系统环境,使用cgroups
限制资源使用。
Docker
利用cgroups
实现资源限制,并未完全隔离原生资源信息,比如/proc
/sys
等资源,所以需要容器内程序支持cgroups
以适配容器。当容器使用超限内存时,会抛出OOME
(Out Of Memory Exception:内存异常),并且会可能kill
一些进程,造成意外情况。
Java
8u131
及以上版本开始支持cgroup
,部分支持Docker
的资源限制。java8u131
需要加上-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap
参数以感知docker
的内存限制。java11
已正式支持容器,使用-XX:+UseContainerSupport
参数打开容器支持,默认开启。
在容器中获取限制情况:
1 |
# cat /sys/fs/cgroup/memory/memory.limit_in_bytes |