spring 3.1,hibernate 4,tiles2,tomcat 7 - cleanup(多个部署导致内存泄漏)

时间:2012-01-11 02:56:59

标签: hibernate spring tomcat memory-leaks tiles

在为我的webapp使用spring,hibernate和tiles时,我似乎遇到了内存泄漏问题。我认为这可能是因为我的应用程序在部署之间没有清理。我部署和取消部署很多,因为我目前正在学习所有这些框架。

我应该在Web应用程序中清理什么样的东西?我目前什么也不做,因为我认为Java会自动进行内存清理,但是我很确定它不会在春天做任何事情,因为tomcat一直在抱怨permgen内存。

我很困惑我是否需要运行某些方法以保持清洁。我读到了一个弹簧钩,它在某处注册了应用程序,然后当它关闭时,应用程序被正确清理了?我不确定在弹簧(3.1)的新版本中是否有必要这样的东西

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

我知道这是一个非常模糊的问题,但是如果有人可以提到某些事情需要做以防止我的应用程序泄漏,我可以自己谷歌搜索。

谢谢!

3 个答案:

答案 0 :(得分:2)

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

我不确定如何正确修复它,但作为一种解决方法,将jboss-logging jar移动到tomcats lib目录似乎有效。

答案 1 :(得分:1)

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

对于我的知识,这是确保内存泄漏(也考虑到perm gen)不会做任何有害事情的唯一方法。

答案 2 :(得分:0)

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

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

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