JVM 对容器的支持

在虚拟化技术中,容器并不像虚拟机一样加载、引导操作系统内核,而是使用命名空间 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

参考链接

0%