docker守卫与容器内的malloc失败

我写了一个简短的java程序来分配内存:

package com.company; import java.util.ArrayList; import java.util.List; public class Main { public static final int SIZE_NATIVE_LONG_IN_BYTE = 8; public static void main(String[] args) { Integer memoryConsumptionInMiB = Integer.parseInt(args[0]); List<long[][]> foo = new ArrayList<long[][]>(); int i = 0; while (true) { System.out.println(i++); foo.add(new long[(1024 / SIZE_NATIVE_LONG_IN_BYTE * 1024)][memoryConsumptionInMiB]); } } } 

然后我尝试在一个docker容器中运行几个不同的参数:

  1. Xmx 1G和docker容器没有内存限制
  2. Xmx 1G和docker运行-m 512m
  3. XMX 1G和docker运行-m 512m – 禁用OOM杀手

这是我如何运行程序(在3的情况下):

(编辑:上传一个准备好的图像与上面的类)

 docker run -it --oom-kill-disable -m 512m kazesberger/alpine-java-memory-tester java -classpath . com.company.Main 10 (~Megabytes allocated per iteration) 

我的期望是:1.在1G的OutOfMemory(堆)2.主机操作系统在发生实际的OutOfMemory错误之前,终止Docker容器(可用Docker检查或内核日志进行校对)。 3. docker容器中的malloc失败,导致jvm以某种OutOfMemoryError终止。

实际结果:1。期望会见2。期望会见3。oomkiller仍然杀死容器。 docker检查仍然显示OOMKilled真实

所以你看我的实际目标并不是真的要压制oomKiller来实现它的目的。 这是我的目标,让容器内的进程失败,分配他们不被允许的内存。

先决条件/版本: swapoff -a

docker –version Docker版本17.11.0-ce-rc4,build 587f1f0

docker run -it kazesberger / alpine-java-memory-tester java -version openjdk version“1.8.0_111-internal”