当发生OutOfMemoryError时,我需要在服务器端自动重启tomcat。最简单的方法是使用JVM选项:OnOutOfMemoryError =“service tomcat restart”。
问题:Tomcat是由tomcat用户运行的。 tomcat用户无权使用service命令重启tomcat,或直接运行/etc/init.d/tomcat6(此脚本中的某些命令只能由root执行)。
此外,使tomcat用户sudoer不是一个好主意。有没有更好的方法呢?
答案 0 :(得分:4)
解决方案是修复内存泄漏,而不是自动重启以解决它。这不是一个真正的解决方案,仍然会让所有用户反弹并迫使他们重新登录。
答案 1 :(得分:0)
除了修复OOM之外,还可以使用Service Wrapper(自动重启)启动JVM实例,例如Tanuki Java Service Wrapper
如果我没记错的话,版本3.2.3属于LGPL。
答案 2 :(得分:0)
如果这是由内存泄漏引起的,你应该解决这个问题。但是,有时候这种情况会发生在某些类型的高使用率会占用大量内存时,并且强加硬限制并不容易。如果是的话......
在你的系统上,如果Tomcat崩溃,是否有某些事情(如FireDaemon)会自动重启?如果是这样,您只需尝试退出
,而不是尝试重新启动 System.exit(1);
这将结束Tomcat。但是,有时候,当你内存不足时,即使这可能也行不通。
因此,解决此问题的另一种方法是使用一种机制,当您跨越一定比例的内存使用量时(例如85%)会向您发出警告。有免费的Tomcat监控解决方案可以帮助解决这个问题;或者,你可以尝试自己动手......简单。
答案 3 :(得分:0)
另一种方法是,无论出于何种原因,如果您无法控制正在使用的应用程序代码,那就是在容器内运行它。
我在docker容器中运行了一个tomcat 9和一个GeoServer应用程序。有时,请求使我的应用程序崩溃,日志中的错误是OutOfMemory。 我调整了JVM参数以使用尽可能多的内存,但是有时仍会发生此错误。因此,为防止此错误使我的服务保持锁定状态,我使用OnOutOfMemoryError参数杀死了tomcat。由于只有在运行主进程时才维护容器,在这种情况下,该进程就是tomcat,所以当我们杀死它时,容器就停止了。
在Tomcat环境中设置JVM参数。
CATALINA_OPTS="-XX:OnOutOfMemoryError=\"kill -9 %p\"
-Djava.awt.headless=true \
-Dfile.encoding=UTF-8 -server \
-Xms1024m -Xmx3072m -Xss1024k -XX:NewSize=768m \
-XX:+UseParallelGC -XX:MaxGCPauseMillis=500"
这种方法将容器强制退出,因为tomcat掉落了。
您可以在启动容器时通过指定重新启动策略来自动重新启动失败的容器。为此,您必须使用-restart = always 或其他the docker documentation中定义的策略。
docker run -d --name testing_restarts --restart always you_docker_image_with_tomcat:<version>