我的java程序必须运行在内存被限制到指定数量的环境中。当我运行我的java服务时,它在启动过程中内存不足。如何正确使用java的ulimit?
这是我使用我设置的命令和值的示例:
ulimit -Sv 1500000
java \
-Xmx1000m -Xms1000m \
-XX:MaxMetaspaceSize=500m \
-XX:CompressedClassSpaceSize=500m \
-XX:+ExitOnOutOfMemoryError \
MyClass
从理论上讲,我已经占了所有我能找到的文档。有堆(1000米)和元空间(500米)。但是在启动JVM时,它仍然耗尽内存。直到我将ulimit设置为比堆+元空间大600mib时才会发生这种情况。
我错过了什么类别的记忆,以便我可以适当地设置ulimit?
用例:我在有限内存的Docker容器中运行任务。这意味着linux cgroups正在进行限制。当超出内存限制时,cgroups只能暂停或终止超出限制的进程。如果出现问题,我真的希望java进程正常地失败,并且它使用太多的内存,以便包装bash脚本可以将错误报告给任务启动器。
我们使用java 8,所以我们需要担心metaspace而不是permgen。
更新:它不会与OutOfMemoryError
一起死亡。这是错误:
Error occurred during initialization of VM
Could not allocate metaspace: 524288000 bytes
它耗尽内存并被'cgroups'杀死,或耗尽内存并抛出'OutOfMemoryError'? – EJP
Java以'OutOfMemoryError'退出。我已经更新了这个问题。 – tombrown52
所以它正在做你想做的。您只需找到适合您的“cgroups”限制的可行Java内存参数即可。如果没有一个,你不能这样做。 – EJP