我正在尝试测试一个简单的脚本,如果遇到内存不足错误,该脚本将终止并重新启动服务。服务本身执行完整的CRUD操作,并在其启动脚本中定义的JVM选项中调用该脚本。
在start.sh脚本中:
DEFAULT_JVM_OPTS='"-Xmx512m" "-Dapp.name=app-service" "-XX:OnOutOfMemoryError=./oom.sh" "-Dspring.profiles.active='"$1"'"'
exec nohup "$JAVACMD" $DEFAULT_JVM_OPTS -jar $CLASSPATH > stdout.out 2> stderr.err &
在oom.sh中
#!/usr/bin/env sh
kill %p;
echo "service out of memory"
sleep 5
echo "Restarting service"
./start.sh profileName
我现在最大的问题实际上是通过引发OOM错误来测试脚本。从理论上讲,将发生的是将调用oom.sh脚本,这将杀死并重新启动服务。我尝试使用Postman Runner发送500个所有请求,但没有运气。有人知道更好的方法吗?
答案 0 :(得分:0)
Java Service Wrapper是否可以工作?它旨在处理应在其中运行您的应用程序的各种情况,但由于某些原因而无法运行(包括内存不足)。这也是非常艰苦的。 https://wrapper.tanukisoftware.com
对于使用Wrapper之类的产品,您可能有特定的原因/要求,但如果您还没有使用,则值得一看。
答案 1 :(得分:0)
这会迅速产生内存不足异常:
String s = "x";
while (s.length() > 0) {
s += s;
}
答案 2 :(得分:0)
这里是一个使用简单程序引发OutOfMemoryError的示例: https://crunchify.com/how-to-generate-out-of-memory-oom-in-java-programatically/
程序在每个循环中消耗更多的内存。
正如评论所指出的那样,您也可以仅出于测试目的抛出OutOfMemoryError:
throw new java.lang.OutOfMemoryError();