我的java程序必须在内存受限于指定量的环境中运行.当我运行我的java服务时,它在启动期间耗尽了内存.
这是我正在使用的命令和我正在设置的值的示例:
ulimit -Sv 1500000
java \
-Xmx1000m -Xms1000m \
-XX:MaxMetaspaceSize=500m \
-XX:CompressedClassSpaceSize=500m \
-XX:+ExitOnOutOfMemoryError \
MyClass
Run Code Online (Sandbox Code Playgroud)
从理论上讲,我已经考虑了所有可以找到文档的内容.堆(1000米)和元空间(500米).但是在初始化JVM时它仍然会耗尽内存.直到我将ulimit设置为大于堆+ metaspace大约600mib时才会发生这种情况.
我错过了什么类型的记忆,以便我可以适当地设置ulimit?
使用案例:我在内存有限的Docker容器中运行任务.这意味着linux cgroups正在进行限制.超出内存限制时,cgroup只能暂停或终止超出其范围的进程.我真的希望java进程在出现问题时优雅地失败并且它使用太多内存以便包装bash脚本可以将错误报告给任务启动器.
我们正在使用java 8,所以我们需要担心metaspace而不是permgen.
更新:它不会死于OutOfMemoryError.这是错误:
Error occurred during initialization of VM
Could not allocate metaspace: 524288000 bytes
Run Code Online (Sandbox Code Playgroud)