我可以自动重启tomcat jvm内存exception

我知道这不是“最佳实践”,但我想知道如果我部署的应用程序抛出一个outofmemoryexception我是否可以自动重启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中的两个最大的朋友是histo gram, right click -> references -> exclude weak/soft references以查看引用对象的内容。

jconsole当然是另一个好工具。

不容易,绝对不会通过刚遭受内存不足exception的JVM。 您最好的选择是将tomcat状态监视器与cron脚本或相关的预定系统管理员脚本相结合; 用于检查服务器状态的内容,如果服务失败则自动停止并重新启动服务。

一般来说,没有。 VM处于错误状态,无法完全信任。

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

我知道还有其他人。

为了防范OOM,有一些方法可以通过接口bean来检测现代VM,以查询堆和其他内存结构的状态。 例如,如果某些特定于应用程序的操作正在推动某些已确定的限制,则可以使用这些警告日志或电子邮件。

不幸的是,你杀了java进程。 您的脚本将保留对tomcat端口8080 8005 8009的引用,您将无法从同一脚本再次启动它。 它对我有用的唯一方法是:

-XX:OnOutOfMemoryError =“kill -9%p”然后是另一个cron或monit或类似的东西,以确保你再次运行tomcat。

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

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