内存不足Tomcat

时间:2013-11-19 22:03:50

标签: java tomcat

我有一个安装了一些应用程序的Tomcat 7,现在通常很快就上传新版本的应用程序:所以我打包战争并取消部署现有的战争并部署新战争或重新部署现有应用程序,问题出现几个星期后,当我看到内存几乎已满,以防止一些意外的外部存储异常,使我们的客户无法提供服务

我是否必须重新启动Tomcat? ¿这是正常的吗? 是否有一个实用解决方案可以重启Tomcat?

请专家解答

更新:这个库可以真正帮助避免permgem问题和类加载器泄漏: https://github.com/mjiderhamn/classloader-leak-prevention,但请记住,没有泄漏是你的责任,没有银弹。 Visual VM确实可以帮助检测类加载器泄漏。

2 个答案:

答案 0 :(得分:1)

零Tomcat重启的实用解决方案是编写不会泄漏内存的应用程序。就这么简单 - Tomcat它不可能自己泄漏内存;) 换句话说:只要您的应用程序泄漏内存重启是不可避免的。你可以调整内存设置,但你只是推迟了不可避免的事情。 Tomcat7可以检测到一些内存泄漏(甚至可以解决一些简单的内存泄漏) - 如果您安装了此功能,则会通过Tomcat Manager公开此功能。但是,它并不能帮助您指出泄漏的位置。

从最近的经验来看,我有一个应用程序,在正常操作期间似乎没有泄漏,但有一个PermGen泄漏 - 这意味着我没有真正看到泄漏,直到我尝试做你正在做的事情 - 热部署。在填充PermGen之前我只能进行一些部署,因为Tomcat无法卸载类的旧实例... 网上可能有更好的PermGen漏洞解释,但谷歌快速给了我这个:http://cdivilly.wordpress.com/2012/04/23/permgen-memory-leak/

但是,如果您的应用程序在运行一段时间后崩溃,则很可能是内存泄漏。您可以调整堆大小和垃圾收集设置以尝试解决/解决此问题,但很可能唯一真正的解决方法是追踪泄漏,修复代码并构建不泄漏的版本。 ...但除非您能确保每个版本都是无泄漏的,否则您需要一个重新启动服务的策略。如果您在发布期间没有这样做,请考虑在高峰时段进行。 如果您有一个集群,您可以考虑使用memcached设置Tomcat以进行会话复制,以便在重新启动集群中的节点时不会中断用户。你也可以考虑设置monit,god,runit,upstart,systemd等来自动重启失败的服务......

答案 1 :(得分:0)

您需要在eclipse中添加最小和最大长度的VM参数。在eclipse转到窗口 - >首选项 - >单击Java - >单击已安装的JRE。然后双击jre记录将vm参数添加为-Xms768m -Xmx1024m。