2012-01-11 32 views
0

当我的webapp使用spring,hibernate和tiles时,我似乎遇到了内存泄漏问题。我认为这可能是由于我的应用程序在部署之后没有自行清理。我部署和部署很多,因为我目前正在学习所有这些框架。spring 3.1,hibernate 4,tiles2,tomcat 7 - 清理(多个部署导致内存泄漏)

在我的web应用程序中应该做些什么来清理?我目前没有做任何事情,因为我认为Java自动进行内存清理,但是我很确定它在春季来临时并没有做任何事情,因为tomcat不停地抱怨permgen内存。

我很困惑我是否需要运行某些方法来保持干净。我读过关于在某处注册应用程序的Spring钩子,然后在关闭应用程序时正确清理了它?我不确定这样的事情是否有必要,但在新版本的弹簧中(3.1)

例如,tomcat一直告诉我,我没有正确注销JDBC驱动程序(但我认为tomcat会自动执行此操作如果它被检测到)。

我明白这是一个非常含糊的问题,但如果有人可以提到某些事情需要做,以防止我的应用程序泄漏,我可以自己为他们谷歌。

谢谢!

+0

它是否会导致perm gen空间错误? – Ralph 2012-01-11 06:21:25

+0

通过检查tomcat中是否有任何ERROR日志语句来检查部署是否正确。另外,如果tomcat说JDBC驱动程序没有正确注册,那么它需要注意。检查jdbc驱动程序库是否存在于类路径中。 – Gaurav 2012-01-11 06:24:17

回答

1

无论如何,只要可能,您应该在部署新版本之前关闭生产tomcat。 (这需要有两个tomcats一个故障转移机制,或者你只是接受服务停机一秒钟,而不仅仅是一个更新。)

我知道,这是唯一的方法来确保一个内存泄漏(考虑烫发)也不会做任何有害的事情。

0

这听起来像我使用Hibernate的项目中的问题。

Hibernate为您使用的每个域对象生成代理。这些代理保留在永久生成空间下,并且在应用程序重新启动/重新部署时不会被清除。 PermGen空间使用的内存量默认情况下相对较小,因此您可以尝试使用-XX:MaxPermSize java参数增加它。这可能会改善时间,然后您收到一个内存错误,但没有一个我知道这个问题的完整解决方案。你将不得不重启tomcat它自己最终。

对于jdbc问题首先,如果您手动使用连接,请确保它在try catch finally块中正确关闭。如果您不使用连接对象,那么它可能会与Hibernate再次相关。

+0

是的,我已将maxpermsize参数增加到256mb。这有助于重新启动之间的时间,但我希望有某种方法可以防止重新启动。 另外。与jdbc问题,我不得不看看。我并不是那么熟悉hibernate,所以我不知道我是否必须自己做,或者它是否适合我?我认为休眠会照顾所有这一切自动 – Fittersman 2012-01-12 00:57:10

2

Hibernate 4.0引入了jboss-logging作为依赖,这似乎会导致permgen泄漏(请参阅https://issues.jboss.org/browse/JBLOGGING-66)。

我不知道可以做些什么来正确地解决它,但作为一种解决方案将jboss-logging jar移动到tomcats lib目录似乎工作。

+0

看到这种可能的修复http://stackoverflow.com/a/32412984/185565 – Whome 2015-09-05 12:38:45