我知道这不是“最佳实践”,但我想知道如果我部署的应用程序抛出了一个内存异常,我是否可以自动重启tomcat
答案 0 :(得分:23)
您可以尝试使用OnOutOfMemoryError JVM选项
-XX:OnOutOfMemoryError="/yourscripts/tomcat-restart"
还可以生成堆转储以供以后分析:
-XX:+HeapDumpOnOutOfMemoryError
小心结合这两个选项。如果强制在“tomcat-restart”中终止进程,则堆转储可能不完整。
答案 1 :(得分:6)
我知道这不是你问的问题,但你是否试过通过堆转储来查看你可能泄漏内存的地方?
一些非常有用的工具,用于跟踪内存泄漏:
jdk/bin/jmap -histo:live pid
这将为您提供当前JVM中所有活动对象的直方图。寻找任何奇怪的物体数量。您必须非常了解您的应用程序才能确定哪些对象计数是奇数。
jdk/bin/jmap -dump:live,file=heap.hprof pid
这将转储由pid标识的整个JVM堆。然后,您可以使用伟大的Eclipse Memory Analyzer来检查它,并找出谁正在抓住您的对象的引用。你在Eclipse Memory Analyzer中的两个最大的朋友是histo gram和right click -> references -> exclude weak/soft references
来看看你的对象是什么。
jconsole当然是另一个好工具。
答案 2 :(得分:5)
不容易,并且绝对不会通过刚遭受内存不足异常的JVM。您最好的选择是将tomcat状态监视器与cron脚本或相关的预定系统管理员脚本相结合;用于检查服务器状态的内容,如果服务失败,则自动停止并重新启动服务。
答案 3 :(得分:4)
一般来说,没有。 VM状态不佳,无法完全信任。
通常,可以使用可配置的包装器进程来启动和停止所需的“真实”服务器VM。我使用的一个例子是来自Tanuki Software http://wrapper.tanukisoftware.com/doc/english/download.jsp
的“Java Service Wrapper”我知道还有其他人。
首先要防范OOM,有办法通过接口bean来检测现代VM,以查询堆和其他内存结构的状态。例如,如果某些应用程序特定的操作正在推动某些已确定的限制,则可以使用这些警告日志或电子邮件。
答案 4 :(得分:2)
不幸的是,当你杀死java进程时。您的脚本将保留对tomcat端口8080 8005 8009的引用,您将无法从同一脚本再次启动它。它对我有用的唯一方法是:
-XX:OnOutOfMemoryError =“kill -9%p”,然后是另一个cron或monit或类似的东西,以确保你再次运行tomcat。
%p实际上是JVM pid,是JVM为您提供的。
答案 5 :(得分:1)
我使用
-XX:OnOutOfMemoryError='pkill java;/usr/local/tomcat/bin/start.sh'
答案 6 :(得分:0)
这样的事情怎么样? -XX:OnOutOfMemoryError="exec \`ps --no-heading -p $$ -o cmd\`"