我知道这不是"最佳实践",但我想知道如果我部署的应用程序抛出一个内存异常,我是否可以自动重启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"中终止进程,则堆转储可能不完整.
我知道这不是你问的问题,但你是否试过通过堆转储查看你可能泄漏内存的地方?
一些非常有用的工具,用于跟踪内存泄漏:
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 为您提供的。
不容易,并且绝对不会通过刚遭受内存不足异常的JVM.您最好的选择是将tomcat状态监视器与cron脚本或相关的预定系统管理员脚本相结合; 用于检查服务器状态的内容,如果服务失败,则自动停止并重新启动服务.
| 归档时间: |
|
| 查看次数: |
16987 次 |
| 最近记录: |