spring 3.1,hibernate 4,tiles2,tomcat 7 - cleanup(多次部署导致内存泄漏)
spring 3.1,hibernate 4,tiles2,tomcat 7 - cleanup(多次部署导致内存泄漏)
我在使用spring、hibernate和tiles时似乎遇到了内存泄漏的问题。我认为这可能是由于我的应用在部署之间没有自我清理导致的。由于我目前正在学习所有这些框架,所以我经常进行部署和卸载。\n我应该在我的Web应用程序中做哪些清理工作?目前我什么都不做,因为我以为Java会自动进行内存清理,然而我很确定在Spring方面它并没有做到完全,因为Tomcat一直在抱怨permgen内存。\n我对是否需要运行某些方法以保持清洁感到困惑。我读到过一个Spring钩子,在某个地方注册应用程序,然后在关闭应用程序时进行适当的清理?不过我不确定在新版本的Spring(3.1)中是否需要类似的东西。\n例如,Tomcat一直告诉我我没有正确注销JDBC驱动程序(然而我认为如果检测到的话,Tomcat会自动完成这个操作)。\n我知道这是一个非常模糊的问题,但如果有人能提到一些需要做的事情,以防止我的应用程序泄漏,我可以自己搜索一下。\n谢谢!
这个问题的出现原因是在使用Hibernate的项目中出现的。Hibernate为每个使用的域对象生成代理。这些代理保存在Permanent Generation空间中,在应用程序重新启动/重新部署时不会被清理。PermGen空间使用的内存量默认相对较小,所以您可以尝试使用-XX:MaxPermSize Java参数来增加它。这可能会改善在出现内存错误之前的时间,但我不知道这个问题的完全解决方案。您最终将不得不重新启动tomcat本身。
对于jdbc问题,首先如果您手动使用连接,请确保在try catch finally块中正确关闭它。如果您不以这种方式使用连接对象,那么它可能再次与Hibernate有关。
是的,我已将maxpermsize参数增加到256mb。这有助于减少重启之间的时间,但我希望能有一种方式可以避免完全重新启动。另外,关于jdbc问题,我需要进一步研究一下。我对Hibernate不太熟悉,所以我不知道我是否需要自己处理这个问题,或者它是否会自动处理。我假设Hibernate会自动处理所有这些。
无论如何,在部署新版本之前,您都应该尽可能关闭正在运行的tomcat。
(这需要有两个tomcat和故障转移机制,或者您只接受服务停机时间比更新时间长一秒钟。)
据我所知,这是确保内存泄漏(考虑到perm gen)不会造成任何伤害的唯一方法。
原因:
- 多次部署导致内存泄漏
解决方法:
- 在部署新版本之前关闭tomcat
- 使用两个tomcat和故障转移机制
- 接受服务停机时间比更新时间长一秒钟
以上是关于spring 3.1, hibernate 4, tiles2, tomcat 7 - cleanup (multiple deploys causing memory leaks)问题的原因和解决方法。
近期在使用spring 3.1、hibernate 4、tiles2和tomcat 7时,遇到了一个内存泄漏的问题。经过调查发现,问题的出现是因为在hibernate 4.0中引入了jboss-logging作为依赖。具体的问题可以参考链接https://issues.jboss.org/browse/JBLOGGING-66。虽然目前还没有找到完全解决的方法,但是将jboss-logging jar文件移动到tomcat的lib目录中可以暂时解决这个问题。
org.hibernate hibernate-core 4.0.0.Final org.jboss.logging jboss-logging org.jboss.logging jboss-logging 3.1.0.CR2
org.springframework.web.util.Log4jConfigListener log4jConfigLocation /WEB-INF/log4j.xml log4jRefreshInterval 10000
/WEB-INF/tiles.xml org.springframework.web.servlet.view.tiles2.TilesView
org.apache.tomcat tomcat-juli 7.0.76 provided
WEB-INF/web.xml false