我知道这不是"最佳实践",但我想知道如果我部署的应用抛出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`"