在为我的webapp使用spring,hibernate和tiles时,我似乎遇到了内存泄漏问题。我认为这可能是因为我的应用程序在部署之间没有清理。我部署和取消部署很多,因为我目前正在学习所有这些框架。
我应该在Web应用程序中清理什么样的东西?我目前什么也不做,因为我认为Java会自动进行内存清理,但是我很确定它不会在春天做任何事情,因为tomcat一直在抱怨permgen内存。
我很困惑我是否需要运行某些方法以保持清洁。我读到了一个弹簧钩,它在某处注册了应用程序,然后当它关闭时,应用程序被正确清理了?我不确定在弹簧(3.1)的新版本中是否有必要这样的东西
例如,tomcat一直告诉我,我没有正确注销JDBC驱动程序(但我认为tomcat会在检测到时自动执行此操作)。
我知道这是一个非常模糊的问题,但是如果有人可以提到某些事情需要做以防止我的应用程序泄漏,我可以自己谷歌搜索。
谢谢!
答案 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再次相关。