我可以在内存不足的情况下自动重启tomcat jvm吗?



我知道这不是"最佳实践",但我想知道如果我部署的应用抛出outofmemory异常,我是否可以自动重启tomcat

您可以尝试使用OnOutOfMemoryError JVM选项

-XX:OnOutOfMemoryError="/yourscripts/tomcat-restart"

也可以为以后的分析生成堆转储:

-XX:+HeapDumpOnOutOfMemoryError

要小心组合这两个选项。如果在"tomcat-restart"中强制终止进程,堆转储可能还没有完成。

我知道这不是您所要求的,但是您是否尝试过通过堆转储查看可能泄漏内存的地方?

跟踪内存泄漏的一些非常有用的工具:

jdk/bin/jmap -histo:live pid

这将为您提供JVM中当前所有活动对象的直方图。寻找任何奇怪的对象计数。您必须非常了解您的应用程序,以便能够确定哪些对象计数是奇数。

jdk/bin/jmap -dump:live,file=heap.hprof pid

这将转储由pid标识的JVM的整个堆。然后,您可以使用强大的Eclipse Memory Analyzer来检查它,并找出谁持有对象的引用。在Eclipse Memory Analyzer中,您的两个最大的朋友是直方图和right click -> references -> exclude weak/soft references,用于查看引用对象的内容。

jconsole当然是另一个好工具。

不幸的是,当您终止java进程时。您的脚本将保留对tomcat端口8080 8005 8009的引用,并且您将无法从同一脚本再次启动它。对我来说唯一有效的方法是:

-XX:OnOutOfMemoryError="kill - 9% p",然后另一个cron或monitor或类似的东西来确保tomcat再次运行。

%p实际上是JVM的pid,是JVM为您提供的。

不容易,而且肯定不会通过刚刚遭受内存不足异常的JVM。您最好的选择是将tomcat状态监视器与cron脚本或相关的调度系统管理员脚本相结合;用于检查服务器状态,并在服务失败时自动停止和重新启动服务。

一般不需要。虚拟机处于不良状态,不能完全信任。

通常,可以使用一个可配置的包装器进程来启动和停止您想要的"真实"服务器VM。我用过的一个例子是Tanuki Software的"Java服务包装器"http://wrapper.tanukisoftware.com/doc/english/download.jsp

我知道还有其他人。

为了首先防范oom,有一些方法可以通过接口bean来检测现代vm,以查询堆和其他内存结构的状态。例如,如果某些应用程序的特定操作超出了既定的限制,这些可用于在日志或电子邮件中发出警告。

我用

-XX:OnOutOfMemoryError='pkill java;/usr/local/tomcat/bin/start.sh'

这样怎么样?-XX:OnOutOfMemoryError="exec `ps --no-heading -p $$ -o cmd`"

最新更新