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

Abe*_*Abe 20 java tomcat jvm

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

Dan*_*Dan 24

您可以尝试使用OnOutOfMemoryError JVM选项

-XX:OnOutOfMemoryError="/yourscripts/tomcat-restart"
Run Code Online (Sandbox Code Playgroud)

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

-XX:+HeapDumpOnOutOfMemoryError
Run Code Online (Sandbox Code Playgroud)

结合这两个选项时要小心.如果强制在"tomcat-restart"中终止进程,则堆转储可能不完整.

  • 是的,它也适用于permgen空间错误. (2认同)
  • 您需要使用信号9(kill -9 PID)将其终止,因为它不处于有用状态.不幸的是,它不能用于安全的Tomcat进程回收. (2认同)

Mat*_*ogt 6

我知道这不是你问的问题,但你是否试过通过堆转储查看你可能泄漏内存的地方?

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

jdk/bin/jmap -histo:live pid
Run Code Online (Sandbox Code Playgroud)

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

jdk/bin/jmap -dump:live,file=heap.hprof pid
Run Code Online (Sandbox Code Playgroud)

这将转储由pid标识的整个JVM堆.然后,您可以使用优秀的Eclipse Memory Analyzer来检查它,并找出谁正在坚持您的对象的引用.你在Eclipse Memory Analyzer中的两个最大的朋友是histo gram和一个right click -> references -> exclude weak/soft references看看引用你的对象的东西.

jconsole当然是另一个好工具.


小智 6

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

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

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


mcf*_*gan 5

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