我可以自动重启tomcat jvm内存异常

时间:2011-09-13 16:10:23

标签: java tomcat jvm

我知道这不是“最佳实践”,但我想知道如果我部署的应用程序抛出了一个内存异常,我是否可以自动重启tomcat

7 个答案:

答案 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\`"