我有一个java程序,其唯一的功能是使用大约512M RAM并且空闲。本地运行它有效:
java -Xmx559m MemoryEater
当我在Docker中使用相同的内存设置运行相同的程序时,Java会因内存不足错误而出错。这是java不是docker杀死它。我必须将堆大小增加一倍才能成功运行。
docker run -it --rm -e JAVA_OPTIONS='-Xmx1027m' memory-eater memory-eater
这是为什么?我确实尝试设置不同级别的docker --memory和--memory-swap,但始终需要1027m的堆大小。
其他信息:
错误讯息:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at MemoryEater.main(MemoryEater.java:10)
程序:
import java.util.Vector;
public class MemoryEater
{
public static void main(String[] args)
{
Vector v = new Vector();
for( int i=1; i<512; i++)
{
byte b[] = new byte[1048576];
v.add(b);
Runtime rt = Runtime.getRuntime();
System.out.println( "i = " + i + " free memory: " + rt.freeMemory() + " max memory: " + rt.maxMemory() + " total memory: " + rt.totalMemory() );
}
while( true ){}
}
}
原生和容器都是64位。